如何维护MS Build属性层次结构?

时间:2011-03-07 05:59:48

标签: msbuild config msbuild-task

任何人都可以告诉我,MsBuild如何获取该属性的值.. ??

例如

<TempProperty>Property Value</TempProperty>

现在我可以在任何地方使用$(TempProperty)来获取它的值。

现在的情况是我已经制作了具有这样配置的自定义任务..

<PropertyGroup>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>

现在而不是在标签中获取“属性值”我得到$(TempProperty)...任何人都可以告诉我如何获得标签中的实际值???

提前感谢。

嘿,伙计们我也有实际的问题和解决方案......我想我无法在这里描述我的问题..问题是..在我的自定义任务中我传递了文件的文件路径包含上面的ItemList标签..当我试图解析XMLNode“ItemList”时,它将“$(TempProperty)”作为Item中的值...并且我认为这是正确的,因为那就是传递的XML中存在的内容。 / p>

所以为了克服这个问题,我做了两件事......

我创建了ItemGroup而不是propertyGroup,并将该ItemGroup传递给我的自定义任务而不是文件路径..因此现在在我的代码中我得到了所需的值。

感谢您的回复。

3 个答案:

答案 0 :(得分:0)

没有足够的方法可以真正诊断出你的问题。乍一看它看起来是正确的,但TempProperty的PropertyGroup在哪里声明了?

作为一个说明性示例,这里是C#项目文件的片段:

     <?xml version="1.0" encoding="utf-8"?>
     <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
                <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
                 ...
        </PropertyGroup>

        <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
            ...
        </PropertyGroup>

配置属性设置为Debug(如果此时为空)。在以下组中,它关闭了Confuration和Platform属性。

唯一的问题是,要使属性值正确显示,必须在使用之前声明它。

请尝试提供更多背景信息,这可能有助于理解问题。

答案 1 :(得分:0)

我刚试过这个:

<Project 
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  ToolsVersion="4.0"
  DefaultTargets="Demo" >

  <PropertyGroup>
    <TempProperty>property value</TempProperty>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>



  <Target Name="Demo">
    <Message Text="TempProperty: $(TempProperty)"/>
    <Message Text="ItemList: $(ItemList)"/>
  </Target>


</Project>

我的结果在哪里:

Task "Message"
  TempProperty: property value
Done executing task "Message".
Task "Message"
  ItemList: 
  <ConfigChange xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
    <Value>property value</Value>
    <IsList>False</IsList>
  </ConfigChange>
Done executing task "Message".

你还有别的什么吗?

答案 2 :(得分:0)

关于Ritch的建议我正在添加我的解决方案。

最初我有

<TempProperty>Property Value</TempProperty>

<PropertyGroup>
    <ItemList>
      <ConfigChange>
        <PlaceHolder>#MACHINE_NAME#</PlaceHolder>
        <Value>$(TempProperty)</Value>
        <IsList>False</IsList>
      </ConfigChange>
    </ItemList>
  </PropertyGroup>

现在我的问题是我将我的属性文件部分提供给我的自定义任务

喜欢

<UpdatePegasusConfigXML
      Environment="$(Environment)"
      Instance="$(Instance)"
      BuildSourceRoot="$(BuildSourceRoot)"
      ></UpdatePegasusConfigXML>

现在因为我提供文件路径本身所以它取了放在“Value”标签中的值而没有拿起属性值,因此在代码级别我得到“$(TempProperty)”而不是“Property”值“

现在我所做的不是创建属性组,而是像我这样创建了ItemGroup

<ItemGroup>
    <PlaceHolders Include="#MACHINE_NAME#">
      <Value>$(TempProperty)</Value>
      <IsList>True</IsList>
    </PlaceHolders>
 </ItemGroup>

现在我更新了我的自定义任务,将IteamGroup作为其中一个输入,因此调用已更改为

<UpdatePegasusConfigXML
      Environment="$(Environment)"
      Instance="$(Instance)"
      BuildSourceRoot="$(BuildSourceRoot)"
      PlaceHolders="@(PlaceHolders)"
      ></UpdatePegasusConfigXML>

现在在代码级别,我能够获得ItemGroup的“Value”标记中的值。

我希望我已经解释了我的解决方案,这是可以理解的。