首页 > 解决方案 > 如何在 WIX 安装程序配置中不指定文件名的情况下从源文件夹复制所有文件

问题描述

这是用于复制单个文件的 WXS 文件内容

      <Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="MergeRedirectFolder">
    <Component Id="owcF3EB3D7C133F5B48E5859309ABDC2EE0" Guid="5a6040ae-b91e-47b6-8438-d9cd47fb947a">
      <File Id="owfF3EB3D7C133F5B48E5859309ABDC2EE0" 
     Source="$(var.SourceDir)\api-ms-win-core-console-l1-1-0.dll" KeyPath="yes" />
    </Component>
    <Component Id="owcB0E3C7251F136710A0F11E0C18525364" Guid="f80e6202-0436-d488-52cf-827e37483096">
      <File Id="owfB0E3C7251F136710A0F11E0C18525364" 
      Source="$(var.SourceDir)\api-ms-win-core-datetime-l1-1-0.dll" KeyPath="yes" />
    </Component>
    <Component Id="owc4B0AD9DF281D253C1207D4E82DEB0DD2" Guid="4ac4edbd-2c6a-8aed-125e-11237a36e4f8">
     <File Id="owf0E5D53A7E23AE08AF9D984ADC41AC589"

     Source="$(var.SourceDir)\publish\sos_amd64_amd64_4.6.26628.05.dll" KeyPath="yes" />

我已将我的源目录定义如下

    <?define SourceDir="..\..\Services\bin\Debug\netcoreapp2.1\win7-x64\"?>

如何指定 WIX 来复制所有文件,而不是在每一行中指定一个?

为什么?

我在不同的机器上发布具有不同版本的输出文件,所以我不想在 WIX 配置中硬编码文件版本。

发布文件夹有以下文件取决于它发布的系统

在开发机器中,我有文件 sos_amd64_amd64_4.6.26725。06

在 Build machine中,我有文件 sos_amd64_amd64_4.6.26725。05

如果您看到 ,则上述文件中的版本不同。因此,由于 *.wxs 文件中的版本不匹配,Wix 构建失败。所以我想从文件夹中读取所有文件,而不是指定单个文件。

更新

通过自动生成组件文件解决的问题

      <HeatDirectory OutputFile="ComponentsGenerated.wxs" 
               DirectoryRefId="INSTALLFOLDER" 
               Transforms="Filter.xslt" 
               ComponentGroupName="PublishedComponents" 
               SuppressCom="true" 
               Directory="..\..\Service\bin\$(Configuration)\netcoreapp2.1\win-$(Platform)\publish" 
               SuppressFragments="true" SuppressRegistry="true" 
               SuppressRootDirectory="true" 
               AutoGenerateGuids="false" 
               GenerateGuidsNow="true" 
               ToolPath="$(WixToolPath)" 
               PreprocessorVariable="var.BasePath" />

奖金

由于我必须安装和运行 Windows 服务,所以我使用了 Transforms 方法来删​​除组件 WXS 文件中生成的 EXE。

我现在喜欢 Wix!

标签: visual-studiowixiswix

解决方案


我可以从创作中看到您正在使用 IsWiX(免责声明:我是作者)。IsWiX 旨在仅支持静态创作,而不是您尝试进行的创作。我已经写了很多次博客,为什么我觉得这样做更安全,但在 Stack Overflow 上讲述这个故事通常不会很好。

也就是说,IsWiX 不会阻止你做你想做的事。一般来说,我建议做的是:

在代码文件夹的主设置项目中,创建一个名为“HarvestedComponents.wxs”的新 wxs 片段

如果使用 Git,则将此空文件提交到源代码管理并将其添加到您的 .gitignore 中。

将以下内容放在项目的预构建步骤中

C:\Program Files (x86)\WiX Toolset v3.11\bin\heat.exe" dir "$(SolutionDir)Deploy\Path-To-Some-Directory-To-Harvest" -dr INSTALLLOCATION -cg HarvestedComponents -gg -g1 -sf -srd -scom -sreg -ke -var "var.Deploy" -out "$(SolutionDir)ClientTools\Code\harvestedcomponents.wxs

您必须稍微调整一下以匹配 Features.wxs 中所需的目录结构。

构建项目并注意 HarvestedComponents.wxs 获取数据。您不想将其提交给源代码管理,但如果您这样做应该不会受到伤害。我不会。

现在要将这些收集到的组件连接到您的安装程序,您需要编辑 Code\Features.wxs。添加:

<ComponentGroupRef Id="HarvestedComponents" />

到您希望这些组件关联的功能。

最终的 MSI 现在将动态地将这些文件夹/文件与您使用 IsWiX 在 mege 模块 wxs 中静态定义的任何内容一起创建到 MSI 中。

注意:请注意,这种方法需要权衡取舍。主要是:

http://blog.iswix.com/2007/06/dealing-with-very-large-number-of-files.html

我也想知道为什么你的sos工件在开发盒上是06版,在构建盒上是05版。这种情况多久改变一次?如果这只是版本不匹配并且工件很少更改,那么您可能正在解决错误的问题。如果版本被设计为由构建环境控制并且经常更改并且文件夹名称和文件名因版本而异,那么这可能是满足您需求的正确解决方案。


推荐阅读