2012-08-22 80 views
2

WiX 3.5。我的安裝項目除了:不帶目錄的WiX安裝

  1. 創建一個帶有值的註冊表項;
  2. 安裝兩個證書。

可以在沒有任何「目錄」元素的情況下構建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元素(即組件元素跟在我的情況下的二進制元素)它失敗,並出現以下錯誤:

「組件/ @目錄屬性找不到;它是必需的。

UPDATE

感謝嚴的詳細的解答。現在,在目錄部分我的代碼片段看起來像(現在是更正確的):

<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> 

回答

7

此行爲的根源歸結爲Windows安裝程序體系結構。如你所知,WiX是一套創建Windows Installer軟件包的工具,也就是說,它必須在一定程度上反映這種技術的關鍵概念,隱藏語法糖背後最奇怪和荒謬的東西。它的功能非常出色,從版本到版本都有所改進!

每個Windows安裝程序包都必須包含一個Directory表。從MSDN

The Directory table must specify a single root directory with a Directory column value equal to the TARGETDIR property.

相應的WiX元素是:

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

因此,它必須在你的維克斯創作。如果您不打算在您的安裝中安裝任何目錄/文件,則可以將組件放置在此根目錄Directory元素的下面。

1

必須設置目錄屬性您的自我元器件上,如果你把它直接下的產品,因爲它是必需的。

從DOC:

Sets the Directory of the Component. If this element is nested under a Directory element, this value defaults to the value of the parent Directory/@Id.

事實證明出,在Windows Installer參考指出,Component需要有一個指向記錄在directory table,或由值directory_屬性從AppSearch獲得。我不確定如果AppSearch爲空,這將如何解決。

+0

那麼,這個Directory元素的含義是什麼?其實我在安裝時不需要目錄。這只是某種傳統或特定的WiX內部邏輯的問題,它不能在沒有目錄的情況下創建組件? – user808128

+0

Wix只是Windows Installer的聲明性包裝,它必須遵守Windows Installer API規定的規則。 – rene