【问题标题】:how is MS Build properties hierarchy maintained?MS Build 属性层次结构如何维护?
【发布时间】:2011-03-08 15:30:15
【问题描述】:

谁能告诉我 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中存在的内容。

所以为了解决这个问题,我做了两件事..

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

感谢您的回复。

【问题讨论】:

  • 您应该将您的答案添加为详细答案,并将问题标记为已解决。

标签: msbuild config msbuild-task


【解决方案1】:

那里不足以真正诊断您的问题。乍一看似乎是正确的,但是 TempProperty 的 PropertyGroup 是在哪里声明的?

作为一个说明性示例,这是来自 C# 项目文件的 sn-p:

     <?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>

配置属性被设置为调试(如果此时它是空白的)。在以下组中,它关闭了 Confuration 和 Platform 属性。

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

请尝试提供更多上下文,这可能有助于理解问题。

【讨论】:

    【解决方案2】:

    我刚试过这个:

    <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".
    

    你看到别的了吗?

    【讨论】:

    • 我想我不清楚..我得到了你所指出的值......但是在我的自定义逻辑中,当我选择 XMLNode“ItemList”时,我没有得到想要的值我得到..."$(TempProperty)" 作为值...
    【解决方案3】:

    根据 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>
    

    现在我更新了我的自定义任务以将 ItamGroup 作为输入之一,因此调用更改为

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

    现在在代码级别,我可以在 ItemGroup 的“Value”标签中获取值。

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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多