恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
WiX Toolset 的 HarvestProjects 目标:从 MSBuild 项目自动生成 WiX 安装脚本
首页
资讯中心
/
WiX Toolset 的 HarvestProjects 目标:从 MSBuild 项目自动生成 WiX 安装脚本
WiX Toolset 的 HarvestProjects 目标:从 MSBuild 项目自动生成 WiX 安装脚本
发布时间:2026/10/5 6:50:38
开发工具构建工具【免费下载链接】wix3WiX Toolset v3.x项目地址https://gitcode.com/gh_mirrors/wi/wix3点击查看免费下载本文围绕 WiX Toolset v3.x 的 MSBuild 集成机制讲解HarvestProjects目标Target的工作原理、启用方式与全部可配置项。通过本文你将掌握如何让 WiX 工程在编译前自动收割Harvest其他 .NET / MSBuild 项目的输出并将其转换为可被 Candle 编译的 .wxs 源码从而减少手工编写安装脚本的工作量。一、HarvestProjects 目标是什么在 WiX Toolset 的 MSBuild 集成WixTasks中HarvestProjects是一个内置构建目标其职责是把HarvestProject项Item传递给 HeatProject 任务从而从一个项目文件如.csproj、.vbproj中生成 WiX 编写代码authoring。HeatProject 任务底层包装的是heat.exeWiX 收割器使用project收割类型-project操作。这一点可以从源码得到印证heatproject.cs 中HeatProject类继承自HeatTask其OperationName返回project见 heatproject.cs并在GenerateResponseFileCommands()中拼装-project、-configuration、-platform、-pog、-wixvar等 heat.exe 命令行参数见 heatproject.cs。为什么默认关闭项目收割默认是禁用的因为它在某些项目类型上并不总能正确工作。在 wix.targets 中可以看到明确的注释与默认值!-- Project harvesting is defaulted to off until it works more consistently. -- EnableProjectHarvesting Condition $(EnableProjectHarvesting) false/EnableProjectHarvesting如何启用在你自己的 WiX 项目文件.wixproj顶部添加如下PropertyGroup即可开启PropertyGroup EnableProjectHarvestingTrue/EnableProjectHarvesting /PropertyGroup二、执行时机与产物流向一旦启用HarvestProjects目标会在编译之前被处理。在 wix.targets 中目标声明如下Target NameHarvestProjects DependsOnTargets$(HarvestProjectsDependsOn) Inputs(_AllHeatProjects);%(_AllHeatProjects.Transforms);$(MSBuildAllProjects);$(ProjectPath) Outputs(_AllHeatProjects - %(HeatOutput)) Condition $(EnableProjectHarvesting) and ((HeatProject) ! or (HarvestProject) ! ) 其执行位置在构建依赖链中与ConvertReferences、ConvertBundleReferences等目标配合见 wix.targets 与 wix.targets对Package/PatchCreation/Module类型的项目ConvertReferences会把项目引用_MSBuildProjectReferenceExistent自动转换为HeatProject项对Bundle类型的项目ConvertReferences的对应版本ConvertBundleReferences会额外指定GenerateTypepayloadgroup将输出收割为 bundle payload。收割完成后生成的源码会通过Output参数被自动添加到Compile项组中交给 Candle 任务 编译Output TaskParameterOutputFile ItemNameCompile / Output TaskParameterOutputFile ItemNameFileWrites /见 wix.targets三、声明要收割的项目在.wixproj中通过ItemGroup声明需要收割的项目。官方文档给出的示例为ItemGroup HeatProject Include..\TestProject\TestProject.csproj ProjectOutputGroupsBinaries;Sources/ProjectOutputGroups /HeatProject /ItemGroup注意HeatProject项组仅出于向后兼容而保留新代码建议统一使用HarvestProject项。两者的元数据会被 CombineHarvestProjects 目标 合并为统一的_AllHeatProjects集合并为未显式指定输出文件的项目自动补全HeatOutput元数据默认输出到$(IntermediateOutputPath)_%(HeatProject.Filename).wxs。四、Items 参考以下项与项元数据供HarvestProjects目标使用Item 或 Metadata说明(HarvestProject)必填项组。要收割的项目列表。HeatProject项组仅为向后兼容而提供。%(HarvestProject.ProjectOutputGroups)可选string元数据。要收割的项目输出组多个输出组用分号分隔。常见取值如Binaries、Sources。%(HarvestProject.Transforms)可选string元数据。应用于生成 WiX 源码的 XSL 转换多个转换文件用分号分隔。在 wix.targets 中ItemDefinitionGroup为HeatProject与HarvestProject预置了默认元数据全局属性会回填到每一项ItemDefinitionGroup HeatProject Transforms$(HarvestProjectsTransforms)/Transforms ProjectOutputGroups$(HarvestProjectsProjectOutputGroups)/ProjectOutputGroups DirectoryIds$(HarvestProjectsDirectoryIds)/DirectoryIds /HeatProject HarvestProject Transforms$(HarvestProjectsTransforms)/Transforms ProjectOutputGroups$(HarvestProjectsProjectOutputGroups)/ProjectOutputGroups DirectoryIds$(HarvestProjectsDirectoryIds)/DirectoryIds /HarvestProject /ItemDefinitionGroup此外CombineHarvestProjects之后每个项目的HeatOutput元数据会被传给 HeatProject 任务的OutputFile参数见 wix.targets。五、Properties 参考以下属性Property控制HarvestProjects目标的行为。默认值回填逻辑可在 wix.targets 中看到——每个HarvestProjects*属性在未显式设置时会回退到对应的Harvest*通用属性。Property说明$(HarvestProjectsAutogenerateGuids)可选boolean。是否生成依赖组件 GUID 自动生成的源码。若指定则取$(HarvestAutogenerateGuids)否则默认为true。$(HarvestProjectsGenerateGuidsNow)可选boolean。是否在收割时生成持久的durableGUID。若指定则取$(HarvestGenerateGuidsNow)否则默认为false。$(HarvestProjectsNoLogo)可选boolean。是否显示 heat.exe 的 Logo。若指定则取$(NoLogo)否则默认为false。$(HarvestProjectsProjectOutputGroups)可选string。对所有项目生效的全局输出组设置多个输出组用分号分隔。该全局属性仅在 MSBuild 4.0 / Visual Studio 2010 及更新版本可用。$(HarvestProjectsSuppressAllWarnings)可选boolean。抑制所有警告。若指定则取$(HarvestSuppressAllWarnings)否则默认为false。$(HarvestProjectsSuppressFragments)可选boolean。是否抑制生成独立的 Fragment。若指定则取$(HarvestSuppressFragments)否则默认为true。$(HarvestProjectsSuppressSpecificWarnings)可选string。抑制指定的某些警告。若指定则取$(HarvestSuppressSpecificWarnings)。$(HarvestProjectsSuppressUniqueIds)可选boolean。是否抑制生成唯一组件 ID。若指定则取$(HarvestSuppressUniqueIds)否则默认为false。$(HarvestProjectsTransforms)可选string。应用于所有生成 WiX 源码的 XSL 转换多个转换用分号分隔。若指定则取$(HarvestTransforms)。该全局属性仅在 MSBuild 4.0 / Visual Studio 2010 及更新版本可用。$(HarvestProjectsTreatSpecificWarningsAsErrors)可选string。将某些警告视为错误。若指定则取$(HarvestTreatSpecificWarningsAsErrors)。$(HarvestProjectsTreatWarningsAsErrors)可选boolean。将所有警告视为错误。若指定则取$(HarvestTreatWarningsAsErrors)否则默认为false。$(HarvestProjectsVerboseOutput)可选boolean。要求工具输出详细verbose信息。若指定则取$(HarvestVerboseOutput)。说明表格中 取$(HarvestXxx) 的含义是——该属性未设置时MSBuild 属性回退链先查找同名的通用Harvest*属性若仍为空才使用文档标注的最终默认值。源码中可见HarvestSuppressFragments的最终默认值为true、HarvestSuppressUniqueIds为false等见 wix.targets。六、属性如何映射到 heat.exe 命令行HarvestProjects目标最终调用 HeatProject 任务把上述属性逐一绑定到任务参数HeatProject NoLogo$(HarvestProjectsNoLogo) SuppressAllWarnings$(HarvestProjectsSuppressAllWarnings) SuppressSpecificWarnings$(HarvestProjectsSuppressSpecificWarnings) ToolPath$(WixToolPath) TreatWarningsAsErrors$(HarvestProjectsTreatWarningsAsErrors) TreatSpecificWarningsAsErrors$(HarvestProjectsTreatSpecificWarningsAsErrors) VerboseOutput$(HarvestProjectsVerboseOutput) AutogenerateGuids$(HarvestProjectsAutogenerateGuids) FipsCompliant$(FipsCompliant) GenerateGuidsNow$(HarvestProjectsGenerateGuidsNow) OutputFile%(_AllHeatProjects.HeatOutput) SuppressFragments$(HarvestProjectsSuppressFragments) SuppressUniqueIds$(HarvestProjectsSuppressUniqueIds) Transforms%(_AllHeatProjects.Transforms) Project%(_AllHeatProjects.FullPath) ProjectOutputGroups%(_AllHeatProjects.ProjectOutputGroups) GenerateType%(_AllHeatProjects.GenerateType) DirectoryIds%(_AllHeatProjects.DirectoryIds) ProjectName%(_AllHeatProjects.ProjectName) Configuration%(_AllHeatProjects.Configuration) Platform%(_AllHeatProjects.Platform) RunAsSeparateProcess$(RunWixToolsOutOfProc) GenerateWixVariables$(HarvestProjectsGenerateWixVariables) AdditionalOptions$(HarvestProjectsAdditionalOptions) Output TaskParameterOutputFile ItemNameCompile / Output TaskParameterOutputFile ItemNameFileWrites / /HeatProject这些任务参数最终由 HeatTask.cs 的BuildCommandLine转换为 heat.exe 的开关AutogenerateGuids→-agGenerateGuidsNow→-ggNoLogo→-nologoSuppressFragments→-sfragSuppressUniqueIds→-suidSuppressSpecificWarnings→-sw[N]Transforms→-t transformOutputFile→-out file而项目相关的参数Project、ProjectOutputGroups等则由HeatProject.GenerateResponseFileCommands()生成见 heatproject.cs-project、-configuration、-directoryid、-generate、-platform、-pog、-projectname、-wixvar。其中ProjectOutputGroups参数若为单个字符串且含分号会自动按分号拆分见 heatproject.cs。七、完整示例为项目引用自动生成安装脚本把以上要素组合起来一个完整的.wixproj片段如下?xml version1.0 encodingutf-8? Project xmlnshttp://schemas.microsoft.com/developer/msbuild/2003 !-- 1. 开启项目收割 -- PropertyGroup EnableProjectHarvestingTrue/EnableProjectHarvesting HarvestProjectsProjectOutputGroupsBinaries;Sources/HarvestProjectsProjectOutputGroups HarvestProjectsSuppressFragmentsTrue/HarvestProjectsSuppressFragments HarvestProjectsNoLogoTrue/HarvestProjectsNoLogo /PropertyGroup !-- 2. 声明要收割的项目 -- ItemGroup HarvestProject Include..\TestProject\TestProject.csproj ProjectOutputGroupsBinaries;Sources/ProjectOutputGroups Transforms..\Transforms\strip.xsl/Transforms /HarvestProject /ItemGroup /Project构建时CombineHarvestProjects先为HarvestProject补全HeatOutput元数据随后HarvestProjects目标调用 heat.exe 收割TestProject.csproj的 Binaries 与 Sources 输出组生成的.wxs文件自动进入Compile项组并被 Candle 任务 编译进最终安装包。若对自动生成内容不满意可以借助Transforms元数据应用 XSL 转换进行定制或用HarvestProjectsSuppressFragments控制 Fragment 的生成粒度。关于.wixproj文件的基础结构与编写方式可进一步参考 编写你的第一个 MSBuild 项目HeatProject 任务的完整参数说明见 HeatProject 任务参考。赞分享开发工具构建工具【免费下载链接】wix3WiX Toolset v3.x项目地址https://gitcode.com/gh_mirrors/wi/wix3点击查看免费下载相关推荐WiX Toolset v3.x 的 HarvestDirectory MSBuild Target 完全指南从目录自动生成 WiX 安装包 AuthoringWiX Toolset v3.x 的 HarvestDirectory MSBuild Target 完全指南从目录自动生成 WiX 安装包 Authorin开发工具构建工具WiX Toolset MSBuild 采集目标Harvest Targets完全参考HarvestDirectory / HarvestFile / HarvestProjectsWiX Toolset MSBuild 采集目标Harvest Targets完全参考HarvestDirectory / HarvestFile / H开发工具构建工具将 WiX 项目集成到每日构建不预装工具的 MSBuild 自动化方案WiX Toolset v3.x将 WiX 项目集成到每日构建不预装工具的 MSBuild 自动化方案WiX Toolset v3.x 在 WiX Toolset 中使用 MSBuil开发工具构建工具上一篇SerenityOS 中使用 Fuzzilli 对 LibJS 进行 JavaScript 引擎模糊测试FuzzilliJs 完整构建与运行指南下一篇GDevelop newIDE JS 扩展加载器JsExtensionsLoader源码解析与使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考