如何在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
相关产品推荐
相关产品推荐

