Note
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãµã¤ã³ã¤ã³ã¾ãã¯ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®è¨äºã§ã¯ã System.CommandLine èªèãããã³ãã³ã ã©ã¤ã³æ§æã«ã¤ãã¦èª¬æãã¾ãã ãã®æ
å ±ã¯ã .NET CLI ãå«ã .NET ã³ãã³ã ã©ã¤ã³ ã¢ããªã®ã¦ã¼ã¶ã¼ã¨éçºè
ã®ä¸¡æ¹ã«å½¹ç«ã¡ã¾ãã
ãã¼ã¯ã³
System.CommandLine ã¯ãã³ãã³ã ã©ã¤ã³å
¥å ããã¼ã¯ã³ã«è§£æãã¾ãããã¼ã¯ã³ã¯ãã¹ãã¼ã¹ã§åºåãããæååã§ãã ãã¨ãã°ã次ã®ã³ãã³ã ã©ã¤ã³ãèãã¦ã¿ã¾ãã
dotnet tool install dotnet-suggest --global --verbosity quiet
ãã®å
¥åã¯ã dotnet ã¢ããªã±ã¼ã·ã§ã³ã«ãã£ã¦ãã¼ã¯ã³ toolã installã dotnet-suggestã --globalã --verbosityãããã³ quietã«è§£æããã¾ãã
ãã¼ã¯ã³ã¯ãã³ãã³ãããªãã·ã§ã³ãã¾ãã¯å¼æ°ã¨ãã¦è§£éããã¾ãã å¼ã³åºãããã³ãã³ã ã©ã¤ã³ ã¢ããªã«ãã£ã¦ãæåã®ãã¼ã¯ã³ã®å¾ã®ãã¼ã¯ã³ã®è§£éæ¹æ³ã決ã¾ãã¾ãã æ¬¡ã®è¡¨ã¯ã System.CommandLine åã®ä¾ãè§£éããæ¹æ³ã示ãã¦ãã¾ãã
| ãã¼ã¯ã³ | è§£æçµæ |
|---|---|
tool |
ãµãã³ãã³ã |
install |
ãµãã³ãã³ã |
dotnet-suggest |
install ã³ãã³ãã®å¼æ° |
--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 å®è¡å¯è½ãã¡ã¤ã«ãæå®ãã¾ãã
Command ã¯ä»»æã®ã³ãã³ãã¾ãã¯ãµãã³ãã³ãã®æ±ç¨ã¯ã©ã¹ã§ããã RootCommand ã¯ã¢ããªã±ã¼ã·ã§ã³ã®ã«ã¼ã ã¨ã³ã㪠ãã¤ã³ãç¨ã®ç¹æ®ãªãã¼ã¸ã§ã³ã§ãã
RootCommand ã¯ã Command ã®ãã¹ã¦ã®æ©è½ãç¶æ¿ãã¾ãããã«ã¼ãåºæã®åä½ã¨æ¢å®å¤ ( ãã«ã ãªãã·ã§ã³ã ãã¼ã¸ã§ã³ ãªãã·ã§ã³ã Suggest ãã£ã¬ã¯ãã£ããªã©) ã追å ãã¾ãã
ãµãã³ãã³ã
ã»ã¨ãã©ã®ã³ãã³ã ã©ã¤ã³ ã¢ããªã§ã¯ã åè©ã¨ãå¼ã°ãããµãã³ãã³ã ããµãã¼ãããã¦ãã¾ãã ãã¨ãã°ãdotnet ã³ãã³ãã«ã¯ãrunãå
¥åãã¦å¼ã³åºãdotnet runãµãã³ãã³ããããã¾ãã
ãµãã³ãã³ãã¯ãç¬èªã®ãµãã³ãã³ããæã¤ãã¨ãã§ãã¾ãã
dotnet tool installã§ã¯ãinstallã¯toolã®ãµãã³ãã³ãã§ãã
ãµãã³ãã³ãã¯ã次ã®ä¾ã«ç¤ºãããã«è¿½å ã§ãã¾ãã
RootCommand rootCommand = new();
Command sub1Command = new("sub1", "First-level subcommand");
rootCommand.Subcommands.Add(sub1Command);
Command sub1aCommand = new("sub1a", "Second level subcommand");
sub1Command.Subcommands.Add(sub1aCommand);
ãã®ä¾ã®æãå å´ã®ãµãã³ãã³ãã¯ã次ã®ããã«å¼ã³åºããã¨ãã§ãã¾ãã
myapp sub1 sub1a
ãªãã·ã§ã³
ãªãã·ã§ã³ã¯ãã³ãã³ãã«æ¸¡ããã¨ãã§ããååä»ããã©ã¡ã¼ã¿ã¼ã§ãã
POSIX CLI ã¯é常ããªãã·ã§ã³åã®åã« 2 ã¤ã®ãã¤ãã³ (--) ãä»ãã¾ãã æ¬¡ã®ä¾ã¯ã2 ã¤ã®ãªãã·ã§ã³ã示ãã¦ãã¾ãã
dotnet tool update dotnet-suggest --verbosity quiet --global
^---------^ ^------^
ãã®ä¾ã§ç¤ºãããã«ããªãã·ã§ã³ã®å¤ã¯æç¤ºç (quietã®å ´åã¯--verbosity) ã¾ãã¯æé»ç (--globalã«ç¶ããã®) ã«ãããã¨ãã§ãã¾ãã å¤ãæå®ããã¦ããªããªãã·ã§ã³ã¯ãé常ãã³ãã³ã ã©ã¤ã³ã§ãªãã·ã§ã³ãæå®ããã¦ããå ´åã«æ¢å®ã§ true ããããã¼ã«åãã©ã¡ã¼ã¿ã¼ã§ãã
ä¸é¨ã® Windows ã³ãã³ã ã©ã¤ã³ ã¢ããªã§ã¯ããªãã·ã§ã³åã®å
é ã«ã¹ã©ãã·ã¥ (/) ã使ç¨ãã¦ãªãã·ã§ã³ãèå¥ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
msbuild /version
^------^
System.CommandLine ã§ã¯ãPOSIX 㨠Windows ã®ä¸¡æ¹ã®ãã¬ãã£ãã¯ã¹è¦åããµãã¼ãããã¦ãã¾ãã
ãªãã·ã§ã³ãæ§æããã¨ãã¯ããã¬ãã£ãã¯ã¹ãå«ããªãã·ã§ã³åãæå®ãã¾ãã
Option<int> delayOption = new("--delay", "-d")
{
Description = "An option whose argument is parsed as an int",
DefaultValueFactory = parseResult => 42,
};
Option<string> messageOption = new("--message", "-m")
{
Description = "An option whose argument is parsed as a string"
};
RootCommand rootCommand = new();
rootCommand.Options.Add(delayOption);
rootCommand.Options.Add(messageOption);
ã°ãã¼ãã« ãªãã·ã§ã³
ãªãã·ã§ã³ãã³ãã³ãã«è¿½å ãããã®ãã¹ã¦ã®ãµãã³ãã³ãã«å帰çã«è¿½å ããã«ã¯ã Recursive ããããã£ã true ã«è¨å®ãã¾ãã ããã¯ã詳細度ãåºåå½¢å¼ãæ§æãã¡ã¤ã«ãã¹ãªã©ãã¢ããªã±ã¼ã·ã§ã³å
¨ä½ã«é©ç¨ããããªãã·ã§ã³ã«å½¹ç«ã¡ã¾ãã
次ã®ä¾ã¯ããã¹ã¦ã®ã³ãã³ãã§ä½¿ç¨ã§ããã°ãã¼ãã« ãªãã·ã§ã³ã使ããæ¹æ³ã示ãã¦ãã¾ãã
static void GlobalOptionExample(string[] args)
{
// Create a global option that applies to all commands.
Option<bool> verboseOption = new("--verbose", "-v")
{
Description = "Show verbose output",
Recursive = true
};
RootCommand rootCommand = new("Sample app demonstrating global options");
rootCommand.Options.Add(verboseOption);
Command buildCommand = new("build", "Build the project");
Command testCommand = new("test", "Run tests");
rootCommand.Subcommands.Add(buildCommand);
rootCommand.Subcommands.Add(testCommand);
buildCommand.SetAction(parseResult =>
{
bool isVerbose = parseResult.GetValue(verboseOption);
Console.WriteLine($"Building project... (verbose: {isVerbose})");
});
testCommand.SetAction(parseResult =>
{
bool isVerbose = parseResult.GetValue(verboseOption);
Console.WriteLine($"Running tests... (verbose: {isVerbose})");
});
rootCommand.Parse(args).Invoke();
}
ãã®ä¾ã§ã¯ã --verbose ãªãã·ã§ã³ã¯ã build ã³ãã³ã㨠test ã³ãã³ãã®ä¸¡æ¹ã§ä½¿ç¨ã§ãã¾ããåã³ãã³ãã«åå¥ã«è¿½å ããå¿
è¦ã¯ããã¾ããã
åé·æ§ãªãã·ã§ã³
å¤ãã®ã³ãã³ã ã©ã¤ã³ ã¢ããªã«ã¯ã表示ãããåºåã®éãå¶å¾¡ãã --verbosity ãªãã·ã§ã³ãç¨æããã¦ãã¾ãã
è¨è¨ã¬ã¤ãã³ã¹ã§ã¯ãQ[uiet]ãM[inimal]ãN[ormal]ãD[etailed]ãDiag[nostic]ã® 5 ã¤ã®æ¨æºçãªè©³ç´°ã¬ãã«ãæ¨å¥¨ããã¦ãã¾ãã
次ã®ä¾ã¯ãå®å
¨åã¨çç¥åã®ä¸¡æ¹ãåãå
¥ããã¨ã¤ãªã¢ã¹ (-v) ãæã¤è©³ç´°ãªãã·ã§ã³ãå®è£
ããæ¹æ³ã示ãã¦ãã¾ãã å¤ãæå®ããã« -v ãæå®ããã¨ãæ¢å®ã§è¨ºæè©³ç´°ã¬ãã«ãè¨å®ãããè¨è¨ã¬ã¤ãã³ã¹ã«å¾ãã¾ãã ãã®ä¾ã«ã¯ã-qã®ç縮形ãªãã·ã§ã³ (--verbosity quiet) ãå«ã¾ãã¦ãã¾ãã
static void VerbosityOptionExample(string[] args)
{
// Create verbosity option that accepts full and short names as strings.
// -v without an argument defaults to diagnostic.
Option<string> verbosityOption = new("--verbosity", "-v")
{
Description = "Output verbosity level. Allowed values are q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic].",
Recursive = true,
Arity = ArgumentArity.ZeroOrOne,
DefaultValueFactory = result =>
{
// This runs only when the option isn't specified at all.
// If the option is specified without a value (for example, `-v`),
// DefaultValueFactory isn't called and the value is an empty string,
// which is handled later when mapping to "diagnostic".
return "normal";
}
};
// Add -q as a separate option for quiet verbosity.
Option<bool> quietOption = new("-q")
{
Description = "Set verbosity to quiet (shorthand for --verbosity quiet)",
Recursive = true
};
// Handle both short and long forms.
verbosityOption.Validators.Add(result =>
{
if (result.Tokens.Count == 0)
{
return; // Allow default value.
}
string value = result.Tokens.Single().Value.ToLowerInvariant();
string[] validValues = new[] { "quiet", "q", "minimal", "m", "normal", "n", "detailed", "d", "diagnostic", "diag" };
if (!validValues.Contains(value))
{
result.AddError($"Argument '{value}' not recognized. Must be one of: 'q[uiet]', 'm[inimal]', 'n[ormal]', 'd[etailed]', 'diag[nostic]'");
}
});
RootCommand rootCommand = new("Sample app with verbosity");
rootCommand.Options.Add(verbosityOption);
rootCommand.Options.Add(quietOption);
Command processCommand = new("build", "Build the project");
rootCommand.Subcommands.Add(processCommand);
processCommand.SetAction(parseResult =>
{
string verbosityString;
// Check if -q was specified.
if (parseResult.GetValue(quietOption))
{
verbosityString = "quiet";
}
else
{
verbosityString = parseResult.GetValue(verbosityOption);
// If the option was specified without an argument,
// the value will be empty string.
// Set it to diagnostic as per design guidance.
if (string.IsNullOrEmpty(verbosityString))
{
verbosityString = "diagnostic";
}
}
// Convert string to enum.
VerbosityLevel verbosity = verbosityString switch
{
"quiet" or "q" => VerbosityLevel.Quiet,
"minimal" or "m" => VerbosityLevel.Minimal,
"normal" or "n" => VerbosityLevel.Normal,
"detailed" or "d" => VerbosityLevel.Detailed,
"diagnostic" or "diag" => VerbosityLevel.Diagnostic,
_ => VerbosityLevel.Normal
};
Console.WriteLine($"Verbosity level: {verbosity}");
});
rootCommand.Parse(args).Invoke();
}
enum VerbosityLevel
{
Quiet,
Minimal,
Normal,
Detailed,
Diagnostic
}
次ã®ããããã®ã³ãã³ã ã©ã¤ã³ã§ã¢ããªãå¼ã³åºããã¨ãã§ãã¾ãã
myapp build -q
myapp build -v
myapp build --verbosity minimal
myapp build --verbosity m
myapp build
å¿ é ãªãã·ã§ã³
ä¸é¨ã®ãªãã·ã§ã³ã«ã¯å¿
é ã®å¼æ°ãããã¾ãã ãã¨ãã°ã.NET CLI ã§ã¯ã --output ã«ã¯ãã©ã«ãã¼åã®å¼æ°ãå¿
è¦ã§ãã 弿°ãæå®ããã¦ããªãå ´åãã³ãã³ãã¯å¤±æãã¾ãã ãªãã·ã§ã³ãå¿
é ã«ããã«ã¯ã次ã®ä¾ã«ç¤ºãããã«ã Required ããããã£ã true ã«è¨å®ãã¾ãã
Option<FileInfo> fileOption = new("--output")
{
Required = true
};
å¿ è¦ãªãªãã·ã§ã³ã«æ¢å®å¤ ( DefaultValueFactory ããããã£ã使ç¨ãã¦æå®) ãããå ´åãã³ãã³ã ã©ã¤ã³ã§ãªãã·ã§ã³ãæå®ããå¿ è¦ã¯ããã¾ããã ãã®å ´åãæ¢å®å¤ã¯å¿ è¦ãªãªãã·ã§ã³å¤ãæä¾ãã¾ãã
è°è«
弿°ã¯ãã³ãã³ãã«æ¸¡ããã¨ãã§ããååã®ãªããã©ã¡ã¼ã¿ã¼ã§ãã æ¬¡ã®ä¾ã¯ã build ã³ãã³ãã®å¼æ°ã示ãã¦ãã¾ãã
dotnet build myapp.csproj
^----------^
弿°ãæ§æããã¨ãã¯ã弿°åãæå®ã (è§£æã«ã¯ä½¿ç¨ããã¾ããããååã§è§£æãããå¤ãåå¾ãããããã«ãã表示ãããããããã«ä½¿ç¨ã§ãã¾ã)ãæ¬¡ã®ããã«å ¥åãã¾ãã
Argument<int> delayArgument = new("delay")
{
Description = "An argument that is parsed as an int.",
DefaultValueFactory = parseResult => 42
};
Argument<string> messageArgument = new("message")
{
Description = "An argument that is parsed as a string."
};
RootCommand rootCommand = new();
rootCommand.Arguments.Add(delayArgument);
rootCommand.Arguments.Add(messageArgument);
æ¢å®ã®å¤
弿°ã¨ãªãã·ã§ã³ã®ä¸¡æ¹ã«ã弿°ãæç¤ºçã«æå®ããã¦ããªãå ´åã«é©ç¨ãããæ¢å®å¤ãæå®ã§ãã¾ãã ãã¨ãã°ããªãã·ã§ã³åãã³ãã³ã ã©ã¤ã³ã«ããå ´åãå¤ãã®ãªãã·ã§ã³ã¯æé»çã«ãã¼ã«åãã©ã¡ã¼ã¿ã¼ã§ãããæ¢å®å¤ã¯ true ã§ãã æ¬¡ã®ã³ãã³ã ã©ã¤ã³ã®ä¾ã¯åçã§ãã
dotnet tool update dotnet-suggest --global
^------^
dotnet tool update dotnet-suggest --global true
^-----------^
æ¢å®å¤ãªãã§å®ç¾©ããã弿°ã¯ãå¿ é ã®å¼æ°ã¨ãã¦æ±ããã¾ãã
è§£æã¨ã©ã¼
ãªãã·ã§ã³ã¨å¼æ°ã«ã¯äºæãããåããããå¤ãè§£æã§ããªãå ´åã«ã¨ã©ã¼ãçæããã¾ãã ãã¨ãã°ã silent ã --verbosityã®æå¹ãªå¤ã® 1 ã¤ã§ãªããããæ¬¡ã®ã³ãã³ã ã¨ã©ã¼ãçºçãã¾ãã
dotnet build --verbosity silent
Option<string> verbosityOption = new("--verbosity", "-v")
{
Description = "Set the verbosity level",
};
verbosityOption.AcceptOnlyFromAmong("quiet", "minimal", "normal", "detailed", "diagnostic");
RootCommand rootCommand = new() { verbosityOption };
ParseResult parseResult = rootCommand.Parse(args);
foreach (ParseError parseError in parseResult.Errors)
{
Console.WriteLine(parseError.Message);
}
Argument 'silent' not recognized. Must be one of:
'quiet'
'minimal'
'normal'
'detailed'
'diagnostic'
弿°ã«ã¯ãæå®ã§ããå¤ã®æ°ã«é¢ããæå¾ å¤ãããã¾ãã 弿°ã® ã¢ãªãã£ã«é¢ããã»ã¯ã·ã§ã³ã§ã¯ãä¾ã示ãã¾ãã
ãªãã·ã§ã³ã¨å¼æ°ã®é åº
ã³ãã³ã ã©ã¤ã³ã§ã¯ã弿°ã®åã«ãªãã·ã§ã³ãæå®ãããããªãã·ã§ã³ã®åã«å¼æ°ãæå®ã§ãã¾ãã æ¬¡ã®ã³ãã³ãã¯åçã§ãã
dotnet add package System.CommandLine --no-restore
dotnet add package --no-restore System.CommandLine
ãªãã·ã§ã³ã¯ä»»æã®é åºã§æå®ã§ãã¾ãã æ¬¡ã®ã³ãã³ãã¯åçã§ãã
dotnet add package System.CommandLine --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
è¤æ°ã®å¼æ°ãããå ´åãé åºã¯éè¦ã§ãã æ¬¡ã®ã³ãã³ãã¯åçã§ã¯ããã¾ãããå¤ã®é åºãç°ãªããããçµæãç°ãªãå¯è½æ§ãããã¾ãã
myapp argument1 argument2
myapp argument2 argument1
ã¨ã¤ãªã¢ã¹
POSIX 㨠Windows ã®ä¸¡æ¹ã§ãä¸é¨ã®ã³ãã³ãã¨ãªãã·ã§ã³ã«ã¨ã¤ãªã¢ã¹ãå«ã¾ããã®ãä¸è¬çã§ãã ãããã¯é常ãç°¡åã«å ¥åã§ããçããã©ã¼ã ã§ãã ã¨ã¤ãªã¢ã¹ã¯ã 大æåã¨å°æå ã®åºå¥ãã·ãã¥ã¬ã¼ãããããåèªã®ä»£æ¿ã¹ãã«ããµãã¼ããããããããã«ãä»ã®ç®çã«ã使ç¨ã§ãã¾ãã
POSIX ã®çãå½¢å¼ã§ã¯ãé常ãå é ã«ãã¤ãã³ã 1 ã¤ç¶ãã1 æåãç¶ãã¾ãã æ¬¡ã®ã³ãã³ãã¯åçã§ãã
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 ã§ã¯ãèªåã¨ã¤ãªã¢ã¹ã¯ãµãã¼ãããã¦ãã¾ããã åã¨ã¤ãªã¢ã¹ã¯æç¤ºçã«æå®ããå¿
è¦ãããã¾ãã ã³ãã³ãã¨ãªãã·ã§ã³ã®ä¸¡æ¹ã§ã Aliases ããããã£ãå
¬éããã¾ãã
Option ã«ã¯ããã©ã¡ã¼ã¿ã¼ã¨ãã¦ã¨ã¤ãªã¢ã¹ãåãå
¥ããã³ã³ã¹ãã©ã¯ã¿ã¼ãããããã1 è¡ã«è¤æ°ã®ã¨ã¤ãªã¢ã¹ãå«ããªãã·ã§ã³ãå®ç¾©ã§ãã¾ãã
Option<bool> helpOption = new("--help", ["-h", "/h", "-?", "/?"]);
Command command = new("serialize") { helpOption };
command.Aliases.Add("serialise");
å®ç¾©ãããªãã·ã§ã³ ã¨ã¤ãªã¢ã¹ã®æ°ãæå°éã«æããç¹å®ã®ã¨ã¤ãªã¢ã¹ãç¹ã«å®ç¾©ããªãããã«ãããã¨ããå§ããã¾ãã 詳細ã«ã¤ãã¦ã¯ãã çãå½¢å¼ã®ã¨ã¤ãªã¢ã¹ããåç §ãã¦ãã ããã
大æåå°æåã®åºå¥
ã³ãã³ãåã¨ãªãã·ã§ã³åã¨ã¨ã¤ãªã¢ã¹ã¯ãPOSIX è¦åã«å¾ã£ã¦æ¢å®ã§å¤§æåã¨å°æåãåºå¥ããã System.CommandLine ã¯ãã®è¦åã«å¾ãã¾ãã CLI ã§å¤§æåã¨å°æåãåºå¥ããªãããã«ããã«ã¯ããã¾ãã¾ãªå¤§æåã¨å°æåã使ç¨ãã代æ¿ã®ã¨ã¤ãªã¢ã¹ãå®ç¾©ãã¾ãã ãã¨ãã°ã--additional-probing-path 㯠--Additional-Probing-Path ã --ADDITIONAL-PROBING-PATH ã¨ããã¨ã¤ãªã¢ã¹ãæã¤ãã¨ãã§ãã¾ãã
ä¸é¨ã®ã³ãã³ã ã©ã¤ã³ ãã¼ã«ã§ã¯ã大æåã¨å°æåã®éãã«ãã£ã¦æ©è½ã®éããæå®ããã¾ãã ãã¨ãã°ã git clean -X ã®åä½ã¯ git clean -xã¨ã¯ç°ãªãã¾ãã .NET CLI ã¯ãã¹ã¦å°æåã§ãã
åæåã«åºã¥ããªãã·ã§ã³ã®å¼æ°å¤ã«ã¯ã大æåã¨å°æåã®åºå¥ã¯é©ç¨ããã¾ããã åæååã¯ã大æåã¨å°æåã«é¢ä¿ãªãç §åããã¾ãã
-- ãã¼ã¯ã³
POSIX è¦åã¯ãäºéããã·ã¥ (--) ãã¼ã¯ã³ãã¨ã¹ã±ã¼ã ã¡ã«ããºã ã¨ãã¦è§£éãã¾ãã äºéããã·ã¥ ãã¼ã¯ã³ã«ç¶ããã¹ã¦ã®ãã®ã¯ãã³ãã³ãã®å¼æ°ã¨ãã¦è§£éããã¾ãã ãã®æ©è½ã使ç¨ããã¨ããªãã·ã§ã³ã¨ãã¦è§£éã§ããªããªãããããªãã·ã§ã³ã®ãããªå¼æ°ãéä¿¡ã§ãã¾ãã
myapp ãmessage弿°ãåãåããmessageã®å¤ã--interactiveãããã¨ãã¾ãã æ¬¡ã®ã³ãã³ã ã©ã¤ã³ã§ã¯ãäºæããªãçµæãå¾ããã¾ãã
myapp --interactive
myappã«--interactiveãªãã·ã§ã³ããªãå ´åã--interactive ãã¼ã¯ã³ã¯å¼æ°ã¨ãã¦è§£éããã¾ãã ãã ããã¢ããªã« --interactive ãªãã·ã§ã³ãããå ´åããã®å
¥åã¯ãã®ãªãã·ã§ã³ãåç
§ãã¦ããã¨è§£éããã¾ãã
次ã®ã³ãã³ã ã©ã¤ã³ã§ã¯ãäºéããã·ã¥ ãã¼ã¯ã³ã使ç¨ãã¦ã message 弿°ã®å¤ã "--interactive" ã«è¨å®ãã¾ãã
myapp -- --interactive
^^
System.CommandLine ã§ã¯ããã®äºéããã·ã¥æ©è½ããµãã¼ãããã¦ãã¾ãã
ãªãã·ã§ã³å¼æ°ã®åºåãè¨å·
System.CommandLine ã§ã¯ããªãã·ã§ã³åã¨ãã®å¼æ°ã®éã®åºåãè¨å·ã¨ãã¦ãã¹ãã¼ã¹ '=' ã¾ã㯠':' ã使ç¨ã§ãã¾ãã ãã¨ãã°ã次ã®ã³ãã³ãã¯åçã§ãã
dotnet build -v quiet
dotnet build -v=quiet
dotnet build -v:quiet
POSIX è¦åã使ç¨ããã¨ã1 æåã®ãªãã·ã§ã³ ã¨ã¤ãªã¢ã¹ãæå®ããã¨ãã«åºåãè¨å·ãçç¥ã§ãã¾ãã ãã¨ãã°ã次ã®ã³ãã³ãã¯åçã§ãã
myapp -vquiet
myapp -v quiet
System.CommandLine ã§ã¯ããã®æ§æãæ¢å®ã§ãµãã¼ãããã¦ãã¾ãã
弿°ã®ã¢ãªãã£
ãªãã·ã§ã³ã¾ãã¯ã³ãã³ãã®å¼æ°ã® ã¢ãªã㣠ã¯ããã®ãªãã·ã§ã³ã¾ãã¯ã³ãã³ããæå®ããã¦ããå ´åã«æ¸¡ããã¨ãã§ããå¤ã®æ°ã§ãã
Arity ã¯ã次ã®è¡¨ã«ç¤ºãããã«ãæå°å¤ã¨æå¤§å¤ã§è¡¨ããã¾ãã
| Min | ããã¯ã¹ | æå¹æ§ã®ä¾ | ä¾ |
|---|---|---|---|
| 0 | 0 | æå¹ï¼ | --ãã¡ã¤ã« |
| ç¡å¹ã§ãï¼ | --file a.json | ||
| ç¡å¹ã§ãï¼ | --file a.json --file b.json | ||
| 0 | 1 | æå¹ï¼ | --ãã©ã° |
| æå¹ï¼ | --flag trueï¼ãã©ã°ãtrueã«è¨å®ããï¼ | ||
| æå¹ï¼ | --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 æ§é ä½ããããæ¬¡ã®å¤ãããã¾ãã
- Zero - å¤ã¯è¨±å¯ããã¾ããã
- ZeroOrOne - 1 ã¤ã®å¤ãæå®ãããã¨ããå¤ãæå®ãããã¨ãã§ãã¾ããã
- ExactlyOne - 1 ã¤ã®å¤ãå¿ è¦ã§ãã
- ZeroOrMore - 1 ã¤ã®å¤ãè¤æ°ã®å¤ãã¾ãã¯å¤ãæå®ã§ãã¾ããã
- OneOrMore - è¤æ°ã®å¤ãæã¤ãã¨ãã§ãã¾ããã«ã¯ãå°ãªãã¨ã 1 ã¤ã®å¤ãå¿ è¦ã§ãã
Arity ããããã£ã使ç¨ãã¦ã¢ãªãã£ãæç¤ºçã«è¨å®ã§ãã¾ãããã»ã¨ãã©ã®å ´åã¯ä¸è¦ã§ãã
System.CommandLine ã¯ã弿°ã®åã«åºã¥ãã¦å¼æ°ã®ã¢ãªãã£ãèªåçã«æ±ºå®ãã¾ãã
| 弿°ã¿ã¤ã | æ¢å®ã®ã¢ãªã㣠|
|---|---|
Boolean |
ArgumentArity.ZeroOrOne |
| ã³ã¬ã¯ã·ã§ã³å | ArgumentArity.ZeroOrMore |
| ãã®ä»ãã¹ã¦ | ArgumentArity.ExactlyOne |
ãªãã·ã§ã³ã®ãªã¼ãã¼ã©ã¤ã
ã¢ãªãã£ã®æå¤§å¤ã 1 ã®å ´åã§ãã System.CommandLine ã¯ãªãã·ã§ã³ã®è¤æ°ã®ã¤ã³ã¹ã¿ã³ã¹ãåãå
¥ããããã«æ§æã§ãã¾ãã ãã®å ´åãç¹°ãè¿ããªãã·ã§ã³ã®æå¾ã®ã¤ã³ã¹ã¿ã³ã¹ã¯ã以åã®ã¤ã³ã¹ã¿ã³ã¹ã䏿¸ããã¾ãã æ¬¡ã®ä¾ã§ã¯ãå¤ 2 ã myapp ã³ãã³ãã«æ¸¡ããã¾ãã
myapp --delay 3 --message example --delay 2
è¤æ°ã®å¼æ°
æ¢å®ã§ã¯ãã³ãã³ããå¼ã³åºãã¨ãã«ããªãã·ã§ã³åãç¹°ãè¿ãã¦ãæå¤§ ã¢ãªã㣠ã 1 ãã大ãããªãã·ã§ã³ã«å¯¾ãã¦è¤æ°ã®å¼æ°ãæå®ã§ãã¾ãã
myapp --items one --items two --items three
ãªãã·ã§ã³åãç¹°ãè¿ããã«è¤æ°ã®å¼æ°ã許å¯ããã«ã¯ã AllowMultipleArgumentsPerToken ã true ã«è¨å®ãã¾ãã ãã®è¨å®ã§ã¯ã次ã®ã³ãã³ã ã©ã¤ã³ãå
¥åã§ãã¾ãã
myapp --items one two three
弿°ã®æå¤§ã¢ãªãã£ã 1 ã®å ´åãåãè¨å®ã®å¹æãç°ãªãã¾ãã ãªãã·ã§ã³ãç¹°ãè¿ããã¨ãã§ãã¾ãããè¡ã®æå¾ã®å¤ã®ã¿ãåãåãã¾ãã æ¬¡ã®ä¾ã§ã¯ã three å¤ãã¢ããªã«æ¸¡ããã¾ãã
myapp --item one --item two --item three
ãªãã·ã§ã³ãã³ãã«
POSIX ã§ã¯ãã¹ã¿ãã¯ã¨ãå¼ã°ãã 1 æåã®ãªãã·ã§ã³ã®ãã³ãã«ããµãã¼ããããã¨ããå§ããã¾ãã ãã³ãã«ããããªãã·ã§ã³ã¯ã1 ã¤ã®ãã¤ãã³ãã¬ãã£ãã¯ã¹ã®å¾ã«ä¸ç·ã«æå®ããã 1 æåã®ãªãã·ã§ã³ã¨ã¤ãªã¢ã¹ã§ãã 弿°ãæå®ã§ããã®ã¯æå¾ã®ãªãã·ã§ã³ã ãã§ãã ãã¨ãã°ã次ã®ã³ãã³ã ã©ã¤ã³ã¯åçã§ãã
git clean -f -d -x
git clean -fdx
ãªãã·ã§ã³ ãã³ãã«ã®å¾ã«å¼æ°ãæå®ããã¨ããã³ãã«å ã®æå¾ã®ãªãã·ã§ã³ã«é©ç¨ããã¾ãã æ¬¡ã®ã³ãã³ã ã©ã¤ã³ã¯åçã§ãã
myapp -a -b -c arg
myapp -abc arg
ãã®ä¾ã®ã©ã¡ãã®ããªã¢ã³ãã§ãã弿° arg ã¯ãªãã·ã§ã³ -cã«ã®ã¿é©ç¨ããã¾ãã
ãã¼ã«åã®ãªãã·ã§ã³ (ãã©ã°)
true弿°ãæã¤ãªãã·ã§ã³ã«å¯¾ãã¦falseã¾ãã¯boolãæ¸¡ãããå ´åã¯ãæ³å®ã©ããã«è§£æããã¾ãã ãã ãã弿°ã®åã bool ãªãã·ã§ã³ã§ã¯ãé常ã弿°ãæå®ããå¿
è¦ã¯ããã¾ããã ãã¼ã«åã®ãªãã·ã§ã³ ("flags" ã¨ãå¼ã°ãã¾ã) ã«ã¯ãé常ãã®ZeroOrOneãããã¾ãã ã³ãã³ã ã©ã¤ã³ã«ãªãã·ã§ã³åãåå¨ãããã®å¾ã«å¼æ°ãæå®ããã¦ããªãå ´åãæ¢å®å¤ã¯ true ã«ãªãã¾ãã ã³ãã³ã ã©ã¤ã³å
¥åã«ãªãã·ã§ã³åãæå®ããã¦ããªãã¨ã falseã®å¤ã«ãªãã¾ãã
myapp ã³ãã³ãã§ --interactive ã¨ããååã®ãã¼ã«å¤ãªãã·ã§ã³ã®å¤ãåºåãããå ´åãæ¬¡ã®å
¥åã«ãã£ã¦æ¬¡ã®åºåã使ããã¾ãã
myapp
myapp --interactive
myapp --interactive false
myapp --interactive true
False
True
False
True
ãã¼ã¸ã§ã³ ãªãã·ã§ã³
System.CommandLineä¸ã«æ§ç¯ãããã¢ããªã¯ãroot ã³ãã³ãã§ä½¿ç¨ããã --version ãªãã·ã§ã³ã«å¿ãã¦ããã¼ã¸ã§ã³çªå·ãèªåçã«æä¾ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
dotnet --version
6.0.100
å¿çãã¡ã¤ã«
å¿çãã¡ã¤ã«ã¯ãã³ãã³ã ã©ã¤ã³ ã¢ããªã®ä¸é£ã®ãã¼ã¯ã³ãå«ããã¡ã¤ã«ã§ãã å¿çãã¡ã¤ã«ã¯ã次㮠2 ã¤ã®ã·ããªãªã§å½¹ç«ã¤ System.CommandLine ã®æ©è½ã§ãã
- ã¿ã¼ããã«ã®æåå¶éããé·ãå ¥åãæå®ãã¦ã³ãã³ã ã©ã¤ã³ ã¢ããªãå¼ã³åºãã
- è¡å ¨ä½ãåå ¥åããã«åãã³ãã³ããç¹°ãè¿ãå¼ã³åºãã
å¿çãã¡ã¤ã«ã使ç¨ããã«ã¯ãã³ãã³ãããªãã·ã§ã³ãããã³å¼æ°ãæ¿å
¥ããè¡ã®ä»»æã®å ´æã«ã @ è¨å·ãä»ãããã¡ã¤ã«åãå
¥åãã¾ãã
rsp ãã¡ã¤ã«æ¡å¼µåã¯ä¸è¬çãªè¦åã§ãããä»»æã®ãã¡ã¤ã«æ¡å¼µåã使ç¨ã§ãã¾ãã
次ã®è¡ã¯åçã§ãã
dotnet build --no-restore --output ./build-output/
dotnet @sample1.rsp
dotnet build @sample2.rsp --output ./build-output/
sample1.rsp ã®å 容:
build
--no-restore
--output
./build-output/
sample2.rsp ã®å 容:
--no-restore
å¿çãã¡ã¤ã«å ã®ããã¹ãã®è§£éæ¹æ³ã決å®ããæ§æè¦åãæ¬¡ã«ç¤ºãã¾ãã
- ãã¼ã¯ã³ã¯ã¹ãã¼ã¹ã§åºåããã¾ãã ãã¯ãã! ãå«ãè¡ã¯ãGood and morning! ã¨ãã 2 ã¤ã®ãã¼ã¯ã³ã¨ãã¦æ±ããã¾ãã
- å¼ç¨ç¬¦ã§å²ã¾ããè¤æ°ã®ãã¼ã¯ã³ã¯ã1 ã¤ã®ãã¼ã¯ã³ã¨ãã¦è§£éããã¾ãã "ãã¯ãã!" ãå«ãè¡ã¯ã1 ã¤ã®ãã¼ã¯ã³ã¨ãã¦æ±ããã¾ãããã¯ãããããã¾ã!
-
#è¨å·ã¨è¡æ«ã®éã®ããã¹ãã¯ã³ã¡ã³ãã¨ãã¦æ±ãããç¡è¦ããã¾ãã -
@ãã¬ãã£ãã¯ã¹ãä»ãããã¼ã¯ã³ã¯ã追å ã®å¿çãã¡ã¤ã«ãåç §ã§ãã¾ãã - å¿çãã¡ã¤ã«ã«ã¯è¤æ°è¡ã®ããã¹ããå«ãããã¨ãã§ãã¾ãã è¡ã¯é£çµããããã¼ã¯ã³ã®ã·ã¼ã±ã³ã¹ã¨ãã¦è§£éããã¾ãã
æç¤ºäºé
System.CommandLineã§ã¯ãåã§è¡¨ãããDirectiveã¨å¼ã°ããæ§æè¦ç´ ãå°å
¥ããã¦ãã¾ãã ãã¨ãã°ã [diagram] ãã£ã¬ã¯ãã£ã ã¯çµã¿è¾¼ã¿ãã£ã¬ã¯ãã£ãã§ãã ã¢ããªã®ååã®å¾ã« [diagram] ãå«ããã¨ã System.CommandLine ã³ãã³ã ã©ã¤ã³ ã¢ããªãå¼ã³åºã代ããã«è§£æçµæã®å³ã表示ããã¾ãã
dotnet [diagram] build --no-restore --output ./build-output/
^-----^
[ dotnet [ build [ --no-restore <True> ] [ --output <./build-output/> ] ] ]
ãã£ã¬ã¯ãã£ãã®ç®çã¯ãã³ãã³ãã©ã¤ã³ ã¢ããªéã§é©ç¨ã§ããã¯ãã¹ã«ããæ©è½ãæä¾ãããã¨ã§ãã ãã£ã¬ã¯ãã£ãã¯æ§æçã«ã¢ããªç¬èªã®æ§æã¨ã¯ç°ãªããããã¢ããªéã§é©ç¨ãããæ©è½ãæä¾ã§ãã¾ãã
ãã£ã¬ã¯ãã£ãã¯ãæ¬¡ã®æ§æè¦åã«æºæ ãã¦ããå¿ è¦ãããã¾ãã
- ããã¯ãã³ãã³ã ã©ã¤ã³ä¸ã®ãã¼ã¯ã³ã§ãããã¢ããªã®ååã®å¾ã«ããµãã³ãã³ãã¾ãã¯ãªãã·ã§ã³ã®åã«ç½®ããã¾ãã
- è§ãã£ãã§å²ãã
- ã¹ãã¼ã¹ãå«ã¾ãªãã
èªèã§ããªããã£ã¬ã¯ãã£ãã¯ãè§£æã¨ã©ã¼ãå¼ãèµ·ãããã«ç¡è¦ããã¾ãã
ãã£ã¬ã¯ãã£ãã«ã¯ããã£ã¬ã¯ãã£ãåããã³ãã³ã§åºåããã弿°ãå«ãããã¨ãã§ãã¾ãã
次ã®ãã£ã¬ã¯ãã£ããçµã¿è¾¼ã¾ãã¦ãã¾ãã
[diagram] ãã£ã¬ã¯ãã£ã
ã¦ã¼ã¶ã¼ã¨éçºè
ã®ä¸¡æ¹ããã¢ããªãç¹å®ã®å
¥åãã©ã®ããã«è§£éãããã確èªããã¨ä¾¿å©ãªå ´åãããã¾ãã
System.CommandLine ã¢ããªã®æ¢å®ã®æ©è½ã® 1 ã¤ã¯ãã³ãã³ãå
¥åã®è§£æçµæããã¬ãã¥ã¼ã§ãã[diagram] ãã£ã¬ã¯ãã£ãã§ãã ä¾ãã°æ¬¡ãæãããã¾ãã
myapp [diagram] --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] ãã£ã¬ã¯ãã£ãã使ç¨ããã¨ãæ£ç¢ºãªã³ãã³ããããããªãå ´åã«ã³ãã³ããæ¤ç´¢ã§ãã¾ãã
dotnet [suggest] buil
build
build-server
msbuild