我正在開發一個用于構建我們專案的.net工具。我正在使用System.CommandLine包來收集命令列引數,而不需要汗水。我的構建命令看起來像這樣:
[Command(Description = "Runs build process")]
public class Build
{
public int Execute()
[Option] string targetDirectory,
[Option(Aliases = new[] {"-c"}) ] string configuration = "Release")
{
return new CakeHost()
.UseContext<BuildContext>()
.Run(Enumerable.Empty<string>())。
}
注意,有些屬性是微軟的庫中沒有的。這是我添加的。型別在飛行中被轉換為Command。
重要的是,Cake只接受字串集合的引數。所以我看到的唯一方法是將引數轉換為字串,并在任務中再次決議它。如果我這樣做,我將一個月都無法入睡。
我期望的解決方案是創建并傳遞一個BuildContext型別的實體(它繼承自FrostingContext)。我可以簡單地擁有對應于應用程式引數的屬性。
有什么想法可以解決這個問題嗎?或者,也許有一個我不知道的功能?
有什么想法可以解決這個問題?
uj5u.com熱心網友回復:
為了實作這一點,你可以使用依賴性注入,將你的自定義引數作為一個單子注入到你自己的構建環境中。
這可以看起來像
[Command(Description = "Runs build process")]
public class Buildpublic int Execute()
[Option] string targetDirectory,
[Option(Aliases = new[] {"-c"}) ] string configuration = "Release")
=> new CakeHost()
.ConfigureServices(services => services.AddSingleton(new BuildParameters(targetDirectory, configuration))
.UseContext<BuildContext>()
.Run(Array.Empty<string>())。
}
在這種情況下,BuildParameters是這樣定義的
public class BuildParameters
{
public DirectoryPath TargetDirectory { get; }
public string Configuration { get; }
public BuildParameters(span class="hljs-built_in">string targetDirectory, string configuration)。
{
配置 = 配置。
TargetDirectory = DirectoryPath.FromString(targetDirectory)。
}
}
一個最小的FrostingContext利用了這個
public class BuildContext : FrostingContext
{
public BuildParameters BuildParameters { get; }
public BuildContext(ICakeContext context, BuildParameters buildParameters)
: base(context)。
{
BuildParameters = buildParameters。
}
}
然后在你所有的Frosting任務中,你將有一個BuildParameters屬性,你可以像這樣訪問。
[TaskName("Hello")]
public sealed class HelloTask : FrostingTask<BuildContext>
{
public override void Run(BuildContext context)。
{
context.Log.Information("Configuration {0}", context.BuildParameters.Configuration) 。
}
uj5u.com熱心網友回復:
我覺得你有兩種方法來解決這個問題:
如果你想使用Cake Frosting,它是用來決議命令列引數的,你就必須傳遞所有給你的引數,類似于new CakeHost()
.UseContext<BuildContext>()
.Run(new[] 。
{
$"-configuration={configuration}"。
});
(另外,你可以檢查System.CommandLine是否包含一個訪問引數 "原始 "的功能,因為它們被賦予了。)
或者,如果您想在 "您的 "應用程式中進行所有決議和設定,您應該看看Cake.Bridge,它允許完全以編程方式使用Cake-功能。(IMHO認為這是一條更長/更難的道路)
。轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307247.html
標籤:
