Cake 构建:访问原始命令行参数字符串?
Cake build: access original command line arguments string?
在尝试将 Mono.Options 压缩到我的 Cake 脚本中时,我注意到我并不完全确定如何从最初启动 Cake 脚本的命令行调用中为它提供原始参数字符串。 Mono.Options Parse
方法采用典型的控制台应用程序的 string[] args
参数,因此我需要为它提供一些它可以使用的东西。
我知道我可以使用 ArgumentAlias 调用查询特定参数的上下文,但是有什么方法可以访问整个原始字符串调用字符串吗?
Cake 脚本本质上只是一个常规的 .NET 进程,您可以通过 System.Environment.GetCommandLineArgs()
访问它
PoC 示例
您可以将 Mono.Options 与下面的 Cake
一起使用的一种方式的简单示例
#addin nuget:?package=Mono.Options&version=5.3.0.1
using Mono.Options;
public static class MyOptions
{
public static bool ShouldShowHelp { get; set; } = false;
public static List<string> Names { get; set; } = new List<string>();
public static int Repeat { get; set; } = 1;
}
var p = new OptionSet {
{ "name=", "the name of someone to greet.", n => MyOptions.Names.Add (n) },
{ "repeat=", "the number of times to MyOptions.Repeat the greeting.", (int r) => MyOptions.Repeat = r },
// help is reserved cake command so using options instead
{ "options", "show this message and exit", h => MyOptions.ShouldShowHelp = h != null },
};
try {
p.Parse (
System.Environment.GetCommandLineArgs()
// Skip Cake.exe and potential cake file.
// i.e. "cake --name="Mattias""
// or "cake build.cake --name="Mattias""
.SkipWhile(arg=>arg.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)||arg.EndsWith(".cake", StringComparison.OrdinalIgnoreCase))
.ToArray()
);
}
catch (OptionException e) {
Information("Options Sample: ");
Information (e.Message);
Information ("--options' for more information.");
return;
}
if (MyOptions.ShouldShowHelp || MyOptions.Names.Count == 0)
{
var sw = new StringWriter();
p.WriteOptionDescriptions (sw);
Information(
"Usage: [OPTIONS]"
);
Information(sw);
return;
}
string message = "Hello {0}!";
foreach (string name in MyOptions.Names) {
for (int i = 0; i < MyOptions.Repeat; ++i)
Information (message, name);
}
示例输出
cake .\Mono.Options.cake
将输出帮助,因为没有指定名称
cake .\Mono.Options.cake --options
将输出 "help"
cake .\Mono.Options.cake --name=Mattias
会跟我打招呼
cake .\Mono.Options.cake --name="Mattias" --repeat=5
会跟我打招呼5次
cake .\Mono.Options.cake --name="Mattias" --repeat=sdss
会失败并报告,因为 repeat not a number
在尝试将 Mono.Options 压缩到我的 Cake 脚本中时,我注意到我并不完全确定如何从最初启动 Cake 脚本的命令行调用中为它提供原始参数字符串。 Mono.Options Parse
方法采用典型的控制台应用程序的 string[] args
参数,因此我需要为它提供一些它可以使用的东西。
我知道我可以使用 ArgumentAlias 调用查询特定参数的上下文,但是有什么方法可以访问整个原始字符串调用字符串吗?
Cake 脚本本质上只是一个常规的 .NET 进程,您可以通过 System.Environment.GetCommandLineArgs()
PoC 示例
您可以将 Mono.Options 与下面的 Cake
一起使用的一种方式的简单示例#addin nuget:?package=Mono.Options&version=5.3.0.1
using Mono.Options;
public static class MyOptions
{
public static bool ShouldShowHelp { get; set; } = false;
public static List<string> Names { get; set; } = new List<string>();
public static int Repeat { get; set; } = 1;
}
var p = new OptionSet {
{ "name=", "the name of someone to greet.", n => MyOptions.Names.Add (n) },
{ "repeat=", "the number of times to MyOptions.Repeat the greeting.", (int r) => MyOptions.Repeat = r },
// help is reserved cake command so using options instead
{ "options", "show this message and exit", h => MyOptions.ShouldShowHelp = h != null },
};
try {
p.Parse (
System.Environment.GetCommandLineArgs()
// Skip Cake.exe and potential cake file.
// i.e. "cake --name="Mattias""
// or "cake build.cake --name="Mattias""
.SkipWhile(arg=>arg.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)||arg.EndsWith(".cake", StringComparison.OrdinalIgnoreCase))
.ToArray()
);
}
catch (OptionException e) {
Information("Options Sample: ");
Information (e.Message);
Information ("--options' for more information.");
return;
}
if (MyOptions.ShouldShowHelp || MyOptions.Names.Count == 0)
{
var sw = new StringWriter();
p.WriteOptionDescriptions (sw);
Information(
"Usage: [OPTIONS]"
);
Information(sw);
return;
}
string message = "Hello {0}!";
foreach (string name in MyOptions.Names) {
for (int i = 0; i < MyOptions.Repeat; ++i)
Information (message, name);
}
示例输出
cake .\Mono.Options.cake
将输出帮助,因为没有指定名称
cake .\Mono.Options.cake --options
将输出 "help"
cake .\Mono.Options.cake --name=Mattias
会跟我打招呼
cake .\Mono.Options.cake --name="Mattias" --repeat=5
会跟我打招呼5次
cake .\Mono.Options.cake --name="Mattias" --repeat=sdss
会失败并报告,因为 repeat not a number