从MSBuild属性中解析键/值对

时间:2014-06-12 03:31:49

标签: msbuild

说我有一个属性:

<MyProp>Foo=Bar;Hello=World</MyProp>

这似乎是MSBuild中一个相当常见的属性模式。我将如何获取价值&#34; World&#34;?在一个理想的世界中,这可能看起来像:

$(MyProp).(Hello)

编辑:要清楚,该属性是我自己的创建,它是另一个目标的输出超出我的控制,所以我不能改变声明属性的方式。

3 个答案:

答案 0 :(得分:2)

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <MyProp>Foo=Bar;Hello=World</MyProp>
    </PropertyGroup>

    <Target Name="Foo">
        <CreateItem Include="MyProp" AdditionalMetadata="$(MyProp)">
            <Output TaskParameter="Include" ItemName="MyProp" />
        </CreateItem>
        <Message Text="Foo %(MyProp.Foo)" />
        <Message Text="Hello %(MyProp.Hello)" />
    </Target>
</Project>

答案 1 :(得分:1)

就我而言,你有两条路线可以关注

  1. 声明Property Group,如下所示:
  2.  <PropertyGroup>
         <Foo>Bar</Foo>
         <Hello>World</Hello>
    </PropertyGroup>
    

    然后使用以下方法访问您的属性

    <Target Name="DoSomething">
    <Message Text="Print this : $(Foo)" />
    </Target>
    

    或者您可能希望采用ItemGroup Element方式,如下所示

    <ItemGroup>
        <MySolutionFiles Include="..\mySolution.sln" />
    </ItemGroup>
    <Target Name="PrintItems">
         <Message Text="My Files: @(MySolutionFiles)" />
    </Target>
    

    您也可以拥有以下内容

    <ItemGroup>
        <MyProp
        Include="Foo;Hello" />
    </ItemGroup>
    <Target Name="PrintMyItems">
         <Message Text="MyProp: @(MyProp)" />
    </Target>
    

    如果对输入没有选择,那么一种可能的解决方案是将输入解析为数组,然后从那里取出它,如下所示:

      <PropertyGroup>
        <MyProp>Foo=Bar;Hello=World</MyProp>
        <Split>$(MyProp.Split(';'))</Split>
      </PropertyGroup>
    

    然后使用以下数组项进行播放:

      <Target Name="DoPrint">
        <Message text="$(Split[0])" />
      </Target>
    

    Split [0]项包含你的Foo = Bar,它可以像上面一样分成另外两个字符串。这应该让你现在继续。

答案 2 :(得分:0)

您不需要属性组,如果用户没有传递默认值,那么它很不错。

对于您传递的每个属性,访问该属性的语法是$(PropertyName)。

所以如果你通过:

msbuild.exe / p:P1 = V1 / p:P2 = V2; P3 = V3

您将使用属性名称$(P1),$(P2),$(P3)。

有关MsBuild属性的更多信息here