zoukankan      html  css  js  c++  java
  • 使用 CliWrap 让C#中的命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliWarp, 这是一个在 .NET 平台使用的命令行交互工具库, 通过在C# 中使用 Fluent 的API, 让命令行交互举重若轻。

    https://github.com/Tyrrrz/CliWrap

    主要特性如下:

    • 基于 System.Diagnostics.Process

    • 简单, 流畅的 API 设计

    • 灵活的支持管道模式

    • 安全异步并且支持 cancellation API

    • 跨平台, 可在 Windows、Linux 和 macOS 使用

    • 支持 .NET Standard 2.0+、.NET Core 3.0+、.NET Framework 4.6.1+

    和 shell 是类似的,CliWrap 的基本工作单元是一个 command , 首先会执行 Cli.Wrap(...) 创建 command, 参数是可执行文件的路径, 然后通过 fluent api 配置, 最后调用 ExecuteAsync 运行命令,如下:

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

    配置参数

    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));  
    
    

    配置工作目录

    默认是当前目录, 你也可以指定文件夹的相对路径和绝对路径

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

    配置环境变量

    var cmd = Cli.Wrap("git")
        .WithEnvironmentVariables(env => env
            .Set("GIT_AUTHOR_NAME", "John")
            .Set("GIT_AUTHOR_EMAIL", "john@email.com"));
    

    超时和取消

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

    基于拉取的事件流

    除了执行命令之外,CliWrap 还支持事件流模型, 可以订阅相关的事件回调。

    • StartedCommandEvent -- 仅接收一次,当命令开始执行时(包含 process ID)
    • StandardOutputCommandEvent -- 每次底层进程向输出流写入新行时收到(包含文本作为字符串)
    • StandardErrorCommandEvent -- 每次底层进程向错误流写入新行时收到(包含文本作为字符串)
    • ExitedCommandEvent -- 仅接收一次,当命令完成执行时(包含 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;
        }
    }
    
    

    输出结果如下:

    希望对您有用!
    https://github.com/Tyrrrz/CliWrap

  • 相关阅读:
    HDU 2098 分拆素数和
    HDU 2034 *人见人爱A-B
    HDU 1236 排名(Microsoft_zzt)
    HDU 5702 Solving Order
    HDU 2033 人见人爱A+B
    HDU 2029 Palindromes _easy version
    HDU 2021 发工资咯:)
    HDU 2071 Max Num
    HDU 2039 三角形
    页面使用element-tree
  • 原文地址:https://www.cnblogs.com/myshowtime/p/15654334.html
Copyright © 2011-2022 走看看