我有一个自定义任务,需要一组键值才能工作。如何使用字符串到字符串字典配置来配置自定义MSBuild?
答案 0 :(得分:2)
MSBuild中没有内置词典,但你可以编写自己的词典,就像字典一样。有几个选项,但在语义上最接近的选项是使用带有元数据的项目组来获取键和值。
您的MSBuild文件可能如下所示:
<ItemGroup>
<MyDictionary Include="Value1">
<MyKey>key1</MyKey>
</MyDictionary>
<MyDictionary Include="Value2">
<MyKey>key2</MyKey>
</MyDictionary>
...
<MyDictionary Include="ValueN">
<MyKey>keyN</MyKey>
</MyDictionary>
</ItemGroup>
<Target Name="MyTarget">
<MyTask MyInput="@(MyDictionary)" ... />
</Target>
您的自定义任务只需输入ITaskItem []数组,如果需要,您可以迭代它以将其转换为实际字典:
class MyTask: ITask
{
public ITaskItem[] MyInput { get; set; }
public override bool Execute()
{
...
var dic = new Dictionary<string, string>();
foreach (var input in MyInput)
{
dic.Add(input.GetMetadata("MyKey"), input.ItemSpec);
}
...
}
}
请注意,ItemGroup不保证键和值之间的一对一映射,因此您最终可能会为同一个键设置多个值。
答案 1 :(得分:0)
如果您有一定数量的键值对,其中键不会改变,但值会改变,您可以使用良好的旧时尚环境变量来实现此目的。
@ECHO OFF
SET K1=Value1
SET K2=Value2
MSBUILD.EXE mytest.proj
然后在您的 mytest.proj 文件中,您有类似的内容:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="ATest" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ATest">
<Message Text="-- $(K1) --"/>
<Message Text="-- $(K2) --"/>
</Target>