在MSBuild中,我试图动态生成一个属性,该属性取决于另一个属性的值。 这似乎与How get exec task output with msbuild有关,但并不相同 和Dynamically create a property in msbuild to be used in a calltarget subtarget
请参阅下面的示例。它正在尝试生成属性WixVariable,该属性依赖于属性MsiVersion。 (仅供参考,尽管该代码与该问题并不真正相关,但该代码与准备WixVariables有关,该代码将传递给wix.exe以生成MS安装程序。)
在(1)属性中,为MsiVersion分配了值“未知”
在(2)属性中为WixVariables分配了值“ MSI_VERSION =未知; OTHER_VARIABLE = OtherValue”
在(3)处,运行powershell脚本以生成实际的版本号。为了简化示例,它只返回“ 4.3”。
在(4)属性中,应该为MsiVersion赋予新值“ 4.3”
这应该将属性WixVariables更新为具有值“ MSI_VERSION = 4.3; OTHER_VARIABLE = OtherValue”
但这不起作用。 WixVariables保持不变。
我已经尝试了几个小时,但无法获得所需的结果:WixVariables反映MsiVersion的生成值。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AProperty>SomeValue</AProperty>
(1) <MsiVersion>unknown</MsiVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
... snip
(2) <WixVariables>MSI_VERSION=$(MsiVersion);OTHER_VARIABLE=OtherValue</WixVariables>
</PropertyGroup>
<Target Name="BeforeBuild" />
(3) <Exec ConsoleToMSBuild="true" Command="powershell -NoProfile -ExecutionPolicy ByPass -Command " Write-Output 4.3 "">
(4) <Output TaskParameter="ConsoleOutput" PropertyName="MsiVersion" />
</Exec>
</Target>
</Project>
答案 0 :(得分:0)
好吧,经过大量的实验,我对我的问题有了一个答案,并且对MSBuild有了更好的理解。
我不明白的是,一旦为属性分配了一个值(请参见上面的示例中的(1)和(2)),该属性的值就会被固定为 。
(4)处的代码 会更新MsiVersion的值,但不会会更新WixVariables的值。换一种说法 属性MsiVersion更改时,将重新评估(2)处的行不。
要更新WixVariables的值,必须像下面(5)的代码那样显式设置它。
工作示例如下所示。 与问题示例不同,最初创建MsiVersion = unknown没有意义 或在WixVariables前面加上“ MSI_VERSION = unknown”。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AProperty>SomeValue</AProperty>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
... snip
<WixVariables>OTHER_VARIABLE=OtherValue</WixVariables>
</PropertyGroup>
<Target Name="BeforeBuild" />
<Exec ConsoleToMSBuild="true" Command="powershell -NoProfile -ExecutionPolicy ByPass -Command " Write-Output 4.3 "">
<Output TaskParameter="ConsoleOutput" PropertyName="MsiVersion" />
</Exec>
(5) <CreateProperty Value="MSI_VERSION=$(MsiVersion);$(WixVariables)">
<Output TaskParameter="Value" PropertyName="WixVariables" />
</CreateProperty>
</Target>
</Project>