Разработать приложение на C# которое будет работать с аргументами командной строки и выдавать в консольку результат.
Разработка под linux / Создание проекта в dotnet. Подключение CommandLineParser
Создаем проект
И так, теперь, когда мы установили .net, у нас в системе становится доступной утилита dotnet
. Можно ее запустить
dotnet -h
и глянуть что она выдаст, интересует нас больше всего вот эта часть
Где собственно описаны доступные параметры, которые позволяют выполнять разные действия, например, создавать или запускать проект.
Вот и попробуем создать новый проект. Сначала создадим папку под него:
mkdir project07
cd project07
а теперь создадим в папке, новый проект. Для этого надо использовать параметр new
. Глянем какие параметры ему можно передать:
dotnet new --help
Получается, что если написать dotnet new -l
то он выведет список шаблонов приложения.
Помните, когда мы в visual studio создавали проект мы там выбирали консольное или webforms приложение. Вот это оно и есть только в консольном виде. Пробуем:
dotnet new -l
я зелененьким выделил шаблоны консольного приложения и тестов. Мы к ним еще вернемся. Но сейчас для нас более важным является создание Solution, то есть это проект в который может входить несколько приложений. Visual Studio по умолчанию создает Solution. А нужно это для того, чтобы можно было отдельно разрабатывать приложение и отдельно писать тесты.
И так давайте создадим solution.
Пишем команду
можно глянуть что появилось в папке
собственно, там файлик решения.
Теперь будем добавлять в него консольное приложение. Запускаем команды
В результате получим папку с файлом проекта, в которой появилась папка с подпроектом.
Надо теперь эту папку подключить к Solution. Пишем:
то есть папка подключилась, можно еще так посмотреть:
Давайте теперь глянем что у нас в коде программы. Откроем файлик application/Program.cs
в нем всего две строчки, это новый шаблон .net 6, который позволяет писать C# приложения не создавая класса и функции Main
. Это удобно если ваша программа не предполагает использование классов, либо вы как воспитанный человек раскидываете отдельные классы по файлам.
Мы же чтобы не усложнять заменим этот код на стандартный код с функцией Main вот так
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
попробуем запустить приложение, для этого воспользуемся командой dotnet run
и передадим с помощью флага p
приложение которое мы хотим запустить
dotnet run
Ну вроде с проектом разобрались. Теперь разберёмся как подключать сторонние либы.
Подключаем стороннюю библиотечку
Чтобы устанавливать дополнительные пакеты у микрософта есть еще один репозиторий, сделанный специально для разработчиков, в котором лежат разные уже скомпилированные библиотчеки на любой вкус и цвет.
То есть надо вам, например, генерить эксель файлы из приложения. Как это сделать? А вот вы идете на специальный ресурс https://www.nuget.org/packages?q=excel и ищете библиотечку под ваши нужды.
Захотели поработать со звуком, пожалуйста: https://www.nuget.org/packages?q=audio
В общем тьма либ под любую нужду.
Нам надо библиотечку которая будет обрабатывать аргументы командной строки. Одна из самых удобных называется CommandLineParser https://www.nuget.org/packages/CommandLineParser/2.8.0. Если глянуть у нее 34 мильона скачиваний это вам не хухры мухры.
В целом о качестве сторонний библиотечки говорит количество ее использований, как правило, чем больше – тем лучше.
Чтобы узнать какую команду использовать для установки библиотечки надо нажать сюда и скопировать команду
dotnet add package CommandLineParser --version 2.8.0
причем команду надот запускать их того подпроекта к которому вы хотите ее добавить, в нашем случае к подпроекту application.
Так что переходим в папку application
cd application
и запускаем:
если глянуть теперь файл проекта, то мы увидим, что там добавилась ссылка на новый пакет
может возникнуть вопрос, а что-за пакет-то где его искать? Так вот, на самом деле это обыкновенная dll-ка которая лежит в папке ~/.nuget/packages
,
то есть библиотечка уже скомпилирована причем под разные версии .net.
Кстати, если вы забыли, то ~
означает вашу домашнюю папку.
Таким образом ~/.nuget/packages
это своего рода локальное хранилище всех скачанных пакетов и вы можете подключать их к своему проект когда вам удобно без необходимости их повторно качать.
После того как либа подключена к проекту ее можно начинать использовать.
Настраиваем в nano поддержку синтаксиса
Кстати писать в nano на C# сейчас не очень удобно без поддержки синтаксиса. Чтобы ее добавить можно зайти на github в репозиторий https://github.com/scopatz/nanorc и там есть инструкция по установке
запускаем
wget https://raw.githubusercontent.com/scopatz/nanorc/master/install.sh -O- | sh
и получаем
теперь если открыть файлик Program.cs то увидим
и давайте теперь еще настроим nano чтобы он при клику на TAB
вставлял не табуляцию, а 4 пробела.
Для этого надо зайти в настройки nano. Nano хранит настройки в файлике ~/.nanorc, так что открываем его
скролим в файлике в самый низ и добавляем строки
set tabsize 4
set tabstospaces
set autoindent
set linenumbers
Работы с CommandLineParser
Работать с парсером очень легко
using System;
using CommandLine; // подключим либу
namespace application
{
// создаем специальный класс
public class Options {
// в классе на каждый параметр командной строки, создаем свойство
// на свойство навешиваем атрибут Option
[Option('t', "show-two", HelpText="Если флаг указан, выводим по два числа")]
public bool ShowTwo {get; set; }
[Option('c', "count", Required=true)]
public int Count {get; set;}
}
public class Program
{
static void Main(string[] args)
{
// потом пишем такую хитрую конструкцию
Parser.Default.ParseArguments<Options>(args)
.WithParsed<Options>(o => { // в которую передаем лямбду
// вот эта o -- это на самом деле экземпляр класса Options
// cо спарсеными значениями
for(var i=0; i<o.Count; ++i) {
if (o.ShowTwo) {
Console.WriteLine($"{i} {i + 1}");
} else {
Console.WriteLine(i);
}
}
});
}
}
}
давайте попробуем запустить
Благодаря CommandLineParser автоматически создается справка для приложения с описанием всех параметров. Так как у нас параметр c – обязательный, то выводится сообщение что мы не указали count. Как же собственно передать этот параметр?
Так как мы запускаем приложение через утилиту dotnet то для того чтобы передать параметр надо написать
dotnet -- -c 10
проверяем:
Мы в принципе можем вызывать программу и напрямую и тогда не надо писать вот эти --
еще мы можем указывать параметр в виде полного написания (то которое мы указали вторым параметром в option)
ну и очевидно, что можно указывать несколько параметров. Вот так: