WiX安装程序不创建任何目录

3

WiX 3.5。我的安装项目除了以下操作外什么都不做:

  1. 创建一个带有值的注册表键;
  2. 安装两个证书。

WiX项目能否在没有任何"Directory"元素的情况下构建?

这是我WiX项目中的XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
  <Product
        Id="GUID"
        Name="SetupProject1" Language="1033" Version="1.0.0.0"
        Manufacturer="SetupProject1" UpgradeCode="GUID">
    <Package InstallerVersion="200" Compressed="yes" Languages="1033" SummaryCodepage="1252" />

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Binary Id="testRootCABinaryStream"
            SourceFile="D:\testRootCA.cer" />
    <Binary Id="testSigningBinaryStream"
            SourceFile="D:\testSigning.cer" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLLOCATION" Name="SetupProject1">
          <Component Id="RegistrySetting" Guid="GUID">
            <iis:Certificate Id="testRootCA"
                             BinaryKey="testRootCABinaryStream"
                             Name="Test Root CA Certificate"
                             Overwrite="yes"
                             Request="no"
                             StoreLocation="localMachine"
                             StoreName="root"/>
            <iis:Certificate Id="testSigning"
                             BinaryKey="testSigningBinaryStream"
                             Name="Test Signing Certificate"
                             Overwrite="yes"
                             Request="no"
                             StoreLocation="localMachine"
                             StoreName="trustedPublisher"/>
            <RegistryValue Root="HKLM" Key="Software\Microsoft\Silverlight"
                           Name="AllowElevatedTrustAppsInBrowser"
                           Type="integer" Value="00000001" KeyPath="yes" />
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="Complete" Title="SetupProject1" Level="1">
      <ComponentRef Id="RegistrySetting" />
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>
  </Product>
</Wix>

实际上,这段代码并没有在“Program Files”文件夹中创建任何目录,但是如果我在没有Directory元素的情况下编译我的项目(在我的情况下,Component元素紧随Binary元素之后),它会失败,并显示以下错误:“未找到Component / @Directory属性;它是必需的。”更新:感谢Yan提供详细的答案。现在我的目录部分的代码片段看起来像这样(现在更正确):
<Directory Id="TARGETDIR" Name="SourceDir" />

<DirectoryRef Id="TARGETDIR">
  <Component  Id="CompleteInstallation" Guid="Guid">
    <iis:Certificate Id="testRootCA"
                     BinaryKey="testRootCABinaryStream"
                     Name="Test Root CA Certificate"
                     Overwrite="yes"
                     Request="no"
                     StoreLocation="localMachine"
                     StoreName="root"/>
    <iis:Certificate Id="testSigning"
                     BinaryKey="testSigningBinaryStream"
                     Name="Test Signing Certificate"
                     Overwrite="yes"
                     Request="no"
                     StoreLocation="localMachine"
                     StoreName="trustedPublisher"/>
    <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
    <RegistryKey Root="HKLM" Key="Software\Microsoft\Silverlight">
      <RegistryValue Name="AllowElevatedTrustAppsInBrowser"
                     Type="integer" Value="00000001" KeyPath="yes" />
    </RegistryKey>
  </Component>
</DirectoryRef>
2个回答

11

这种行为的根源可以追溯到Windows Installer架构。正如您所知,WiX是一组用于创建Windows Installer软件包的工具,也就是说,它必须在某种程度上反映此技术的关键概念,并将最奇怪和荒谬的内容隐藏在语法糖背后。它做得非常出色,版本不断升级!

每个Windows Installer软件包都必须包含一个Directory表。来自MSDN

Directory表必须指定一个单独的根目录,其Directory列值等于TARGETDIR属性。

相应的WiX元素是:

<Directory Id="TARGETDIR" Name="SourceDir">
  ...
</Directory>

所以,这必须在您的 WiX 作者中。如果您不计划在安装中拥有任何目录/文件,则可以将组件直接放置在此根Directory元素下面。


2
您必须在组件元素上自行设置Directory属性,如果您将其直接放置在Product下面,因为这是必需的。
从文档中可以看出:
设置组件的目录。如果该元素嵌套在Directory元素下,则此值默认为父Directory/@Id的值。
事实证明,在Windows Installer参考中指出Component需要具有指向directory table中记录的directory_属性,或者通过从AppSearch获取的值来指向它。如果AppSearch为空,我不确定这将如何运作。

那么,这个Directory元素的含义是什么?实际上,在我的安装中我不需要目录。这是否只是WiX某种传统或特殊内部逻辑的问题,无法在没有目录的情况下创建组件呢? - user808128
Wix只是Windows Installer的声明性包装器,它必须遵守Windows Installer API设置的规则。 - rene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接