使用Wix将整个目录添加到MSI数据库的规范方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Wix将整个目录添加到MSI数据库的规范方法是什么?相关的知识,希望对你有一定的参考价值。

我需要将整个目录打包到我使用Wix构建的MSI文件中。

该目录位于非本地(构建脚本等)位置,例如C:\path\to\baz

目的是将目录安装在目标主机(MSI打算运行的地方)上,如%ProgramFiles%\foobar\baz,它是我正在开发的软件的依赖项。

Wix的heat程序似乎是为这项工作而设计的 - 收集目录的内容(baz)并生成Wix源文件。我把它当作:

heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz baz.heat.wxs

问题是heatSourceDir\verbatim添加到它所找到的每个文件的路径:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="baz" />
    </Fragment>
    <Fragment>
        <ComponentGroup Id="electron">
            <Component Id="cmp9C432873A67498F6C219E9E15596F0D8" Directory="baz" Guid="33D27AF6-A2E4-459C-818B-876268705883">
                <File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="SourceDir\api-ms-win-core-console-l1-1-0.dll" />
            </Component>
            <!-- Other Component and nested File elements omitted. -->
        </ComponentGroup>
    </Fragment>
<Wix>

我不知道它为什么这样做,我知道有一些东西,比如binder变量和其他类型的变量,但无论如何,Wix链接器不会组装MSI,因为它无法获取生成的源XML文件中指定的文件:

baz.heat.wxs(12) : error LGHT0103 : The system cannot find the file 'SourceDir\api-ms-win-core-console-l1-1-0.dll'

我正在链接heat生成的源文件,如上所述,以及我称之为“主”的源文件,该文件实际定义了已安装的功能以及将安装baz目录的位置:

<?xml version="1.0" encoding="utf-8" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Name="Foobar" Manufacturer="Acme" Id="2c05b2af-3adf-4901-b126-5a839c67978d" UpgradeCode="6db7d46b-5152-4e67-9615-c3f3c4dc205c" Language="1033" Codepage="1252" Version="7.0.0">
        <Package Id="*" Description="Acme Foobar Installer" Languages="1033" SummaryCodepage="1252" Compressed="yes" InstallerVersion="200" Keywords="Installer" Manufacturer="Acme" />
        <MediaTemplate EmbedCab="yes" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="Foobar">
                    <Directory Id="baz" Name="baz" />
                </Directory>
            </Directory>
        </Directory>
        <Feature Id="lanthir" Level="1">
            <ComponentGroupRef Id="baz" />
        </Feature>
</Product>

我想知道:

  • 除了逐字目录参考,SourceDir还有什么别的吗?
  • 什么是规范的方法,使heat生成可以原样链接的正确路径没有问题或使链接器工具(light)解析由heat默认生成的路径?

我有一种感觉,我正在解决一个非常简单和常见的问题,应该有一个非常着名和明显的解决方案。我更愿意为链接器提供一个变量,这样每当我需要嵌入的目录的实际路径发生变化时,我就不必重新生成源文件。

答案

您需要在加热时使用-var命令行开关。这将用$(var.WhateverYouPutAfterTheVarArg)替换SourceDir。

例如

heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz -var var.BazDir baz.heat.wxs 

应该导致更像的东西

<File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="$(var.BazDir)\api-ms-win-core-console-l1-1-0.dll" />

然后,您需要为BazDir设置一个值。我倾向于通过更新wixproj文件来做到这一点

  <PropertyGroup>
     <ProjectDefineConstants>BazDir=PathToBazDirectory;$(ProjectDefineConstants)</ProjectDefineConstants>
  </PropertyGroup>

以上是关于使用Wix将整个目录添加到MSI数据库的规范方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行

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

无法将我的 WiX 自定义操作安排到 msi

使用 WiX 为 InstallShield 安装程序创建 msi 包装器

WiX - 将参数从 MSI 传递到 Xeam 引导程序应用程序

WiX和DTF介绍