You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wix项目的PostBuildEvent中获取修改后的TargetPath?

问题分析与解决方案

你遇到的问题根源在于MSBuild的属性求值时机:PostBuildEvent中的属性会在项目加载阶段就完成展开,而你在BeforeBuild目标中修改的TargetPath是构建运行时的动态值,所以原始的PostBuildEvent无法获取到更新后的值。

解决方法

放弃使用PostBuildEvent属性,改用自定义的PostBuild目标,通过显式的依赖关系确保它在Build目标之后执行,这样就能拿到BeforeBuild中修改后的属性值。

修改后的项目代码如下:

<Project>
  <Import Project="Sdk.props" Sdk="WixToolset.Sdk" Version="4.0.2" />
  <PropertyGroup>
    <OutputName>Server</OutputName>
    <Name>ServerInstaller</Name>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <DefineConstants>Debug</DefineConstants>
    <SuppressIces>ICE61;ICE57</SuppressIces>
    <BindFiles>false</BindFiles>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\userve\userve.csproj">
      <Name>userve</Name>
      <Project>{b20b1c16-7dfd-40f4-a0cb-6b7bb227d10f}</Project>
      <Private>True</Private>
      <DoNotHarvest>True</DoNotHarvest>
      <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
      <RefTargetDir>INSTALLFOLDER</RefTargetDir>
    </ProjectReference>
  </ItemGroup>
  <Import Project="Sdk.targets" Sdk="WixToolset.Sdk" Version="4.0.2" />
  <Target Name="BeforeBuild">
    <GetAssemblyIdentity AssemblyFiles="$(SolutionDir)Control\bin\$(Configuration)\Control.dll">
      <Output ItemName="AssemblyInfo" TaskParameter="Assemblies" />
    </GetAssemblyIdentity>
    <CreateProperty Value="$(OutputName).%(AssemblyInfo.Version)">
      <Output PropertyName="TargetName" TaskParameter="Value" />
    </CreateProperty>
    <CreateProperty Value="$(TargetName)$(TargetExt)">
      <Output PropertyName="TargetFileName" TaskParameter="Value" />
    </CreateProperty>
    <CreateProperty Value="$(TargetDir)$(TargetFileName)">
      <Output PropertyName="TargetPath" TaskParameter="Value" />
    </CreateProperty>
  </Target>
  <!-- 替换原来的PostBuildEvent属性,改为自定义目标 -->
  <Target Name="CustomPostBuild" AfterTargets="Build">
    <Exec Command="echo $(TargetPath)" />
  </Target>
</Project>

关键说明

  • 自定义的CustomPostBuild目标通过AfterTargets="Build"指定在Build目标之后执行,而BeforeBuild默认在Build之前运行,因此TargetPath已经被正确修改。
  • 使用Exec任务替代PostBuildEvent,能确保属性在运行时动态求值,拿到最新的TargetPath值。

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:40:23