MS_CLISystemCommandLine - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒèªäœCUIïŒCLIïŒã®è©±ïŒ
- CLIéçºïŒSharpromptïŒ
- CLIéçºïŒSystem.CommandLineïŒ
èªäœ CUIïŒCLIïŒãéçºããéã«äŸ¿å©ãªã®ã§ã¯ïŒãšã
https://github.com/dotnet/command-line-api/blob/main/docs/History.md
è£è¶³ïŒ
System.CommandLineã®ç«ã¡äœçœ®ãšã泚æãã¹ãçŸæ³ïŒ: æ¬ã©ã€ãã©ãªã¯
**Microsoft å ¬åŒïŒdotnet çµç¹ïŒ**ã§ããã
dotnetCLI èªèº«ã®èšèšææ³ãåæ ãããŠããããäœãæäŸãããã ã»ã³ãã³ãã©ã€ã³åŒæ°ã®ãè§£æã ã»ãã«ãã®ãèªåçæã ã»ã·ã§ã«ã®ãã¿ãè£å®ãã®çæ ã»ãšã©ãŒ ã¡ãã»ãŒãžã®æŽåœ¢ â ãCLI ãšããŠåœç¶åããã¹ããã®ããäžéãé¢åã¿ã âç§»è¡ã¡ã¢ïŒããŒãžã§ã³ã«åŒ·ãäŸåããç¹ã«æ³šæïŒ: æ¬ã©ã€ãã©ãªã¯
é·æã«ããããã¬ãã¥ãŒïŒbetaïŒã®ãŸãŸæäŸããã
API ãäœåºŠãç Žå£çã«å€æŽãããããçµç·¯ã 2019ïœ 2.0.0-beta1 ç³»ãé·æé beta ã®ãŸãŸ 2023é 2.0.0-beta4 ã§å€§ããæŽç ãã®åŸ ããã« API ãç°¡çŽ åïŒHandler ã®æžãæ¹ãå€ãã£ãïŒâ ãå®åã§ã®å¯Ÿå¿ã ã»ãããŒãžã§ã³ãåºå®ããŠäœ¿ããïŒPackageReference ã§æç€ºïŒ ã»Web äžã®ãµã³ãã«ããã©ã® beta çã®ãã®ãããå¿ ã確èªãã â æ¬ããŒãžã®ãµã³ãã«ãåœæã®ãã® ã»æŽæ°ããéã¯ãå¿ ãåäœç¢ºèªããã以éã®åç¯ã§ã¯ãåæã®å å®¹ïŒæŠå¿µïŒã¯çŸåšãéçšãããã
ãã®ãŸãŸæ®ããçŸåšã®æžãæ¹ãè£è¶³ãã圢ããšãã
-
ã³ãã³ãã©ã€ã³ã»ããŒãµãŒ
-
ã³ãã³ã
- ã«ãŒãã»ã³ãã³ã
- ãµãã»ã³ãã³ã
-
ãªãã·ã§ã³
-
ã¹ã¿ã€ã«
ã»POSIXïŒ-XXXïŒ
ã»WindowsïŒ/XXXïŒ -
ãšã€ãªã¢ã¹
ã»POSIXïŒ-v ãš --verboseïŒ
ã»WindowsïŒãšã€ãªã¢ã¹ç¡ãïŒ
-
-
åŒæ°
-
ããªãã¿
ã»ã¹ããŒã¹
ã»ã:ããã=ã -
arity
åŒæ°ã®æå°å€ãšæå€§å€ãèšå®ã§ããã -
ãã³ãã«
ã»ïŒæåã®ãªãã·ã§ã³ã¯ãã³ãã«å¯èœã
ã»ãã³ãã«ããå Žåããã³ãã«å ã®æåŸã®ãªãã·ã§ã³ã«åŒæ°ãé©çšãããã
-
-
ãã€ã³ãã£ã³ã°
- ãã³ãã©èšå®
- åŒæ°ã®ããªããŒã·ã§ã³
- åŒæ°ã®ãã€ã³ãã£ã³ã°
- ã¢ãã«ã»ãã€ã³ãã£ã³ã°
https://github.com/dotnet/command-line-api/blob/main/docs/model-binding.md
-
Ctrl-C
https://github.com/dotnet/command-line-api/blob/main/docs/Process-termination-handling.md -
ã¬ã¹ãã³ã¹ã»ãã¡ã€ã«
ã¬ã¹ãã³ã¹ã»ãã¡ã€ã«ã䜿çšããŠã³ãã³ããæå®ã§ããã
-
è£è¶³ïŒçšèªã®å ·äœåïŒ: äžèЧãç°¡æœãªã®ã§ã
å®éã®ã³ãã³ãã©ã€ã³ã§ã®æå³ã瀺ããŠããããã³ãã³ãïŒãµãã³ãã³ãã dotnet build --configuration Release âââ¬ââ âââ¬ââ ââââââââââ¬âââââââââ ã«ãŒã ãµã ãªãã·ã§ã³ ãarityïŒåŒæ°ã®åæ°ïŒã ExactlyOne ⊠--name foo ïŒå¿ ã 1 ã€ïŒ ZeroOrOne ⊠--verbose ïŒå€ãªãã§ãããïŒ ZeroOrMore ⊠--file a.txt b.txt ïŒ0 å以äžïŒ OneOrMore ⊠å°ãªããšã 1 〠â ã--file ã 3 åãŸã§ããšãã£ãå¶çŽã衚çŸã§ãã â ããã³ãã«ã -a -b -c â -abc ïŒ1 æåãªãã·ã§ã³ããŸãšããïŒ -abc value â c ã« value ãé©çšãããïŒæåŸã®ãªãã·ã§ã³ã«ä»ãïŒ ãããªãã¿ã --name foo / --name:foo / --name=foo ⊠ãã¹ãŠåãã¬ã¹ãã³ã¹ ãã¡ã€ã«ã¯ç¥ãããŠããªãã䟿å©ã§ããã
ãåé¡ã ã³ãã³ãã©ã€ã³é·ã«ã¯ OS ã®äžéãããïŒWindows ã¯çŽ 32,767 æåïŒ â 倧éã®ãã¡ã€ã«ãåŒæ°ã§æž¡ããšè¶ ãã â ãè§£ã åŒæ°ããã¡ã€ã«ã«æžãã@ ã§åç §ãã > myapp @args.rsp args.rsp: --input a.txt --input b.txt --verbose
csc.exeïŒC# ã³ã³ãã€ã©ïŒã MSBuild ãå€ããã䜿ãä»çµã¿ã§ã
System.CommandLineã¯ãããæšæºã§è§£éããã
-
ãã®ä»
-
ãã«ã
-
ãã«ã
> myapp -h > myapp /h > myapp --help > myapp -? > myapp /? -
è§£æãã£ã¬ã¯ãã£ã
æ§æè§£æçµæã衚瀺ããã> myapp [parse] > myapp [parse] ...(ã³ãã³ã)... -
ããŒãžã§ã³
> myapp --version 1.0.0
-
-
Debug ãã£ã¬ã¯ãã£ã
> myapp [debug] ...(ã³ãã³ã)... ã³ã³ã®åŸããããã¬ãã¢ã¿ããããŠãããã° -
ãã€ãã©ã€ã³
- ãã³ãã©ãžã®ã«ãŒãã£ã³ã°ã®åã®
ãã€ãã©ã€ã³ã«åŒã³åºãã远å ã§ããã - ãã£ã¬ã¯ãã£ãã¯ããã®æ©èœã䜿çšããŠããã
- ãã³ãã©ãžã®ã«ãŒãã£ã³ã°ã®åã®
-
-
åè
è£è¶³ïŒãã£ã¬ã¯ãã£ããç§éžïŒ:
[parse]ãš[debug]ã¯
ãã®çš®ã®ã©ã€ãã©ãªã§ã¯çããæ©èœã§ãå®åã§éåžžã«åœ¹ã«ç«ã€ãã[parse] ââ åŒæ°ãã©ãè§£éãããããèŠããâ > myapp [parse] create --name foo -c 3 [ myapp [ create <foo> [ --count <3> ] ] ] â ããªããã®ãªãã·ã§ã³ãå¹ããªãã®ããã ãå®è¡ããã«ã確èªã§ãã â åŒæ°ã®èšèšãæ€èšŒããéã«ã䜿ãã ã[debug] ââ ãããã¬ãã¢ã¿ãããããâ > myapp [debug] create --name foo Attach your debugger to process 12345 â ãCLI ããããã°ããé£ããããè§£æ¶ãã ïŒéåžžãCLI ã¯èµ·åããŠå³å®è¡ãããããã ãããã¬ãä»ããéããªãïŒ â æ¬çªç°å¢ã§åçŸããäžå ·åã®èª¿æ»ã«æçšãã«ãã®èªåçæãéèŠãªäŸ¡å€ã§ããã
ãæã§æžããšå¿ ãé³è åããã ã»ãªãã·ã§ã³ã远å ããã®ã«ãã«ããçŽãå¿ãã ã»æ¢å®å€ãå€ããã®ã«ãã«ããå€ã ãèªåçæãªãã ã»å®çŸ©ãå¯äžã®æ å ±æºïŒsingle source of truthïŒâ ã»ããããããªããã€ãã©ã€ã³ã¯ OWIN /
ASP.NET Core ã®ããã«ãŠã§ã¢ãšåãçºæ³ã§ãã
ïŒåŠçã®ååŸã«å±€ãæãïŒã
ãã°åºåãå®è¡æéã®èšæž¬ãäŸå€ã®æŽåœ¢ãªã©ã
å šã³ãã³ãå ±éã§æããã
匷åã«åä»ãããã Main ã¡ãœããã䜿ã£ãŠã
æ
£ç¿çã«ã³ãã³ãã©ã€ã³ã¢ããªãæ§ç¯ããã
è£è¶³ïŒDragonFruit ã®çºæ³ãšçŸæ³ïŒ: **ãèŠçŽã«ããèšå®ã**ã
æ¥µç«¯ã«æšãé²ãããã®ã§ãçºæ³ãé¢çœãã®ã§è£è¶³ããã// DragonFruitïŒMain ã®ã·ã°ããã£ãããã®ãŸãŸã³ãã³ãã©ã€ã³ä»æ§ã«ãªããâ /// <summary>ãã¡ã€ã«ãåŠçããŸãã</summary> /// <param name="input">å ¥åãã¡ã€ã«</param> /// <param name="verbose">詳现åºå</param> /// <param name="count">ç¹°ãè¿ãåæ°</param> static void Main(FileInfo input, bool verbose = false, int count = 1) { // --input file.txt --verbose --count 3 ãèªåã§è§£æãããŠãã // XML ããã¥ã¡ã³ã ã³ã¡ã³ããããã«ãæã«ãªãã }ãå©ç¹ã ã»èšè¿°éããã»ãŒãŒãã ã»åïŒFileInfoãintãenumïŒããè§£æèŠåãæ±ºãŸã ã»XML ã³ã¡ã³ãããã«ãã«ãªãïŒ ããã¥ã¡ã³ããšå®è£ ããããªã ãéçã ã»ãµãã³ãã³ããäœããªãïŒMain 㯠1 ã€ãããªãïŒ ã»çްããå¶åŸ¡ãã§ããªãïŒãšã€ãªã¢ã¹ãarityãæ€èšŒïŒ â ãåæ©èœã®ããŒã«åããâç§»è¡ã¡ã¢: DragonFruit ã¯çŸåšã»ãŒæŽæ°ãããŠããªãã
åçš®ã®ãèŠçŽããŒã¹ãã®éžæè¢ãšããŠã¯ã
ConsoleAppFrameworkïŒèªäœCUIïŒCLIïŒã®è©±ïŒã
çŸåœ¹ã§ããµãã³ãã³ãã«ã察å¿ããŠããã
-
æ§é åããã端æ«åºåã®ã¬ã³ããªã³ã°
-
ANSI ã®ãµããŒã
-
åè
ç§»è¡ã¡ã¢ïŒRendering ã¯éçºãæ¢ãŸã£ãïŒ:
System.CommandLine.Renderingã¯
å®éšçãªããã±ãŒãžã®ãŸãŸãäºå®äžéçºã忢ããŠããããçŸåšã端æ«ãžã®æç»ãããããªãã ã»ãSpectre.Consoleãâ 衚ã»ããªãŒã»é²æã»è²ã»ããŒã¯ã¢ãã ã»Terminal.Gui âŠ å šç»é¢ TUI ã»èªåã§ ANSI ãšã¹ã±ãŒã ⊠åçŽãªè²ä»ãã ããªãåå// åçŽãªè²ä»ããªãæšæº API ã§è¶³ãã Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("ãšã©ãŒ"); Console.ResetColor(); // ãã ãããªãã€ã¬ã¯ãæã¯è²ãåºããªãé æ ®ãèŠã â if (!Console.IsOutputRedirected && Environment.GetEnvironmentVariable("NO_COLOR") is null) { /* è²ã䜿ã */ }
NO_COLORç°å¢å€æ°ã¯è¿å¹Žåºãå°éãããŠããæ £ç¿ã§ãã
ïŒèªäœCUIïŒCLIïŒã®è©± ã®ãè²ãšè£ 食ã¯ç°å¢ãèŠãŠåããïŒã
Microsoft.Extensions.Hosting ã§ System.CommandLine ã䜿çšããããã®ãµããŒã
è£è¶³ïŒHosting ãšã®çµ±åã®æå³ïŒ: ããã¯
DI ãšèšå®ãšãã°ã CLI ã«ãæã¡èŸŒãããã®ãã®ã§ããã// ãã³ãã©ã®åŒæ°ã«ãDI ç»é²ãããµãŒãã¹ãæ³šå ¥ã§ãã â var builder = Host.CreateApplicationBuilder(); builder.Services.AddSingleton<IOrderService, OrderService>(); builder.Services.AddDbContext<AppDbContext>(...);ããããå¹ãå Žé¢ã ã»CLI ãããWeb ã¢ããªãšåããµãŒãã¹å±€ããåŒã³ãã â äŸïŒ ãããåŠçãããŒã¿ç§»è¡ããŒã«ã管çã³ãã³ã ã»appsettings.json / ç°å¢å€æ°ããèšå®ãèªã¿ãã â [.NET Core ã«ããã DI](MS_DotNetCoreDI) [FaaS config](MS_FaaSConfig) ãšåãä»çµã¿ ã»ILogger ã§ãã°ãåºããã â [.NETã®ãã°](MS_DotNetLogging) â ãWeb / ããã / CLI ã§å®è£ ãå ±æã§ãããâçŸåšã¯
Microsoft.Extensions.HostingãçŽæ¥äœ¿ãã
Worker Serviceãã³ãã¬ãŒãããäœãæ¹ãçŽ çŽãªå Žåãå€ã
ïŒASP.NET ã®ãããžã§ã¯ãã»ãã³ãã¬ãŒãã®å€é·ïŒã
System.CommandLine ã䜿ã£ãŠäœãããã¢ããªã«
ã·ã§ã«ã®è£å®æ©èœãæäŸããã³ãã³ãã©ã€ã³ããŒã«ã
è£è¶³ïŒã¿ãè£å®ã¯ CLI ã®äœ¿ãåæã倧ããå€ããïŒ: å°å³ã ã
å©çšè äœéšã«æãå¹ãæ©èœã§ããããä»çµã¿ã â ã·ã§ã«ïŒPowerShell / bash / zshïŒã«è£å®ã¹ã¯ãªãããç»é² â¡ Tab ãæŒããšãã·ã§ã«ã dotnet-suggest ãåŒã¶ ⢠dotnet-suggest ãã察象ã¢ããªã«åãåãããŠãåè£ãè¿ã â ã¢ããªèªèº«ãåè£ãç¥ã£ãŠããã®ã§ããåžžã«ææ°ãâ# PowerShell ãžã®ç»é²ïŒ$PROFILE ã«æžãïŒ dotnet-suggest register --command-path "C:\tools\myapp.exe"ãè£å®ã®èšèšã ã»ãªãã·ã§ã³åã¯èªåã§è£å®ããã ã»ãå€ã®åè£ãæå®ã§ããã option.AcceptOnlyFromAmong("dev", "stg", "prod"); â --env <Tab> ã§ 3 ã€ãåºã ã»åçãªåè£ïŒDB ããååŸçïŒãèšå®ã§ãããã ãè£å®ã®ãã³ã«å®è¡ããããã®ã§è»œãåŠçã«éã âçŸåšã¯
dotnet-suggestã䜿ããã
åã·ã§ã«åãã®è£å®ã¹ã¯ãªãããçæããæ¹åŒãäžè¬çã§ãã
ïŒmyapp completion powershell > profile.ps1ã®ãããªåœ¢ïŒã
-
https://github.com/dotnet/command-line-api/blob/main/docs/Your-first-app-with-System-CommandLine.md
-
OpenTouryoProject/OpenTouryo
è£è¶³ïŒçŸåšã®æžãæ¹ã®äŸïŒ: ããŒãžã§ã³ã«ãã£ãŠæžãæ¹ãå€ããããã
æŠå¿µãåãã圢ã§ç€ºãïŒ2.0 beta4 系以éã®ã¹ã¿ã€ã«ïŒãusing System.CommandLine; // ãªãã·ã§ã³ãšåŒæ°ãå®çŸ©ãã var fileOption = new Option<FileInfo>("--file", "-f") { Description = "å ¥åãã¡ã€ã«", Required = true, }; var countOption = new Option<int>("--count", "-c") { Description = "ç¹°ãè¿ãåæ°", DefaultValueFactory = _ => 1, }; countOption.Validators.Add(r => // â æ€èšŒãããã«æžã â { if (r.GetValue(countOption) < 1) r.AddError("count 㯠1 以äž"); }); // ãµãã³ãã³ããçµã¿ç«ãŠã var readCommand = new Command("read", "ãã¡ã€ã«ãèªã") { fileOption, countOption }; readCommand.SetAction(parseResult => { var file = parseResult.GetValue(fileOption); var count = parseResult.GetValue(countOption); for (var i = 0; i < count; i++) Console.WriteLine(file!.FullName); return 0; // â çµäºã³ãŒããè¿ã â }); var root = new RootCommand("ãµã³ãã« CLI") { readCommand }; return root.Parse(args).Invoke();ãèšèšäžã®èŠç¹ã ã»ãçµäºã³ãŒããè¿ãã â 0 = æåãé 0 = 倱æ â CI / ã¹ã¯ãªãããã䜿ããã以äžãå¯äžã®æ©æ¢°å¯èªãªçµæ â ã»æ€èšŒã¯ãã³ãã©ã§ã¯ãªããValidator ã«æžãã â å®è¡åã«åŒŸããããšã©ãŒ ã¡ãã»ãŒãžãæŽåœ¢ããã ã»Required / DefaultValue ãå®çŸ©ã«æããã â ãã«ãã«ãèªåçã«åæ ããã
...
...
-
dotnet/command-line-api: Command line parsing, invocation, and rendering of terminal output.
https://github.com/dotnet/command-line-api -
DragonFruit and System.CommandLine is a new way to think about .NET Console apps - Scott Hanselman's Blog
https://www.hanselman.com/blog/dragonfruit-and-systemcommandline-is-a-new-way-to-think-about-net-console-apps -
Getting Started with System.CommandLine â .NET Development Addict
https://dotnetdevaddict.co.za/2020/09/25/getting-started-with-system-commandline/ -
Parsing the command line for your application with System.CommandLine â Bruno Sonnino
https://blogs.msmvps.com/bsonnino/2020/04/12/parsing-the-command-line-for-your-application-with-system-commandline/ -
System.CommandLine å ¥é | Yucchiy's Note
https://blog.yucchiy.com/2021/03/intro-system-commandline/ -
C#ã§ã³ãã³ãã©ã€ã³åŒæ°ãæ±ãæ¹æ³ - åå¿é²
https://kagasu.hatenablog.com/entry/2018/12/17/165431 -
.NET ã§ã® CLI åŠçã©ã€ãã©ãªã«ã€ã㊠- é·²ãå·£
https://tech.blog.aerie.jp/entry/2018/06/22/124630 -
.NET - System.CommandLine ã䜿çšããŠã³ãã³ã ã©ã€ã³ãè§£æãã | Microsoft Docs
https://learn.microsoft.com/ja-jp/archive/msdn-magazine/2019/march/net-parse-the-command-line-with-system-commandline
- System.CommandLine ã®æŠèŠ
https://learn.microsoft.com/ja-jp/dotnet/standard/commandline/ - ã³ãã³ãã©ã€ã³ ã¢ããªã®ãã¥ãŒããªã¢ã«
https://learn.microsoft.com/ja-jp/dotnet/standard/commandline/get-started-tutorial - .NET ããŒã«ã®æŠèŠïŒã°ããŒãã« ããŒã«ïŒ
https://learn.microsoft.com/ja-jp/dotnet/core/tools/global-tools
Tags: ç§»è¡, ã·ã§ã«, ã€ã³ãã©ã¹ãã©ã¯ãã£, .NETéçº