在MSBuild中,如何将属性更改传播到从属属性?

时间:2019-04-10 16:12:07

标签: msbuild

在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 &quot; Write-Output 4.3 &quot;">
(4)           <Output TaskParameter="ConsoleOutput" PropertyName="MsiVersion" />
            </Exec> 
          </Target>

        </Project>

1 个答案:

答案 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 &quot; Write-Output 4.3 &quot;">
              <Output TaskParameter="ConsoleOutput" PropertyName="MsiVersion" />
            </Exec> 
(5)         <CreateProperty Value="MSI_VERSION=$(MsiVersion);$(WixVariables)">
                <Output TaskParameter="Value" PropertyName="WixVariables" />
            </CreateProperty>
          </Target>

        </Project>