2013-05-15 40 views
8

我在WiX版本3.7中設置了32位和64位版本。 WiX文件在對此進行充分解釋時存在缺陷。在documentation for Package/@Platform中,它表示「不鼓勵使用此屬性;而是在candle.exe命令行中指定-arch開關」,但沒有解釋此參數實際上做了什麼(至少沒有我可以找到的)。 "documentation" for the compiler完全值得圍繞單詞「文檔」的空氣報價,因爲它基本上是一個存根(例如,與linker documentation不同)。對於歷史記錄,下面是完整的編譯器文檔:「candle」命令行上的`-arch`參數究竟做了什麼?

Windows Installer XML編譯器由candle.exe公開。 Candle是 ,負責將輸入的.wxs文件預處理爲有效的 針對WiX架構wix.xsd的格式良好的XML文檔。然後,每個 後處理的源文件被編譯成一個.wixobj文件。

編譯過程相對簡單。 WiX模式 適用於簡單的遞歸下降解析器。編譯器 依次處理每個元素,創建新符號,計算必要的引用並生成.wixobj文件的原始數據。

命令行幫助提供了一點,但還不夠。

-arch  set architecture defaults for package, components, etc. 
      values: x86, x64, or ia64 (default: x86) 

在一個相關的問題,Platform identification in WiX 3.0,有one answer with a sliver of hint什麼可能什麼,但它幾乎沒有足夠的,我不知道這是否是準確的。

  • 是否-arch參數有如設置Package/@Platform屬性同樣的效果呢,還是做多?
  • 該參數是否會影響preprocessor中的任何可用內容?特別是,它是否設置了PLATFORM預處理器變量?它是否設置其他任何東西?
  • 什麼是架構「默認」?明確的Package/@Platform屬性是否覆蓋命令行?或相反亦然?或者(更好)如果有不一致的平臺聲明會出現錯誤嗎?

其中一些問題的答案似乎應該是顯而易見的,事實上,我已經學到了一些問題。但我想要一個明確的答案,最好(提示)鏈接到candle命令行的更新和準確的文檔頁面。但是,當有人回答時,我確實希望能夠解決這個問題,但是我會盡快拯救其他人,我會花時間去解決這個問題。


另一個相關問題, WIX: is the Platform attribute of the Package element truly deprecated?,講述了 Package/@Platform屬性,但沒有解決命令行參數。
關於那個 PLATFORM預處理器變量。現在顯然是 BUILDARCH,雖然你很難從文檔中知道它。

​​

回答

2

部分答案:

  • -arch說法並設置sys.BUILDARCH變量,還有一個sys.PLATFORM
  • -arch參數默默地覆蓋屬性Package/@Platform。至少看起來,如果看sys.BUILDARCH就足夠了。
    • 因此命令行幫助是錯誤的。這是一個覆蓋,而不是默認。
+0

如何在Visual Studio中構建WiX安裝程序,如何將'-arch'開關設置爲x64? – Jammer

+1

@Jammer'-arch'開關在編譯完成後在'candle'的命令行中設置;它不涉及構建該編譯器。如果你問是否有辦法讓'-arch x64'成爲這種二進制文件的默認值,我不知道答案。 – eh9

+0

啊,我確實解決了這個問題。如果您在'.wixproj'文件中將'PlatformInstaller'屬性設置爲x64,那麼蠟燭的命令行將包含-arch x64開關。 – Jammer

7

下面的代碼片斷使編譯時的32位和64位版本之間配置而不引入表示所述平臺的用戶變量,而是使用由系統提供的一個。這兩個定義的變量對於普通安裝都是通用的。 64位系統的最低版本更高。基本程序文件目錄在32位和64位版本中不同。

<?if $(sys.BUILDARCH)="x86"?> 
    <?define Minimum_Version="100"?> 
    <?define Program_Files="ProgramFilesFolder"?> 
<?elseif $(sys.BUILDARCH)="x64"?> 
    <?define Minimum_Version="200"?> 
    <?define Program_Files="ProgramFiles64Folder"?> 
<?else?> 
    <?error Unsupported value of sys.BUILDARCH=$(sys.BUILDARCH)?> 
<?endif?> 


在維克斯源後使用這些定義。

<Package [...] 
    InstallerVersion="$(var.Minimum_Version)" 
/> 

<Directory Id="$(var.Program_Files)"> 
    [...] 
</Directory> 
+0

跨多個SO和博客文章的最佳答案。 –

0

除了定義的MSI的架構(封裝/ @平臺)它設置在MSI的msidbComponentAttributes64bit屬性(Win64的在維克斯)默認組件表值。

IE。如果sys.BUILDARCH = x86,那麼它是而不是集合,如果是x64那麼它集合(+256)。 這是在其中只是重新迭代的MSI.chm有關上述屬性

將此屬性設置爲「是」來標記此作爲一個64位的 分量WIX.chm提到。該屬性有助於安裝包含32位和64位組件的軟件包 。如果此位不是 集,則該組件被註冊爲32位組件。**如果這是一個替代32位組件的64位組件,請在Guid屬性中設置此位並將 分配給一個新的GUID 。

(所以不會告訴你):當使用BUILDARCH你只需要編寫時要覆蓋默認Win64的WiX的屬性,樂於助人,從相同的維克斯代碼構建不同拱的MSI時。在此之前,我在組件中使用了一個Win64屬性的環境變量,每組件。