如何将键值参数集传递给MsBuild中的任务?

时间:2015-07-04 19:52:09

标签: msbuild

我有一个自定义任务,需要一组键值才能工作。如何使用字符串到字符串字典配置来配置自定义MSBuild?

2 个答案:

答案 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>