2011-03-18 84 views
1

我有一個編譯爲x86,amd64和Itanium的windows服務exe文件。我正在嘗試構建一個用於安裝此服務的單個x86 WiX/MSI安裝程序。安裝程序有三個具有體系結構特定條件的組件(例如,<Condition>NOT VersionNT64</Condition>用於檢測x86),因此只有其中一個組件安裝在任何給定的體系結構中。這些組件安裝exe的x86,x64或Itanium版本。在多平臺WiX安裝程序中安裝依賴於架構的服務

這一切都正常工作,正確的二進制文件安裝在三個平臺上。

下一步是設置使用ServiceInstall標籤我的exe文件在Windows服務,這是我們遇到麻煩:顯然ServiceInstall標籤的Name屬性必須是WiX的文件中是唯一的。我想致電該服務,例如FooBar,但這是不允許的 - 由於名稱衝突,WiX文件無法編譯。

作爲一種解決方法,我可以有與架構相關的服務名稱,例如FooBar_ia64,但這對我來說似乎很難看,再加上代碼庫中有許多關於服務名稱的假設,所以如果我更改服務名稱,我將不得不在代碼庫中找到並修改所有這些位置。

我試過ServiceInstall移動到它自己的Component,將在所有三個架構來安裝,但ServiceInstall標籤顯然隱含引用在同一Component,這樣沒有任何工作定義的File標籤。

我也意識到我可以爲每個架構生成一個安裝程序,從而避免安裝程序中的任何條件,我的問題就會消失。但我真的不喜歡有三個安裝者的想法,當我如此接近爲所有三種架構提供單一安裝程序時:-)

任何其他技巧來解決此問題?

以防萬一您還沒有弄清楚這是否是遺留下來的代碼庫,我正在嘗試爲它構建一個新的安裝程序來替換現有的舊版安裝程序。

回答

2

這實際上好像是WiX中的一個錯誤。當你按照你所說的去做時,它會產生一個有關重複主鍵的錯誤消息,但實際上MSI SDK中的ServiceInstall表沒有提及名稱列是主要的。使用互斥組件的用戶,您應該能夠創作多個版本的服務,並且不會違反任何組件規則違規。

WiX團隊可能認爲他們會更保守一些,防止人們射擊。他們可能會說的另一件事是,首先不要做混合安裝,但你已經知道了。

我能想到的最好的解決方法是在安裝時使用自定義操作來創建臨時行到ServiceInstall表中以解決此編譯時間限制。