没有任何目录的WiX安装

时间:2012-08-22 12:06:50

标签: directory wix

WiX 3.5。我的安装项目什么都不做,除了:

  1. 创建具有值的注册表项;
  2. 安装两个证书。
  3. 可以在没有任何“目录”元素的情况下构建WiX项目吗?

    这是我的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 个答案:

答案 0 :(得分:8)

此行为的根源归结为Windows Installer体系结构。如您所知,WiX是一组用于创建Windows Installer程序包的工具,也就是说,它必须在某种程度上反映这项技术的关键概念,隐藏语法糖背后最奇怪和最荒谬的东西。而且它的工作非常出色,从版本到版本都得到了改进!

每个Windows Installer程序包都必须包含Directory表。来自MSDN

  

Directory表必须使用a指定单个根目录   目录列值等于TARGETDIR属性。

相应的WiX元素是:

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

因此,它必须在您的WiX创作中。如果您不打算在安装中包含任何目录/文件,则可以将组件放在此根Directory元素下。

答案 1 :(得分:1)

如果直接将它放在Product下,则必须在Component元素上设置Directory属性,因为它是必需的。

来自doc:

  

设置组件的目录。如果这个元素嵌套在一个   目录元素,此值默认为父级的值   目录/ @同上

事实证明,在Windows Installer中,声明Component需要有一个指向directory table中记录的directory_属性,或者来自AppSearch的值。 {3}}。如果AppSearch为空,我不确定这将如何解决。