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

