如何从源文件夹复制所有文件,而不在WIX安装程序配置中指定文件名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从源文件夹复制所有文件,而不在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)publishsos_amd64_amd64_4.6.26628.05.dll" KeyPath="yes" />

我已经定义了我的源目录如下

    <?define SourceDir="....ServicesinDebug
etcoreapp2.1win7-x64"?>

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

为什么?

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

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

在Dev机器中,我有文件sos_amd64_amd64_4.6.26725.06

在Build机器中,我有文件sos_amd64_amd64_4.6.26725.05

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

更新

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

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

奖金

由于我必须安装并运行Windows服务,因此我使用Transforms方法删除组件WXS文件中生成的EXE。

我现在很喜欢Wix!

答案

我可以从创作中看到你使用的是IsWiX(免责声明:我是作者)。 IsWiX旨在仅支持静态创作,而不是您尝试创作的那种创作。我已多次写博客,为什么我认为这样做更安全,但告诉Stack Overflow上的故事通常不会很好。

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

在Code文件夹的主安装项目中,创建一个名为“HarvestedComponents.wxs”的新wxs片段

如果使用Git,请将此空文件提交给源代码控制并将其添加到.gitignore。

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

C:Program Files (x86)WiX Toolset v3.11inheat.exe" dir "$(SolutionDir)DeployPath-To-Some-Directory-To-Harvest" -dr INSTALLLOCATION -cg HarvestedComponents -gg -g1 -sf -srd -scom -sreg -ke -var "var.Deploy" -out "$(SolutionDir)ClientToolsCodeharvestedcomponents.wxs

你必须稍微调整一下,以匹配Features.wxs中你想要的目录结构。

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

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

<ComponentGroupRef Id="HarvestedComponents" />

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

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

注意:请注意这种方法存在折衷。主要是:

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

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

以上是关于如何从源文件夹复制所有文件,而不在WIX安装程序配置中指定文件名的主要内容,如果未能解决你的问题,请参考以下文章

Wix - 如何从安装目录安装后运行exe文件?

如何从以前的非 msi 安装中复制文件?

WiX Burn:如何将安装程序可执行文件部署到某个位置?

如何使用 wix 3.8 安装程序在 windows 文件夹中创建文件夹

如何使用 WiX 从源代码重建完全相同的 msi 文件?

从 Wix Bootstrapper Bundle 检查文件版本