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

WiX4中HarvestProject无法完整采集项目二进制文件问题求助

WiX4中HarvestProject无法完整采集项目二进制文件问题求助

我正在用WiX4(目前还是RC版本)做一个安装器项目,团队要求必须基于这个版本开发。为了采集要安装的目标项目内容,我用了HarvestProject工具,但目标项目里有200多个DLL文件,这些二进制文件都没被采集到,我到底哪里操作错了?

因为公司保密规定和文件长度限制,我只能贴出部分关键代码片段:

.wixproj 配置片段

<Project Sdk="WixToolset.Sdk/4.0.0-rc.2">

<PropertyGroup>

<PreBuildEvent />

<BuildVersion>0</BuildVersion>

<DefineConstants>Version=$(BuildVersion)</DefineConstants>

<EnableProjectHarvesting>true</EnableProjectHarvesting>

<HarvestProjectsSuppressUniqueIds>true</HarvestProjectsSuppressUniqueIds>

<HarvestProjectsDirectoryIds>HARVESTROOT</HarvestProjectsDirectoryIds>

<HarvestProjectsVerboseOutput>true</HarvestProjectsVerboseOutput>

</PropertyGroup>

<ItemGroup>

<PackageReference Include="WixToolset.UI.wixext" Version="4.0.0-rc.3" />

<PackageReference Include="WixToolset.Util.wixext" Version="4.0.0-rc.3" />

<PackageReference Include="WixToolset.Heat" Version="4.0.0-rc.3" />

</ItemGroup>

<Target Name="BeforeBuild">

<HarvestProject Include="..\Project.Cockpit\Project.Cockpit.csproj" ProjectOutputGroups="Binaries;Content;Satellites;Documents;Symbols">

</HarvestProject>

</Target>

<ItemGroup>

<ProjectReference Include="..\Project.Cockpit\Project.Cockpit.csproj" />

</ItemGroup>

</Project>

package.wxs 配置片段

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">

<?if $(var.Platform) = x64?>

<?define ProductCode="{7CB9D807-FBE2-43F6-BE10-4D11F3710CC4}"?>

<?else?>

<?define ProductCode="{B3311294-346C-488B-BEA3-99E8C007F6F4}"?>

<?endif?>

<?define UpgradeCode="{CEC07130-016B-4F2F-8700-C1C21AD095FF}"?>

<?define BuildVersion="0.0.1"?>

<?define Name=""?>

<?define Manufacturer=""?>

<Package Name="$(var.Name)"

Manufacturer="$(var.Manufacturer)"

Version="$(var.BuildVersion)"

UpgradeCode="$(var.ProductCode)"

Scope="perMachine"

>

<MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" AllowSameVersionUpgrades="false"/>

<MediaTemplate EmbedCab="true"/>

<UI>

<!-- Public Fonts -->

<TextStyle Id="Font" Bold="false" FaceName="Tahoma" Size="12"/>

<UIRef Id="Installer_UI"/>

</UI>

<Feature Id="Main">

<ComponentGroupRef Id="MainComponents" />

</Feature>

<StandardDirectory Id="TARGETDIR">

<Directory Id="INSTALLFOLDER" Name="App">

<Directory Id="HARVESTROOT" ComponentGuidGenerationSeed="3EA2F4ED-C5FD-409C-9FCF-144AB5ECF085" />

</Directory>

</StandardDirectory>

<ComponentGroup Id="MainComponents" Directory="INSTALLFOLDER">

<ComponentGroupRef Id="Project.Cockpit.Binaries" />

</ComponentGroup>

</Package>

</Wix>

生成的_generated.wxs 片段

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">

<Fragment>

<DirectoryRef Id="Project.Binaries">

<Component Id="Project.Binaries.Cockpit.runtimeconfig.json" Guid="*">

<File Id="Project.Binaries.Cockpit.runtimeconfig.json" Source="$(var.Project.Cockpit.TargetDir)\Cockpit.runtimeconfig.json" />

</Component>

<Component Id="Project.Cockpit.Binaries.Cockpit.dll" Guid="*">

<File Id="Project.Cockpit.Binaries.Cockpit.dll" Source="$(var.Project.TargetDir)\Project.Cockpit.dll" />

</Component>

</DirectoryRef>

</Fragment>

<Fragment>

<ComponentGroup Id="Project.Cockpit.Binaries">

<ComponentRef Id="Project.Cockpit.Binaries.Cockpit.runtimeconfig.json" />

<ComponentRef Id="Project.Cockpit.Binaries.Cockpit.dll" />

</ComponentGroup>

</Fragment>

</Wix>

我试过各种采集项目的方式,修改ProjectOutputGroups也没任何效果;尝试按照官方文档的方式用Harvest采集,还出现了组件ID重复的错误。有没有办法解决这个问题?我刚接触WiX4,可能漏掉了某些关键配置。


2024年6月10日更新

后来我放弃了HarvestProject,改用HarvestDirectory的方式才解决了问题,以下是相关配置:

.wixproj 新增配置片段

<When Condition="'$(Configuration)' == 'Release'">
<ItemGroup>
<HarvestDirectory HarvestDirectoryTransforms=".\transformation.xslt" Include="$(BUILD_ARTIFACTSTAGINGDIRECTORY)\your.project.path.here\bin\$(Configuration)\net7.0\">
<ComponentGroupName>HarvestedComponents</ComponentGroupName>
<DirectoryRefId>INSTALLFOLDER</DirectoryRefId>
<SuppressRootDirectory>True</SuppressRootDirectory>
<Transforms>.\transformation.xslt</Transforms>
</HarvestDirectory>
<BindPath Include="$(BUILD_ARTIFACTSTAGINGDIRECTORY)\your.project.path.here\bin\$(Configuration)\net7.0\" />
</ItemGroup>
</When>

因为要把EXE做成Windows服务,需要从采集结果中移除这个EXE,所以用了XSLT转换:

transformation.xslt 配置

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://wixtoolset.org/schemas/v4/wxs"
exclude-result-prefixes="wix">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="wix:Component[wix:File[contains(@Source,'Your.Project.exe')]]" />
<xsl:template match="wix:ComponentRef[@Id=//wix:Component[wix:File[contains(@Source,'Your.Project.exe')]]/@Id]" />
</xsl:stylesheet>

package.wxs 中Feature配置片段

<Feature Id="Main">
<ComponentGroupRef Id="HarvestedComponents"/>
<ComponentGroupRef Id="WindowsServiceComponent"/>
</Feature>

单独定义的WindowsServiceComponent

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<Fragment>
<ComponentGroup Id="WindowsServiceComponent" Directory="INSTALLFOLDER">
<Component Id="ServiceComponent" Guid="{4BF6C260-453A-45AB-973D-339A7B4AADB4}">
<File Id="ServiceExecutable" KeyPath="yes" Source="$(var.your.Project.TargetDir)\Your.Project.exe" />
<ServiceInstall
Name="service_name_here"
DisplayName="display_name_here"
Description="service_description_here"
Type="ownProcess" Start="auto" ErrorControl="ignore"
/>
<ServiceControl Name="service_name_here" Remove="uninstall" Stop="uninstall"/>
</Component>
</ComponentGroup>
</Fragment>
</Wix>

备注:内容来源于stack exchange,提问作者Flori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:52:38