Общие сведения о синтаксисе командной строки для System.CommandLine
Внимание
System.CommandLine
в настоящее время находится в предварительной версии, и эта документация предназначена для версии 2.0 бета-версии 4.
Некоторые сведения относятся к предварительному выпуску продукта, который может быть существенно изменен до его выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В этой статье объясняется синтаксис командной строки, который System.CommandLine
распознает. Эти сведения будут полезны пользователям, а также разработчикам приложений командной строки .NET, включая интерфейс командной строки .NET.
Токены
System.CommandLine
анализирует входные данные командной строки в маркеры, которые являются строками, разделенными пробелами. Например, рассмотрим следующую командную строку:
dotnet tool install dotnet-suggest --global --verbosity quiet
Эти входные данные анализируются приложением dotnet
в маркеры tool
, install
, , dotnet-suggest
, --verbosity
--global
и quiet
.
Маркеры интерпретируются как команды, параметры или аргументы. Вызываемое приложение командной строки определяет, как маркеры после первого интерпретируются. В следующей таблице показано, как System.CommandLine
интерпретирует предыдущий пример:
Маркер | Синтаксический анализ как |
---|---|
tool |
Подкоманда |
install |
Подкоманда |
dotnet-suggest |
Аргумент для команды установки |
--global |
Параметр для команды установки |
--verbosity |
Параметр для команды установки |
quiet |
Аргумент для --verbosity параметра |
Маркер может содержать пробелы, если он заключен в кавычки ("
). Приведем пример:
dotnet tool search "ef migrations add"
Команды
Команда во входных данных командной строки — это маркер, указывающий действие или определяющий группу связанных действий. Например:
- В
dotnet run
—run
это команда, указывающая действие. - В
dotnet tool install
—install
это команда, указывающая действие, иtool
является командой, указывающей группу связанных команд. Существуют другие команды, связанные с инструментами, напримерtool uninstall
,tool list
иtool update
.
Корневые команды
Корневая команда — это команда, указывающая имя исполняемого файла приложения. Например, dotnet
команда задает исполняемый файл dotnet.exe .
Подкоманды
Большинство приложений командной строки поддерживают вложенные команды, также называемые командами. Например, команда dotnet
имеет run
подкоманда, который вызывается путем ввода dotnet run
.
Подкомандам могут иметь собственные подкоманда. В dotnet tool install
, install
является подкоманда tool
.
Параметры
Параметр — это именованный параметр, который можно передать команде. CLIs POSIX обычно префиксирует имя параметра с двумя дефисами (--
). В следующем примере показаны два варианта:
dotnet tool update dotnet-suggest --verbosity quiet --global
^---------^ ^------^
Как показано в этом примере, значение параметра может быть явным (quiet
для --verbosity
) или неявным (ничего не следует --global
). Параметры, не имеющие указанного значения, обычно являются логическими параметрами, которые по умолчанию указываются true
в командной строке.
Для некоторых приложений командной строки Windows можно определить параметр с помощью начальной косой черты (/
) с именем параметра. Например:
msbuild /version
^------^
System.CommandLine
поддерживает соглашения о префиксе POSIX и Windows. При настройке параметра укажите имя параметра, включая префикс.
Аргументы
Аргумент — это значение, переданное параметру или команде. В следующих примерах показан аргумент параметра verbosity
и аргумент для build
команды.
dotnet tool update dotnet-suggest --verbosity quiet --global
^---^
dotnet build myapp.csproj
^----------^
Аргументы могут иметь значения по умолчанию, которые применяются, если аргумент явно не указан. Например, многие параметры являются неявно логическими параметрами с значением по умолчанию true
, если имя параметра находится в командной строке. Ниже приведены примеры командной строки:
dotnet tool update dotnet-suggest --global
^------^
dotnet tool update dotnet-suggest --global true
^-----------^
Некоторые параметры имеют обязательные аргументы. Например, в .NET CLI --output
требуется аргумент имени папки. Если аргумент не указан, команда завершается ошибкой.
Аргументы могут иметь ожидаемые типы и System.CommandLine
отображать сообщение об ошибке, если аргумент не может быть проанализирован в ожидаемый тип. Например, следующие ошибки команды, так как "silent" не является одним из допустимых значений для --verbosity
:
dotnet build --verbosity silent
Cannot parse argument 'silent' for option '-v' as expected type 'Microsoft.DotNet.Cli.VerbosityOptions'. Did you mean one of the following?
Detailed
Diagnostic
Minimal
Normal
Quiet
Аргументы также ожидают, сколько значений можно предоставить. Примеры приведены в разделе об arity аргумента.
Порядок параметров и аргументов
Вы можете указать параметры перед аргументами или аргументами перед параметрами в командной строке. Следующие команды эквивалентны:
dotnet add package System.CommandLine --prerelease
dotnet add package --prerelease System.CommandLine
Параметры можно указать в любом порядке. Следующие команды эквивалентны:
dotnet add package System.CommandLine --prerelease --no-restore --source https://api.nuget.org/v3/index.json
dotnet add package System.CommandLine --source https://api.nuget.org/v3/index.json --no-restore --prerelease
Если имеется несколько аргументов, порядок имеет значение. Следующие команды не обязательно эквивалентны:
myapp argument1 argument2
myapp argument2 argument1
Эти команды передают список с одинаковыми значениями в код обработчика команд, но они отличаются в порядке значений, что может привести к разным результатам.
Aliases
В POSIX и Windows обычно используются некоторые команды и параметры для псевдонимов. Обычно это короткие формы, которые проще вводить. Псевдонимы также можно использовать для других целей, таких как имитация нечувствительности регистра и поддержка альтернативных орфографии слова.
Короткие формы POSIX обычно имеют один ведущий дефис, за которым следует один символ. Следующие команды эквивалентны:
dotnet build --verbosity quiet
dotnet build -v quiet
Стандарт GNU рекомендует автоматические псевдонимы. То есть можно ввести любую часть команды длинной формы или имени параметра, и она будет принята. Это поведение приведет к эквиваленту следующих команд:
dotnet publish --output ./publish
dotnet publish --outpu ./publish
dotnet publish --outp ./publish
dotnet publish --out ./publish
dotnet publish --ou ./publish
dotnet publish --o ./publish
System.CommandLine
не поддерживает автоматические псевдонимы.
Учет регистра
Имена команд и псевдонимов по умолчанию чувствительны к регистру в соответствии с соглашением POSIX и System.CommandLine
соответствуют этому соглашению. Если вы хотите, чтобы интерфейс командной строки не учитывает регистр, определите псевдонимы для различных вариантов регистра. Например, --additional-probing-path
может иметь псевдонимы --Additional-Probing-Path
и --ADDITIONAL-PROBING-PATH
.
В некоторых средствах командной строки разница в регистре определяет разницу в функции. Например, git clean -X
поведение отличается от git clean -x
поведения. Интерфейс командной строки .NET — это все строчные регистры.
Конфиденциальность регистра не применяется к значениям аргументов для параметров, основанных на перечислениях. Имена перечислений совпадают независимо от регистра.
Маркер --
Соглашение POSIX интерпретирует маркер двойного дефиса (--
) в качестве механизма escape-отображения. Все, что следует маркеру двойного дефиса, интерпретируется как аргументы для команды. Эту функцию можно использовать для отправки аргументов, которые выглядят как параметры, так как они не интерпретируются как параметры.
Предположим , что myapp принимает message
аргумент, и вы хотите, чтобы значение message
было --interactive
. Следующая командная строка может дать непредвиденные результаты.
myapp --interactive
Если myapp
у него нет --interactive
параметра, --interactive
маркер интерпретируется как аргумент. Но если у приложения есть --interactive
параметр, этот вход будет интерпретирован как ссылающийся на этот параметр.
В следующей командной строке используется маркер двойного дефиса для задания значения аргумента message
"--interactive":
myapp -- --interactive
^^
System.CommandLine
поддерживает эту функцию двойного дефиса.
Разделители аргументов option-argument
System.CommandLine
позволяет использовать пробел, "=" или ":" в качестве разделителя между именем параметра и его аргументом. Например, следующие команды эквивалентны:
dotnet build -v quiet
dotnet build -v=quiet
dotnet build -v:quiet
Соглашение POSIX позволяет опустить разделитель при указании псевдонима однозначного параметра. Например, следующие команды эквивалентны:
myapp -vquiet
myapp -v quiet
System.CommandLine поддерживает этот синтаксис по умолчанию.
Arity аргумента
Arity аргумента параметра или команды — это количество значений, которые можно передать, если указан этот параметр или команда.
Arity выражается с минимальным значением и максимальным значением, как показано в следующей таблице:
Min | Max | Пример допустимости | Пример |
---|---|---|---|
0 | 0 | Действительны: | --Файл |
Недопустимое. | --file a.json | ||
Недопустимое. | --file a.json --file b.json | ||
0 | 1 | Действительны: | --Флаг |
Действительны: | --flag true | ||
Действительны: | --flag false | ||
Недопустимое. | --flag false --flag false --flag false | ||
1 | 1 | Действительны: | --file a.json |
Недопустимое. | --Файл | ||
Недопустимое. | --file a.json --file b.json | ||
0 | n | Действительны: | --Файл |
Действительны: | --file a.json | ||
Действительны: | --file a.json --file b.json | ||
1 | n | Действительны: | --file a.json |
Действительны: | --file a.json b.json | ||
Недопустимое. | --Файл |
System.CommandLine
имеет структуру ArgumentArity для определения arity со следующими значениями:
- Zero — значения не разрешены.
- ZeroOrOne — Может иметь одно значение, может не иметь значений.
- ExactlyOne — должно иметь одно значение.
- ZeroOrMore — может иметь одно значение, несколько значений или нет значений.
- OneOrMore — Может иметь несколько значений, должно иметь по крайней мере одно значение.
Arity часто можно вывести из типа. Например, параметр int
имеет arity , и List<int>
параметр имеет arity ExactlyOne
OneOrMore
.
Переопределения параметров
Если максимальное значение arity равно 1, System.CommandLine
можно настроить для принятия нескольких экземпляров параметра. В этом случае последний экземпляр повторяющегося параметра перезаписывает все предыдущие экземпляры. В следующем примере значение 2 будет передано команде myapp
.
myapp --delay 3 --message example --delay 2
Несколько аргументов
Если максимальное значение arity больше одного, System.CommandLine
можно настроить для принятия нескольких аргументов для одного параметра без повторения имени параметра.
В следующем примере список, переданный команде myapp
, будет содержать "a", "b", "c" и "d":
myapp --list a b c --list d
Объединение параметров
POSIX рекомендует поддерживать объединение однозначных параметров, также известных как стек. Пакетные параметры — это псевдонимы одного символа, указанные вместе после одного префикса дефиса. Только последний параметр может указать аргумент. Например, следующие командные строки эквивалентны:
git clean -f -d -x
git clean -fdx
Если аргумент предоставляется после пакета параметров, он применяется к последнему параметру в пакете. Следующие строки команды являются эквивалентными.
myapp -a -b -c arg
myapp -abc arg
В обоих вариантах в этом примере аргумент arg
будет применяться только к параметру -c
.
Логические параметры (флаги)
Если true
или false
передается для параметра с аргументом bool
, он анализируется должным образом. Но параметр, тип bool
аргумента которого обычно не требует указания аргумента. Логические параметры, иногда называемые "флагами", обычно имеют логическое значениеZeroOrOne. Наличие имени параметра в командной строке без аргументов, приводит к значению true
по умолчанию. Отсутствие имени параметра во входных данных командной строки приводит к значению false
. myapp
Если команда выводит значение логического параметра с именем--interactive
, то следующие входные данные создают следующие выходные данные:
myapp
myapp --interactive
myapp --interactive false
myapp --interactive true
False
True
False
True
Параметр --help
Приложения командной строки обычно предоставляют возможность отображения краткого описания доступных команд, параметров и аргументов. System.CommandLine
автоматически создает выходные данные справки. Например:
dotnet list --help
Description:
List references or packages of a .NET project.
Usage:
dotnet [options] list [<PROJECT | SOLUTION>] [command]
Arguments:
<PROJECT | SOLUTION> The project or solution file to operate on. If a file is not specified, the command will search the current directory for one.
Options:
-?, -h, --help Show command line help.
Commands:
package List all package references of the project or solution.
reference List all project-to-project references of the project.
Пользователи приложений могут привыкнуть к различным способам запроса справки на разных платформах, поэтому приложения, созданные на System.CommandLine
основе множества способов запроса справки. Следующие команды эквивалентны:
dotnet --help
dotnet -h
dotnet /h
dotnet -?
dotnet /?
Выходные данные справки не обязательно отображают все доступные команды, аргументы и параметры. Некоторые из них могут быть скрыты, что означает, что они не отображаются в выходных данных справки, но их можно указать в командной строке.
Параметр --version
Приложения, созданные System.CommandLine
на основе автоматического предоставления номера версии в ответ на --version
параметр, используемый с корневой командой. Например:
dotnet --version
6.0.100
Файлы ответов
Файл ответа — это файл, содержащий набор маркеров для приложения командной строки. Файлы ответов — это функция System.CommandLine
, которая полезна в двух сценариях:
- Чтобы вызвать приложение командной строки, указав входные данные, превышающие предел символа терминала.
- Для многократного вызова одной и той же команды без повторной повторной отправки всей строки.
Чтобы использовать файл ответа, введите имя файла, префиксированного @
знаком, где бы ни находилась строка, в которую нужно вставить команды, параметры и аргументы. Расширение RSP-файла является общим соглашением, но вы можете использовать любое расширение файла.
Следующие строки эквивалентны:
dotnet build --no-restore --output ./build-output/
dotnet @sample1.rsp
dotnet build @sample2.rsp --output ./build-output/
Содержимое примера1.rsp:
build
--no-restore
--output
./build-output/
Содержимое примера2.rsp:
--no-restore
Ниже приведены правила синтаксиса, определяющие интерпретацию текста в файле ответа:
- Маркеры разделены пробелами. Строка, содержащая доброе утро! рассматривается как два маркера, Доброе и утро!.
- Несколько маркеров, заключенных в кавычки, интерпретируются как один маркер. Строка, содержащая "Доброе утро!" рассматривается как один маркер, Доброе утро!.
- Любой текст между символом
#
и концом строки рассматривается как комментарий и игнорируется. - Маркеры, префиксированные с
@
помощью дополнительных файлов ответов, могут ссылаться на дополнительные файлы ответа. - Файл ответа может содержать несколько строк текста. Строки объединяются и интерпретируются как последовательность маркеров.
Директивы
System.CommandLine
представляет синтаксический элемент, называемый директивой. Директива [parse]
является примером. При включении [parse]
после имени System.CommandLine
приложения отображается схема результата синтаксического анализа вместо вызова приложения командной строки:
dotnet [parse] build --no-restore --output ./build-output/
^-----^
[ dotnet [ build [ --no-restore <True> ] [ --output <./build-output/> ] ] ]
Цель директив — обеспечить кроссрезвную функциональность, которая может применяться в приложениях командной строки. Так как директивы синтаксически отличаются от собственного синтаксиса приложения, они могут предоставлять функциональные возможности, которые применяются в приложениях.
Директива должна соответствовать следующим правилам синтаксиса:
- Это токен в командной строке, которая поступает после имени приложения, но до любых вложенных команд или параметров.
- Он заключен в квадратные скобки.
- Он не содержит пробелов.
Нераспознанная директива игнорируется без возникновения ошибки синтаксического анализа.
Директива может включать аргумент, разделенный именем директивы двоеточием.
Встроены следующие директивы:
директиву [parse]
Пользователи и разработчики могут оказаться полезными для просмотра того, как приложение будет интерпретировать заданные входные данные. Одной из функций System.CommandLine
по умолчанию приложения является [parse]
директива, которая позволяет предварительно просмотреть результат анализа входных данных команды. Например:
myapp [parse] --delay not-an-int --interactive --file filename.txt extra
![ myapp [ --delay !<not-an-int> ] [ --interactive <True> ] [ --file <filename.txt> ] *[ --fgcolor <White> ] ] ???--> extra
В предыдущем примере:
- Команда (
myapp
), ее дочерние параметры и аргументы для этих параметров группируются с помощью квадратных квадратных скобок. - Для результата
[ --delay !<not-an-int> ]
!
параметра указывает ошибку синтаксического анализа. Значениеnot-an-int
параметраint
невозможно проанализировать с ожидаемым типом. Ошибка также помечается!
перед командой, содержащей ошибку:![ myapp...
- Для результата
*[ --fgcolor <White> ]
параметра параметр не был указан в командной строке, поэтому использовался настроенный по умолчанию параметр.White
— это эффективное значение для этого параметра. Звездочка указывает, что значение по умолчанию. ???-->
указывает на входные данные, которые не соответствовали ни одной из команд или параметров приложения.
директиву [suggest]
Директива [suggest]
позволяет искать команды, если вы не знаете точной команды.
dotnet [suggest] buil
build
build-server
msbuild
Руководство по проектированию
В следующих разделах приведены рекомендации, которые рекомендуется следовать при разработке интерфейса командной строки. Думайте о том, что приложение ожидает в командной строке, как и то, что ожидает сервер REST API в URL-адресе. Согласованные правила rest API — это то, что делает их доступными для разработчиков клиентских приложений. Таким же образом пользователи приложений командной строки будут иметь лучший интерфейс, если дизайн ИНТЕРФЕЙСА командной строки соответствует общим шаблонам.
После создания интерфейса командной строки трудно измениться, особенно если пользователи использовали интерфейс командной строки в сценариях, которые они ожидают продолжать работать. Здесь были разработаны рекомендации после .NET CLI, и он не всегда следует этим рекомендациям. Мы обновляем интерфейс командной строки .NET, где это можно сделать, не внося критические изменения. Примером этой работы является новый дизайн dotnet new
в .NET 7.
Команды и вложенные команды
Если команда имеет подкоманда, команда должна функционировать как область или идентификатор группировки для вложенных команд, а не указывать действие. При вызове приложения укажите команду группирования и одну из ее подкомандах. Например, попробуйте выполнить dotnet tool
и вы получите сообщение об ошибке, так как tool
команда определяет только группу вложенных команд, связанных с инструментом, например install
и list
. Вы можете запустить dotnet tool install
, но dotnet tool
само по себе будет неполным.
Одним из способов определения областей, помогающих пользователям, является организация выходных данных справки.
В интерфейсе командной строки часто существует неявная область. Например, в .NET CLI неявная область — это проект, а в интерфейсе командной строки Docker — образ. В результате можно использовать dotnet build
без включения области. Рассмотрите, имеет ли интерфейс командной строки неявную область. Если это делается, рассмотрите, следует ли разрешить пользователю дополнительно включить или опустить его как в docker build
и docker image build
. Если вы при необходимости разрешаете вводить неявную область пользователем, вы также автоматически можете получить справку и завершение вкладок для этой группировки команд. Укажите необязательное использование неявной группы, определив две команды, которые выполняют одну и ту же операцию.
Параметры в качестве параметров
Параметры должны предоставлять параметры командам, а не указывать сами действия. Это рекомендуемый принцип проектирования, хотя он не всегда следует System.CommandLine
(--help
отображает сведения о справке).
Псевдонимы коротких форм
Как правило, рекомендуется свести к минимуму количество заданных псевдонимов параметра short-form.
В частности, избегайте использования любого из следующих псевдонимов, отличных от общего использования в .NET CLI и других приложениях командной строки .NET:
-i
для--interactive
.Этот параметр сигнализирует пользователю о том, что им может быть предложено ввести входные данные на вопросы, необходимые команде. Например, запрос имени пользователя. Интерфейс командной строки может использоваться в сценариях, поэтому используйте осторожность при появлении запроса пользователей, которые не указали этот параметр.
-o
для--output
.Некоторые команды создают файлы в результате их выполнения. Этот параметр следует использовать для определения расположения этих файлов. В случаях, когда создается один файл, этот параметр должен быть путь к файлу. В случаях, когда создается множество файлов, этот параметр должен быть путем к каталогу.
-v
для--verbosity
.Команды часто предоставляют выходные данные пользователю в консоли; этот параметр используется для указания объема выходных данных, отправляемых пользователем. Дополнительные сведения см. в разделе "Вариант
--verbosity
" далее в этой статье.
Существуют также некоторые псевдонимы с общим использованием, ограниченными интерфейсом командной строки .NET. Эти псевдонимы можно использовать для других вариантов в приложениях, но помните о возможности путаницы.
-c
для--configuration
Этот параметр часто ссылается на именованную конфигурацию сборки, например
Debug
илиRelease
. Вы можете использовать любое имя, которое требуется для конфигурации, но большинство средств ожидают одно из них. Этот параметр часто используется для настройки других свойств таким образом, что имеет смысл для этой конфигурации, например при созданииDebug
конфигурации меньше кода. Рассмотрите этот параметр, если команда имеет разные режимы работы.-f
для--framework
Этот параметр используется для выбора одного моникера Целевой платформы (TFM), поэтому если приложение CLI имеет разное поведение в зависимости от выбранного TFM, следует поддерживать этот флаг.
-p
для--property
Если приложение в конечном итоге вызывает MSBuild, пользователю часто потребуется настроить этот вызов каким-то образом. Этот параметр позволяет предоставлять свойства MSBuild в командной строке и передавать их в базовый вызов MSBuild. Если приложение не использует MSBuild, но требует набора пар "ключ-значение", рекомендуется использовать это же имя параметра, чтобы воспользоваться преимуществами ожиданий пользователей.
-r
для--runtime
Если приложение может работать в разных средах выполнения или имеет логику, зависящей от среды выполнения, рассмотрите возможность поддержки этого параметра в качестве способа указания идентификатора среды выполнения. Если приложение поддерживает --runtime, рассмотрите возможность поддержки
--os
, а--arch
также. Эти параметры позволяют указывать только части ОС или архитектуры RID, оставляя часть, не указанную на текущей платформе. Дополнительные сведения см. в разделе dotnet publish.
Краткие имена
Введите имена для команд, параметров и аргументов как можно короче и легко орфографировать. Например, если class
достаточно ясно, не выполните команду classification
.
Строчные имена
Определите имена только в нижнем регистре, кроме псевдонимов верхнего регистра, чтобы сделать команды или варианты нечувствительными.
Имена регистров Kebab
Используйте кебаб случай , чтобы различать слова. Например, --additional-probing-path
.
Преобразование во множественную форму
В приложении должны быть согласованы в плюрализации. Например, не смешивайте многократные и сингулярные имена для параметров, которые могут иметь несколько значений (максимальное число arity больше одного):
Имена параметров | Согласованность |
---|---|
--additional-probing-paths и --sources . |
✔️ |
--additional-probing-path и --source . |
✔️ |
--additional-probing-paths и --source |
❌ |
--additional-probing-path и --sources |
❌ |
Глаголы и существительные
Используйте команды, а не существительные для команд, ссылающихся на действия (без вложенных команд), например: dotnet workload remove
, а не dotnet workload removal
. И используйте существительные, а не глаголы для параметров, например: --configuration
, а не --configure
.
Параметр --verbosity
System.CommandLine
Приложения обычно предлагают параметр, указывающий --verbosity
, сколько выходных данных отправляется в консоль. Ниже приведены стандартные пять параметров:
Q[uiet]
M[inimal]
N[ormal]
D[etailed]
Diag[nostic]
Это стандартные имена, но существующие приложения иногда используются Silent
вместо Quiet
и Trace
, Debug
или Verbose
вместо Diagnostic
них.
Каждое приложение определяет собственные критерии, определяющие, что отображается на каждом уровне. Как правило, приложению требуется только три уровня:
- Тихий NaN
- Обычная
- Диагностика
Если приложению не требуется пять разных уровней, параметр по-прежнему должен определять те же пять параметров. В этом случае Minimal
и Normal
будет производить те же выходные данные, а Diagnostic
Detailed
также будет таким же. Это позволяет пользователям просто вводить знакомые им сведения, и лучше всего использовать подходящие варианты.
Ожидание Quiet
заключается в том, что выходные данные не отображаются в консоли. Однако если приложение предлагает интерактивный режим, приложение должно сделать одно из следующих вариантов:
- Отображение запросов на входные данные при
--interactive
указании, даже если--verbosity
оно указаноQuiet
. - Запретить использование
--verbosity Quiet
и--interactive
вместе.
В противном случае приложение будет ожидать входных данных, не сообщая пользователю, что он ожидает. Появится, что приложение заморозится, и пользователь не будет иметь представления о том, что приложение ожидает входных данных.
Если вы определяете псевдонимы, используйте -v
его --verbosity
и не делаете -v
без аргумента псевдонимом.--verbosity Diagnostic
Используется -q
для --verbosity Quiet
.
Соглашения .NET CLI и POSIX
Интерфейс командной строки .NET не соответствует всем соглашениям POSIX.
Двойной дефис
Несколько команд в .NET CLI имеют специальную реализацию маркера двойного дефиса. В случае dotnet run
с маркерами, dotnet watch
dotnet tool run
следующими--
, передаются в приложение, которое выполняется командой. Например:
dotnet run --project ./myapp.csproj -- --message "Hello world!"
^^
В этом примере --project
параметр передается dotnet run
в команду, а --message
параметр с его аргументом передается в качестве параметра командной строки в myapp при запуске.
Маркер --
не всегда требуется для передачи параметров в приложение, которое выполняется с помощью dotnet run
. Без dotnet run
двойного дефиса команда автоматически передается в приложение, выполняющее любые параметры, которые не распознаются как применение к dotnet run
себе или к MSBuild. Поэтому следующие командные строки эквивалентны, так как dotnet run
не распознает аргументы и параметры:
dotnet run -- quotes read --delay 0 --fg-color red
dotnet run quotes read --delay 0 --fg-color red
Пропуск разделителя параметра к аргументам
Интерфейс командной строки .NET не поддерживает соглашение POSIX, которое позволяет опустить разделитель при указании псевдонима однозначного параметра.
Несколько аргументов без повторения имени параметра
Интерфейс командной строки .NET не принимает несколько аргументов для одного параметра, не повторяя имя параметра.
Логические параметры
В .NET CLI некоторые логические параметры приводят к тому же поведению при передаче false
, что и при передаче true
. Это поведение приводит к тому, что код .NET CLI, реализующий параметр только проверка для наличия или отсутствия параметра, игнорируя значение. Примером является --no-restore
dotnet build
команда. Передача no-restore false
и операция восстановления будет пропущена так же, как при указании no-restore true
или no-restore
.
Кебаб случай
В некоторых случаях интерфейс командной строки .NET не использует кебаб для имен команд, параметров или аргументов. Например, есть параметр .NET CLI, который называется --additionalprobingpath
вместо --additional-probing-path
.