Cake.ArgumentBinder 3.0.0

dotnet add package Cake.ArgumentBinder --version 3.0.0                
NuGet\Install-Package Cake.ArgumentBinder -Version 3.0.0                
此命令旨在在 Visual Studio 的软件包管理器控制台中使用,因为它使用 NuGet 模块版本的 Install-Package
<PackageReference Include="Cake.ArgumentBinder" Version="3.0.0" />                
对于支持 软件包引用 的项目,将此 XML 节复制到项目文件中,以引用软件包。
paket add Cake.ArgumentBinder --version 3.0.0                
#r "nuget: Cake.ArgumentBinder, 3.0.0"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中,以引用软件包。
#addin nuget:?package=Cake.ArgumentBinder&version=3.0.0                

Cake.ArgumentBinder

将传入 Cake 的参数绑定到配置类的方法。

Build status

关于

此 Cake(一个 C# 构建系统)的附加组件,允许您将 Cake 传入的参数绑定到 C# 类,而不必手动进行。

说实话,对于 Cake 的大多数用户来说,此附加组件可能有点多余(即使是这个项目的 cakefile 也没有使用它)。它原本是为复杂、灵活的构建环境设计的,其中有多个任务和从命令行传入的多个配置。

软件包

NuGet

工作原理

假设在调用 Cake 中定义的目标时,目标需要从用户处获取几个参数才能执行。在这个例子中,它是在删除目录中的文件。一个选项是只需使用 Arguments 函数解析这些参数。

string path = Argument( "path", string.Empty );
string pattern = Argument( "pattern", string.Empty );
int filesToKeep = Argument<int>( "num_to_keep", 0 );
bool dryRun = Argument<bool>( "dry_run", false );

这很好,但是现在可能需要进行验证以确保传入的参数不是空字符串,并且要保留的文件数量不是负数。

别忘了在描述中添加每个参数的作用、哪些参数是必需的等内容!这会变得非常无聊,尤其是在环境中有多个任务的情况下。如果我们可以将这些参数绑定到我们可以无任何问题使用的类中,那会不错吗?

使用此附加组件,现在您可以这样做,借助属性的力量。现在,您不再需要手动获取参数,只需创建一个配置类并将相应的属性标记为正确的属性。

public class DeleteHelpersConfig
{
    // ---------------- Properties ----------------

    /// <summary>
    /// The directory to delete things from.
    /// </summary>
    [StringArgument(
        "path",
        Description = "The path to delete from.",
        Required = true,
        ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
    )]
    public string Directory { get; set; }

    /// <summary>
    /// The number of files or directories 
    /// to keep that match the given pattern.
    /// Defaulted to 0.
    /// Can not be negative.
    /// </summary>
    [IntegerArgument(
        "num_to_keep",
        Description = "The number of the most recent files/directories to keep that match the pattern.",
        DefaultValue = 0,
        Min = 0,
        Max = 255,
        ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
    )]
    public int NumberOfFilesToKeep { get; set; }

    /// <summary>
    /// The glob of the deletion pattern to use.
    /// </summary>
    [StringArgument(
        "pattern",
        Description = "The glob pattern to delete files/directories from.",
        DefaultValue = "*",
        ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
    )]
    public string DeletionPattern { get; set; }

    [BooleanArgument(
        "dry_run",
        Description = "Set to 'true' to not delete any files, this will simply print what files will be deleted.",
        DefaultValue = false,
        ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
    )]
    public bool DryRun { get; set; }
}

现在在您的 Task 中,您不必解析和验证多个参数,ArgumentBinder 会为您处理所有这些。您只需在任务中这样做即可

Task( "delete_files" )
.Does(
    ( context ) =>
    {
        DeleteHelpersConfig config = CreateFromArguments<DeleteHelpersConfig>();
        DeleteHelpers.DeleteFiles( context, config );
    }
)
.DescriptionFromArguments<DeleteHelpersConfig>( "Deletes specified files." );

现在,如果您在命令行中输入 cake --showdescription,您将看到任务和所有参数的打印输出。

Task                          Description
================================================================================
delete_files                  Deletes specified files.
- Arguments:
         --path
                The path to delete from.
                Type: String
                This argument is Required.

         --num_to_keep
                The number of the most recent files/directories to keep that match the pattern.
                Type: Integer
                Default Value: 0
                Minimum Value: 0
                Maximum Value: 255

         --pattern
                The glob pattern to delete files/directories from.
                Type: String
                Defaulted to: *

         --dry_run
                Set to 'true' to not delete any files, this will simply print what files will be deleted.
                Type: Boolean
                Default Value: False

如果您没有指定必要的参数,您将收到一个有用的错误信息。

cake --target=delete_files

========================================
delete_files
========================================
An error occurred when executing task 'delete_files'.
Error: One or more errors occurred.
        Argument 'path' is required, but was never specified.

如果您指定了一个无效的参数,您也会收到一个有用的错误信息(例如,低于保留文件的最小值)。

cake --target=delete_files --path="." --dry_run=true --num_to_keep=-1

========================================
delete_files
========================================
An error occurred when executing task 'delete_files'.
Error: One or more errors occurred.
        Value specified in argument 'num_to_keep' is less than the minimum value of '0'.

您也可以通过设置“ArgumentSource”属性来指定参数的来源。有四种选项。

  • CommandLine(默认)- 值来自命令行参数。
  • EnvironmentVariable - 值来自环境变量。
  • CommandLineThenEnvironmentVariable - 值首先来自命令行,但如果未指定相应的命令行参数,则回退到环境变量。
  • EnvironmentVariableThenCommandLine - 值首先来自环境变量,但如果未指定该名称的环境变量,则回退到命令行。

最佳实践

  • 请将“Configuration”类与其他执行任何操作的课程或函数分开。这不仅有助于问题分离,而且与Cake的行为一致。

故障排除

  • 确保在将参数绑定到课程中,您可能需要包含使用语句 using Cake.ArgumentBinder;,否则编译器无法找到属性,并产生大量错误。

讨论

有关问题和讨论想法以及功能请求,请使用 GitHub上的Cake GitHub存储库中的讨论,在 扩展Q&A类别下。

Join in the discussion on the Cake repository

版本

Cake.ArgumentBinder的版本不是语义版本化。相反,主要版本(x.y.z中的x)是库编译所针对的Cake版本。例如,如果Cake.ArgumentBinder依赖于Cake版本2.0.0,则Cake.ArgumentBinder的版本将是2.y.z。次要版本(x.y.z中的y)将在添加了新功能时递增。修订版(x.y.z中的z)将在发生错误修复时递增。我们将尽可能减少破坏向后兼容性的情况,并且仅在发布新版本的Cake时才这样做。

许可证

为了与Cake本身保持一致,Cake.ArgumentBinder在MIT许可证下发布。这包括示例。

产品 兼容和额外的计算目标框架版本。
.NET net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关 目标框架.NET 标准的更多信息
  • net6.0

    • 无依赖项。

NuGet 包

此包未由任何 NuGet 包使用。

GitHub 仓库

此包未由任何流行的 GitHub 仓库使用。

版本 下载 最后更新
3.0.0 42,591 11/21/2022
2.0.0 374 11/21/2022
1.0.0 359 11/21/2022
0.6.0 8,740 5/22/2021
0.5.0 575 4/11/2021
0.4.0 420 4/3/2021
0.3.0 19,051 2/8/2021
0.2.3 2,354 10/31/2020
0.2.2 1,962 2/5/2020
0.2.1 676 1/3/2020
0.2.0 571 1/2/2020
0.1.2 986 10/5/2019
0.1.1 668 9/3/2019
0.1.0 555 9/2/2019