2012-05-08 66 views
1

我想根據WIX項目中的用戶輸入將互斥應用程序部署到互斥環境中。我所做的研究告訴我,我無法使用條件來做到這一點http://www.joyofsetup.com/2007/05/30/feature-conditions-and-ui/這似乎是一個相當普遍的問題,最終的最佳實踐將是有價值的。WIX安裝程序中相同文件夾中的互斥文件

我已經使用上述文章中的功能和發佈事件實現了此功能。我的用戶界面中的事件如下。

在我的情況下,我將兩個互斥Web應用程序之一安裝到三種不同的環境之一中。我通過創建8個特性來實現這一點,每個應用程序和除web.config以外的所有文件都是1,而web.config文件則是6,這取決於正在安裝的應用程序和正在安裝的環境。我必須在每個功能中包含一個條件才能通過ICE驗證,即使它們由以下發布元素控制,因爲它們將被安裝到不同服務器上相同的目錄中。有沒有更好的方法,或者這是這種情況的標準做法?

 <Publish Event="AddLocal" Value="WebApp"><![CDATA[ServerType="Web"]]></Publish> 
     <Publish Event="Remove" Value="WebApp"><![CDATA[ServerType<>"Web"]]></Publish> 
     <Publish Event="AddLocal" Value="DataApp"><![CDATA[ServerType="App"]]></Publish> 
     <Publish Event="Remove" Value="DataApp"><![CDATA[ServerType<>"App"]]></Publish> 
     <Publish Event="AddLocal" Value="WebDevConfigFeature"><![CDATA[ServerType="Web" AND Environment="Dev" ]]></Publish> 
     <Publish Event="Remove" Value="WebDevConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"Dev"]]></Publish> 
     <Publish Event="AddLocal" Value="WebQAConfigFeature"><![CDATA[ServerType="Web" AND Environment="QA" ]]></Publish> 
     <Publish Event="Remove" Value="WebQAConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"QA"]]></Publish> 
     <Publish Event="AddLocal" Value="WebProdConfigFeature"><![CDATA[ServerType="Web" AND Environment="Prod" ]]></Publish> 
     <Publish Event="Remove" Value="WebProdConfigFeature"><![CDATA[ServerType<>"Web" OR Environment<>"Prod"]]></Publish> 
     <Publish Event="AddLocal" Value="AppDevConfigFeature"><![CDATA[ServerType="App" AND Environment="Dev" ]]></Publish> 
     <Publish Event="Remove" Value="AppDevConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"Dev"]]></Publish> 
     <Publish Event="AddLocal" Value="AppQAConfigFeature"><![CDATA[ServerType="App" AND Environment="QA" ]]></Publish> 
     <Publish Event="Remove" Value="AppQAConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"QA"]]></Publish> 
     <Publish Event="AddLocal" Value="AppProdConfigFeature"><![CDATA[ServerType="App" AND Environment="Prod" ]]></Publish> 
     <Publish Event="Remove" Value="AppProdConfigFeature"><![CDATA[ServerType<>"App" OR Environment<>"Prod"]]></Publish> 
     <Publish Event="EndDialog" Value="Return">1</Publish> 

回答

2

我喜歡做訣竅是有2個部件具有2個不同的密鑰文件

C1 - > F1(web.config.dev) C2 - > F2(web.config.qa) C3 - 然後> F3(web.config.prod)

每個這些文件中給出的web.config的副本文件元件和相互排斥的條件

DEPLOYMENTTYPE〜= 「DEV」 DEPLOYMENTTYPE〜=」 QA「 DEPLOYMENTTYPE〜=「PROD」

結果不會超過這些組件中的1個就會安裝。你可能會得到一個web.config.dev和一個web.config,它會工作。

所有這些都可以使用單個功能來完成。

+0

這聽起來很完美。雖然在CostFinalize之後獲得條件以評估是否有竅門?在我的對話框中,我設置了變量,直到CostFinalize之後才能顯示對話框。 – atevans

+0

您必須使用特徵條件而不是組件條件,然後使用ADDLOCAL和REMOVE控件事件來有條件地打開和關閉特徵。 –

+0

好吧,那就是我現在所處的位置,我關心的是「功能膨脹」。我有8個功能需要使用控制事件進行控制。似乎儘管失敗了,這是標準做法。謝謝你的幫助。 – atevans

0

就我個人而言,我會將兩個獨立的應用程序拆分爲兩個msi,並使用通用庫來實現重複代碼。如果需要使用刻錄,它們可以一起引導。

此外,不需要存儲web.config的所有不同版本,因爲可以在安裝時使用XmlFileXmlConfig元素修改不同的值。這種修改web.config文件的方法的優點是,如果它們發生更改,則值也可以在命令行中傳遞到安裝程序,從而防止僅爲配置更改而重新構建msi。爲了使事情變得更簡單,您甚至可以創建對話框來設置它們,而不是通過msiexec傳遞它們。

+0

這裏我唯一的問題是我正在使用WebDeploy內置的Web Transformations,而不是在兩個不同的地方都有這個邏輯。 – atevans

+0

順便說一句,分裂成兩個MSI肯定是可行的。這兩個不同的網絡應用程序是同一個應用程序的一部分,所以我認爲只要給他一個MSI就可以減輕部署人員的負擔。 – atevans

+0

根據具體情況的需要,我遵循兩種模式。是的,您可以使用XmlConfig元素將變換應用於單個XML,這在「shrinkwrap」場景中非常有用。然而,在擴展到許多屬性方面是痛苦的,但在許多價值中無痛苦。在某些情況下(比如內部IT應用程序),最好只有多個配置文件。它擴展到很多很多屬性,但很少有值。它允許內部開發人員在不知道安裝程序的情況下維護XML文件。合理? –

1

根據是否要按環境(無問題),間接用戶輸入(相關問題)或直接用戶輸入(功能選擇)來選擇文件,可以採用多種方法。 Christopher Painter的方法對前兩種方法很有用,但對於特徵選擇,您可以嘗試使用此InstallTalk blog post中描述的技術。

相關問題