<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用 CliWrap 讓C#中的命令行交互舉重若輕

          共 2500字,需瀏覽 5分鐘

           ·

          2022-02-22 16:09


          在代碼中進(jìn)行命令行交互是一個(gè)很常見(jiàn)的場(chǎng)景, 特別是在一些CI CD 自動(dòng)化流程中, 在這之前我們會(huì)使用?System.Diagnostics.Process?API, 現(xiàn)在有一個(gè)更靈活的工具 CliWarp, 這是一個(gè)在 .NET 平臺(tái)使用的命令行交互工具庫(kù), 通過(guò)在C# 中使用 Fluent 的API, 讓命令行交互舉重若輕。


          https://github.com/Tyrrrz/CliWrap


          主要特性如下:


          ?基于?System.Diagnostics.Process
          ?簡(jiǎn)單, 流暢的 API 設(shè)計(jì)
          ?靈活的支持管道模式
          ?安全異步并且支持 cancellation API
          ?跨平臺(tái), 可在 Windows、Linux 和 macOS 使用
          ?支持 .NET Standard 2.0+、.NET Core 3.0+、.NET Framework 4.6.1+


          和 shell 是類(lèi)似的,CliWrap 的基本工作單元是一個(gè)?command?, 首先會(huì)執(zhí)行 Cli.Wrap(...) 創(chuàng)建 command, 參數(shù)是可執(zhí)行文件的路徑, 然后通過(guò) fluent api 配置, 最后調(diào)用?ExecuteAsync?運(yùn)行命令,如下:


          using CliWrap;using CliWrap.Buffered;var result = await Cli.Wrap("path/to/exe")      //....    .ExecuteBufferedAsync(); 


          配置參數(shù)


          var cmd = Cli.Wrap("git")    .WithArguments("commit -m \"my commit\"");


          var cmd = Cli.Wrap("git")    .WithArguments(new[] {"commit", "-m", "my commit"});


          var cmd = Cli.Wrap("git")    .WithArguments(args => args        .Add("clone")        .Add("https://github.com/Tyrrrz/CliWrap")        .Add("--depth")        .Add(20));  


          配置工作目錄


          默認(rèn)是當(dāng)前目錄, 你也可以指定文件夾的相對(duì)路徑和絕對(duì)路徑


          var cmd = Cli.Wrap("git")    .WithWorkingDirectory("c:/projects/my project/");


          配置環(huán)境變量


          var cmd = Cli.Wrap("git")    .WithEnvironmentVariables(env => env        .Set("GIT_AUTHOR_NAME", "John")        .Set("GIT_AUTHOR_EMAIL", "[email protected]"));


          超時(shí)和取消


          using var cts = new CancellationTokenSource();  cts.CancelAfter(TimeSpan.FromSeconds(10));var result = await Cli.Wrap("path/to/exe").ExecuteAsync(cts.Token);


          基于拉取的事件流


          除了執(zhí)行命令之外,CliWrap 還支持事件流模型, 可以訂閱相關(guān)的事件回調(diào)。


          ?StartedCommandEvent -- 僅接收一次,當(dāng)命令開(kāi)始執(zhí)行時(shí)(包含 process ID)?StandardOutputCommandEvent -- 每次底層進(jìn)程向輸出流寫(xiě)入新行時(shí)收到(包含文本作為字符串)?StandardErrorCommandEvent -- 每次底層進(jìn)程向錯(cuò)誤流寫(xiě)入新行時(shí)收到(包含文本作為字符串)?ExitedCommandEvent -- 僅接收一次,當(dāng)命令完成執(zhí)行時(shí)(包含 exit code)


          using CliWrap;using CliWrap.EventStream;var cmd = Cli.Wrap("foo").WithArguments("bar");await foreach (var cmdEvent in cmd.ListenAsync()){    switch (cmdEvent)    {        case StartedCommandEvent started:            _output.WriteLine($"Process started; ID: {started.ProcessId}");            break;        case StandardOutputCommandEvent stdOut:            _output.WriteLine($"Out> {stdOut.Text}");            break;        case StandardErrorCommandEvent stdErr:            _output.WriteLine($"Err> {stdErr.Text}");            break;        case ExitedCommandEvent exited:            _output.WriteLine($"Process exited; Code: {exited.ExitCode}");            break;    }}


          輸出結(jié)果如下:



          希望對(duì)您有用!?

          https://github.com/Tyrrrz/CliWrap



          瀏覽 71
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩蜜臀电影二区 | 黄色级片网站视频 | 亚洲欧洲中文日韩免费视频一区二区 | 黄色大片免费网站 | 国产精品宾馆在线精品酒店 |