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

如何在WiX Toolset 5的Bundle中引用外部文件夹的.wxs文件

解决方案:通过NuGet包分发WiX依赖的PackageGroup

1. 构建包含WiX配置与EXE的NuGet包

核心是让NuGet包自动把OtherProductDependency.wxs和对应EXE注入到引用项目中,避免手动维护相对路径:

  • 创建OtherProduct.nuspec,指定要打包的文件路径:
    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
      <metadata>
        <id>OtherProduct</id>
        <version>1.2.3.0</version>
        <authors>YourTeam</authors>
        <description>WiX dependency package for OtherProduct</description>
      </metadata>
      <files>
        <!-- 打包EXE到NuGet包的content目录 -->
        <file src="bin\Release\OtherProduct.exe" target="content\OtherProduct" />
        <!-- 打包WiX配置文件 -->
        <file src="OtherProductDependency.wxs" target="content\wix" />
        <!-- 打包MSBuild配置文件,自动引入WiX文件并传递变量 -->
        <file src="OtherProduct.props" target="build" />
      </files>
    </package>
    
  • 编写OtherProduct.props,让引用项目自动包含WiX文件并获取EXE版本:
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <!-- 定义EXE的路径(基于NuGet包的安装位置) -->
        <OtherProductExePath>$(MSBuildThisFileDirectory)..\content\OtherProduct\OtherProduct.exe</OtherProductExePath>
      </PropertyGroup>
    
      <!-- 自动获取EXE的版本号 -->
      <Target Name="ResolveOtherProductVersion" BeforeTargets="Compile">
        <GetAssemblyIdentity AssemblyFiles="$(OtherProductExePath)">
          <Output TaskParameter="Assemblies" ItemName="OtherProductAssembly" />
        </GetAssemblyIdentity>
        <PropertyGroup>
          <OtherProductVersion>%(OtherProductAssembly.Version)</OtherProductVersion>
        </PropertyGroup>
      </Target>
    
      <!-- 自动将WiX配置文件加入项目编译 -->
      <ItemGroup>
        <WixInclude Include="$(MSBuildThisFileDirectory)..\content\wix\OtherProductDependency.wxs" />
      </ItemGroup>
    </Project>
    

2. 改造WiX配置文件,使用动态变量

修改OtherProductDependency.wxs,用MSBuild变量替代硬编码的版本和路径,确保和NuGet包内的EXE版本同步:

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <PackageGroup Id="OtherProductDependency">
    <ExePackage
      SourceFile="$(var.OtherProductExePath)"
      Version="$(var.OtherProductVersion)"
      InstallCommand="/install /quiet"
      DetectCondition="OtherProductInstalledVersion &gt;= $(var.OtherProductVersion)"
      Permanent="no"
    />
  </PackageGroup>
</Wix>

3. 主Bundle项目快速引入依赖

  • 在主WiX项目中安装OtherProduct NuGet包
  • 在Bundle配置中直接引用PackageGroup:
    <Bundle>
      <Chain>
        <PackageGroupRef Id="OtherProductDependency" />
        <!-- 你的主安装包 -->
        <MsiPackage SourceFile="$(var.MainInstaller.TargetPath)" />
      </Chain>
    </Bundle>
    

关键注意点

  • 避免手动使用..\packages\OtherProduct\...这类相对路径,NuGet包的实际位置可能因PackageReference格式(全局缓存)或项目结构变化而改变,通过MSBuild属性动态获取路径更可靠
  • 发布新版本OtherProduct时,只需更新NuSpec的版本号,重新打包发布即可,引用项目更新NuGet包后会自动同步EXE和WiX配置的版本

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:23:22