WiX Toolset v4中动态设置安装包Target/Output Name失效问题
WiX v4升级后TargetName设置失效的解决方案
问题原因
WiX v4采用了SDK风格的项目结构,输出文件名的确定流程和v3完全不同:ComputeOutputFileName目标会在构建早期就计算并锁定输出文件名,而你之前通过InitialTargets执行SetVersion的时机太晚,导致设置的TargetName被WiX内部流程覆盖,无法生效。
解决步骤
1. 调整SetVersion目标的执行时机
移除Project节点的InitialTargets属性中对SetVersion的引用,改为给SetVersion目标添加BeforeTargets="ComputeOutputFileName",确保在WiX计算输出文件名之前完成版本号读取和属性设置。
2. 使用WiX v4推荐的WixOutputName属性
WiX v4中官方推荐用WixOutputName控制安装包输出文件名,替代旧版的TargetName,避免属性冲突和覆盖问题。
3. 确保依赖项目先构建(可选)
如果WiX项目依赖应用项目的编译输出,给SetVersion添加DependsOnTargets="BuildDependencies",确保应用程序集已生成,避免读取文件失败。
修改后的完整代码片段
<Project> <Import Project="Sdk.props" Sdk="WixToolset.Sdk" Version="4.0.0-rc.1" /> <!-- 其他项目配置 --> <Target Name="SetVersion" BeforeTargets="ComputeOutputFileName" DependsOnTargets="BuildDependencies"> <GetAssemblyIdentity AssemblyFiles="$(SolutionDir)\bin\$(Platform)\$(Configuration)\MyApp.exe"> <Output TaskParameter="Assemblies" ItemName="Assembly" /> </GetAssemblyIdentity> <PropertyGroup> <!-- 设置输出文件名,格式为 解决方案名.版本号.msi --> <WixOutputName>$(SolutionName).%(Assembly.Version)</WixOutputName> <!-- 保留原有的DefineConstants设置,供WiX源码中引用版本号 --> <DefineConstants>BuildVersion=%(Assembly.Version)</DefineConstants> </PropertyGroup> </Target> <Target Name="CopyLinkedContentFiles" BeforeTargets="Build"> <Copy SourceFiles="%(Content.Identity)" DestinationFiles="%(Content.Link)" SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" Condition="'%(Content.Link)' != ''" /> </Target> <Import Project="Sdk.targets" Sdk="WixToolset.Sdk" Version="4.0.0-rc.1" /> <!-- 其他项目配置 --> </Project>
验证
构建项目后,你会在输出目录得到形如MyApplication.X.X.X.X.msi的安装包文件,其中X.X.X.X为应用程序集的版本号。
内容的提问来源于stack exchange,提问作者Euan Mair
相关产品推荐
相关产品推荐

