如何在 WiX 刻录中包含可修改的松散文件?

How to include a modifiable loose file in WiX burn?

我有一个包含非压缩文件的安装包。

1
2
3
4
5
6
7
8
9
<DirectoryRef Id="INSTALLLOCATION">
  <Component Id="LocationConfig">
    <File Id="LocationConfigFile"
          Source="LooseFile.Config"
          DiskId="2"
          Vital="no"
          Compressed="no" />
  </Component>
</DirectoryRef>

此文件松散的目的是为了在安装前对其进行编辑。这可以按需要工作。

我有一个烧录链,指定松散文件作为松散文件包含在引导程序旁边。还要注意使用 SuppressLooseFilePayloadGeneration 以允许将文件手动指定为松散的有效负载。

1
2
3
4
5
6
7
8
<Chain>
  <MsiPackage SourceFile="MyInstaller.msi"
              Visible="yes"
              Vital="no"
              SuppressLooseFilePayloadGeneration="yes">
    <Payload Compressed="no" SourceFile="LooseFile.Config" />
  </MsiPackage>
</Chain>

刻录日志如下所示:

1
2
3
4
5
[3860:38D8][2013-04-26T16:42:48]e000: Error 0x80091007: Hash mismatch for path: C:\\ProgramData\\Package Cache\\.unverified\\payAC32431CF002C09E2F0B537A32ACA259
[3860:38D8][2013-04-26T16:42:48]e000: Error 0x80091007: Failed to verify hash of payload: payAC32431CF002C09E2F0B537A32ACA259
[3860:38D8][2013-04-26T16:42:48]e310: Failed to verify payload: payAC32431CF002C09E2F0B537A32ACA259 at path: C:\\ProgramData\\Package Cache\\.unverified\\payAC32431CF002C09E2F0B537A32ACA259, error: 0x80091007. Deleting file.
[3860:38D8][2013-04-26T16:42:48]e000: Error 0x80091007: Failed to cache payload: payAC32431CF002C09E2F0B537A32ACA259
[33FC:3A54][2013-04-26T16:42:48]e314: Failed to cache payload: payAC32431CF002C09E2F0B537A32ACA259 from working path: C:\\Users\\Snixtor\\AppData\\Local\\Temp\\{c887e0cf-5038-4e15-95b1-8510d8c96b88}\\payAC32431CF002C09E2F0B537A32ACA259, error: 0x80091007.

好的,由于文件已更改,哈希失败。但是...我想允许用户更改文件。我可以很容易地使用标准安装程序包做到这一点,那么我必须跳过哪些箍才能让它与引导程序一起运行?

我在 WiX 用户邮件列表中发现了这个讨论。 Rob 对"它应该可以正常工作"的回应听起来很有希望,但随后讨论似乎继续暗示它可能是一个错误?如果作者曾经提出过错误报告,我找不到它。

我考虑的另一种方法是从引导有效负载中完全排除该文件,然后在安装过程中手动将其复制到 MSI 缓存路径,以便 MSI 可以找到它,尽管 burn 永远不会尝试验证它。但是我看到的两个麻烦是:

  • 我不知道如何从我的引导程序中发现缓存路径。
  • 即使我知道路径,我也需要提升引导程序来复制文件。这可能不是一个引人注目的,但我有一个偷偷摸摸的怀疑它可能会被证明是困难的。

  • 今天不支持此功能。出于安全原因,Burn 会在将所有内容放入缓存之前对其进行验证。您可以做的是读取自定义 Bootstrapper Application 中的外部文件并将结果存储为持久化 Variables。这将是更多的工作,但 Burn 不会信任与构建时插入的安全哈希/签名不匹配的文件。


    我通过挂起烧录引导程序设置的当前目录属性并将其与 copyfile 元素一起使用来解决相同的问题,如下所示:

    1
    2
    3
    4
      <Component Id="SettingsFile" Guid="...">
        <CopyFile Id="Copy" Delete="no" DestinationDirectory="INSTALLFOLDER" SourceName="LooseSettings.xml" SourceProperty="CURRENTDIRECTORY" />
        <RemoveFile Id="Remove" On="uninstall" Directory="INSTALLFOLDER" Name="LooseSettings.xml" />
      </Component>

    它很可能存在一些问题,但我正在根据其他人的规范编写安装程序,它似乎可以工作