如何为现有Wix v3代码创建VS项目并迁移至Wix v4?
迁移Wix v3到Wix v4:整合NAnt构建逻辑到VS项目并支持CI/CD
一、VS Wix项目基础准备
已经通过HeatWave完成v3到v4的代码迁移,且所有.wxs/.wxl/.xslt等文件已添加到VS Wix项目后,注意:.wixproj本质是MSBuild文件,所有自定义构建逻辑都可以直接编辑这个文件实现,无需依赖VS界面操作,这样命令行和CI/CD环境都能复用同一套配置。
二、迁移NAnt .build核心逻辑到MSBuild
原NAnt里的构建目标(每日/发布构建)、环境变量、路径配置等,都可以映射为MSBuild的属性和自定义Target:
1. 环境变量与路径配置
在.wixproj中添加PropertyGroup块,直接映射原.build里的环境变量和路径规则,还能根据构建类型做条件分支:
<PropertyGroup> <!-- 映射原.build中的环境变量 --> <UpgradeCodeGuid>$(env:UPGRADECODEGUID)</UpgradeCodeGuid> <MergeModulePath>$(SolutionDir)MergeModules\</MergeModulePath> <!-- 统一输出目录,对应原清理逻辑的目标路径 --> <OutputPath>$(SolutionDir)bin\$(Configuration)\</OutputPath> </PropertyGroup> <!-- 按构建类型区分配置 --> <PropertyGroup Condition="$(Configuration) == 'Daily'"> <BuildType>Daily</BuildType> <!-- 每日构建专属参数,比如临时文件路径 --> <TempDir>$(SolutionDir)temp\daily\</TempDir> </PropertyGroup> <PropertyGroup Condition="$(Configuration) == 'Release'"> <BuildType>Release</BuildType> <TempDir>$(SolutionDir)temp\release\</TempDir> </PropertyGroup>
2. 构建步骤迁移
原NAnt里的拉取代码、清理、NuGet还原、产品代码构建等步骤,用MSBuild原生Target或Exec命令实现:
- 清理输出与临时文件:复用MSBuild自带的
Clean目标,扩展自定义清理逻辑:
<Target Name="CustomClean" BeforeTargets="Clean"> <RemoveDir Directories="$(OutputPath)" /> <RemoveDir Directories="$(TempDir)" /> </Target>
- NuGet包还原:VS项目默认会自动还原,若需手动控制,添加:
<Target Name="RestoreNuGet" BeforeTargets="Build"> <Exec Command="dotnet restore $(SolutionDir)YourProduct.sln" /> </Target>
- 构建产品代码:直接调用产品项目的Build目标:
<Target Name="BuildProduct" BeforeTargets="Build"> <MSBuild Projects="$(SolutionDir)YourProduct.csproj" Targets="Build" Properties="Configuration=$(Configuration)" /> </Target>
- 生成数据文件/复制资源:用
Copy任务或直接执行原有脚本:
<Target Name="PrepareResources" BeforeTargets="Build"> <Exec Command="$(SolutionDir)Scripts\GenerateDataFiles.bat" /> <Copy SourceFiles="$(SolutionDir)Assets\*.html;$(SolutionDir)Assets\*.xml" DestinationFolder="$(OutputPath)Assets\" /> </Target>
三、迁移bat中的Wix构建逻辑到MSBuild
原bat里的candle/light参数、文件采集、签名等操作,完全可以整合到.wixproj的现有构建流程中:
1. 自定义文件采集(替代原Heat命令)
如果需要自定义文件采集规则,在.wixproj中添加HeatDirectory任务,替代原bat里的Heat调用:
<Target Name="HarvestProductFiles" BeforeTargets="Compile"> <HeatDirectory Directory="$(SolutionDir)YourProduct\bin\$(Configuration)" OutputFile="$(ProjectDir)HarvestedFiles.wxs" ComponentGroupName="ProductComponents" DirectoryRefId="INSTALLFOLDER" AutogenerateGuids="true" SuppressCom="true" SuppressRootDirectory="true" ToolPath="$(WixToolPath)" /> </Target>
2. 传递参数给Candle/Light
原bat里的UPGRADECODEGUID、合并模块路径等参数,通过MSBuild属性传递给Candle和Light:
<PropertyGroup> <CandleAdditionalArgs>-dUPGRADECODEGUID=$(UpgradeCodeGuid) -dMergeModulePath=$(MergeModulePath)</CandleAdditionalArgs> <LightAdditionalArgs>-ext WixUIExtension -ext WixUtilExtension</LightAdditionalArgs> </PropertyGroup>
3. 安装包签名(Signtool)
在构建完成后添加签名Target,替代原bat里的签名步骤:
<Target Name="SignInstaller" AfterTargets="Build"> <Exec Command="signtool sign /f $(env:CERT_FILE_PATH) /p $(env:CERT_PASSWORD) $(OutputPath)YourInstaller.msi" /> </Target>
证书路径和密码可以通过环境变量或CI/CD平台参数传递。
四、适配TeamCity与命令行构建
- 命令行构建:直接用
msbuild或dotnet build命令,指定配置和参数即可:
# 发布构建 msbuild YourInstaller.wixproj /p:Configuration=Release /p:UpgradeCodeGuid=YOUR-GUID-VALUE # 每日构建 msbuild YourInstaller.wixproj /p:Configuration=Daily
- TeamCity配置:
- 添加MSBuild构建步骤,选择你的
.wixproj文件。 - 在构建参数中定义
UpgradeCodeGuid、CERT_FILE_PATH等变量,对应MSBuild属性。 - 配置构建触发器(定时触发每日构建、标签触发发布构建),对应原NAnt的不同构建目标。
- 拉取代码的逻辑直接用TeamCity自带的VCS checkout功能,无需在MSBuild中重复实现。
- 添加MSBuild构建步骤,选择你的
五、迁移过渡技巧
如果原bat里有复杂的脚本逻辑,暂时可以用<Exec>命令直接调用原有bat,逐步替换为MSBuild原生任务,降低迁移风险:
<Target Name="LegacyBuildSteps" BeforeTargets="Compile"> <Exec Command="$(SolutionDir)Scripts\OldWixBuildSteps.bat $(Configuration)" /> </Target>
内容的提问来源于stack exchange,提问作者Todd Hoatson
相关产品推荐
相关产品推荐

