任何人都可以告诉我,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传递给我的自定义任务而不是文件路径..因此现在在我的代码中我得到了所需的值。
感谢您的回复。
答案 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”标记中的值。
我希望我已经解释了我的解决方案,这是可以理解的。