2014-09-24 49 views
0

WiX的抱怨(有多大,對吧?):我該如何解決這個惱人的WiX問題?

錯誤95組件 'blahblah' 與路徑 'TARGETDIR \ blah.dll' 的密鑰文件。由於此路徑並非根植於 標準目錄之一(如ProgramFilesFolder),因此此組件確實不符合具有自動生成的GUID的條件。 (如果路徑中包含可能的標準 目錄,例如下 ProgramFilesFolder築巢名爲「Common Files」下的目錄中也可能會出現此錯誤。)

但我想自動生成的GUID,和我不T想要將TARGETDIR設置爲由ProgramFilesFolder組成的某個其他路徑,因爲我在UI中設置了TARGETDIR,我甚至允許用戶更改它,以便人們可以指定他們想要在其中安裝應用程序的路徑...某人如何獲得此功能?可能嗎?我的意思是,我可以擁有兩全其美嗎?爲什麼這麼重要?維克斯的方式有時過於嚴格...

+1

WiX不抱怨,Windows Installer抱怨。這很重要,因爲底層的Windows Installer有一些稱爲組件規則的東西。當你破壞它們時會發生壞事。 – 2014-09-24 17:38:17

+0

然後不要使用MSI。我瞭解你的挫敗感......當我第一次瞭解MSI時,我花了很多時間與之抗爭。這是一個非常僵硬的框架,不喜歡你在線外着色。但是一旦掌握了它,就開發人員的生產力和用戶體驗質量而言,就會有巨大的淨收益。 – 2014-09-24 17:47:34

+0

不幸的是,它的標準,人們已經掌握了,否則我不會使用它:) – Alexandru 2014-09-24 17:49:32

回答

0

我剛剛纔...有點麻煩,但這樣很好的工作...

我修改TARGETDIR和之前使用它......但現在,我意識到,我可以很容易地只是有INSTALLDIR工作...例如,我重新分解我的目錄結構,例如:

<Directory Id='TARGETDIR' Name='SourceDir'> 
    ... 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="blahFolder" Name="blah"> 
     <Directory Id="INSTALLFOLDER" Name="blah"/> 
    </Directory> 
    </Directory> 
</Directory> 

我能得到的部件引用INSTALLFOLDER,它會自動生成的GUID的他們:

<ComponentGroup Id='blahgroup'> 
    <Component Id='blahId' Directory='INSTALLFOLDER' Transitive='no'> 
     <RegistryKey Root='HKLM' Key='Software\blah\blah' ForceCreateOnInstall='no' ForceDeleteOnUninstall='no'> 
     <RegistryValue Type='string' Name='blah' Value='BLAH' /> 
     </RegistryKey> 
    </Component> 
    ... 
</ComponentGroup> 

但在我的UI,它的好,因爲我可以只修改安裝文件夾路徑相當不錯:

<Product ...> 
    ... 
    <CustomAction Id='SetInstallFolder' Property='INSTALLFOLDER' Value='[ProgramFilesFolder]blah\blah\'/> 
    ... 
</Product> 

然後我可以強制INSTALLFOLDER以指向任何地方我想:

<InstallUISequence> 
    <Custom Action='SetInstallFolder' Sequence='1'/> 
    ... 
</InstallUISequence> 
<AdminUISequence> 
    <Custom Action='SetInstallFolder' Sequence='1'/> 
    ... 
</AdminUISequence> 
+1

我希望您認識到,作爲創作者,您的自定義操作在無提示安裝期間不會觸發。需要更多邏輯來處理無提示安裝,修理和升級。 – 2014-09-25 00:44:46

+0

@ChristopherPainter是的,我知道。實際上,在我按照我的方式設置文件夾結構後,我不再需要使用這些操作。你可以看到這是最初的問題。但是,除此之外:對於安靜安裝,MSI軟件包會導出公共屬性,您可以使用msiexec參數末尾的PROPERTY = value語法來設置它們。無論如何,我將它作爲練習/ POC留在答案中,以便其他人可以從看到如何完成的過程中受益。 – Alexandru 2014-09-25 01:18:08

0

所有你需要的要做的就是設置Directory/@ ComponentGuidGenerationSeed,然後你可以使用非標準文件夾的自動guid。

相關問題