2009-11-18 30 views
9

我瞭解Windows的安裝程序和維克斯,並有一些相關的問題,它是如何工作:瞭解GUIDS,更新和修補程序與Windows的安裝程序

  1. 如果一個組件GUID的變化,但組件中的文件相同,主要升級時會發生什麼?文件是否被替換?
  2. 如果從產品中刪除組件,主要升級上的相關文件會發生什麼情況?卸載時是否刪除原始文件?
  3. 我正確地說,主要升級會替換所有組件中的所有文件,無論該文件的程序集版本是否已更改,以及小型更新和次要升級如何,只會替換文件(如果GUID是相同,並且該文件的程序集版本已增加?如果文件沒有程序集版本,比如aspx頁面怎麼辦?
  4. 假設產品部署在機器上而不使用安裝程序。如果您隨後創建了一個安裝程序,並在組件中具有與安裝目錄中相同名稱的文件,那麼如果您嘗試安裝,那麼這些文件會發生什麼?他們被替換了嗎?
  5. 我是否正確地說,如果我使用熱量這樣的工具來創建一個包含目錄中所有文件(比如網站)的xml文件,那麼您必須保持GUID相同(手動或與一個腳本),還是隻能進行重大升級?
+0

所有這些都很容易測試。 – 2009-11-18 18:00:10

回答

4

如果一個組件GUID的變化,但 相同的文件是在組件, 上的重大升級會發生什麼?

首先,問題是舊組件是否被卸載。如果您未將升級配置爲卸載先前版本的產品,則該組件不會被刪除(儘管其文件可能會被覆蓋)。另請參閱問題2的回答。

其次,問題是是否將安裝新組件。只有在缺少keypath時才安裝組件。如果keypath是一個版本化文件,那麼較低的版本也算作「丟失」。

最後,如果新組件標記爲要安裝,並且Windows Installer遇到與其嘗試安裝的文件名相同的文件,File Versioning Rules將確定文件是否被替換。例如,具有較高版本的文件不會被降級。

如果組件從 產品去除,會發生什麼情況 相關文件上的重大升級? 原始文件在 上被刪除嗎?

除非你把Upgrade table正確條目和InstallExecuteSequence告訴Windows安裝程序刪除舊產品,舊的組件將被單獨留在家中。請參閱Alex Shevchuk的blog post以獲取有關如何在wix中創建用於刪除舊版本的安裝程序的指導。

我的意思是說主要的 升級將替換所有 組件中的所有文件...

不需要。它取決於舊組件是否先被刪除,是否已安裝新組件(取決於密鑰路徑)以及文件版本規則。

假設產品部署在 機器上而不使用安裝程序。 如果您隨後創建了一個安裝程序,其中 組件 中的同名文件與安裝的目錄中的內容相同 如果您嘗試安裝 ,那麼這些文件會發生什麼變化?

同樣,這取決於是否安裝了組件,具體取決於它們的keypath和文件版本控制規則。

上午我說,如果我用 喜歡熱的工具在目錄 創建一個XML文件 的所有文件(比如一個網站),那你就必須 保持正確的GUID相同(手動 或腳本),或者只有 能夠進行重大升級?

正確。 GUID是組件的標識,因此如果要更改GUID,則會存在兩個組件(在您的產品的舊版本和新版本中)將相同的資源安裝到相同的目標位置。這是一個禁止according to MSDN:「永遠不要創建兩個組件來安裝同一名稱和目標位置下的資源。」

3

瞭解Component Rules。它們很容易中斷,Windows Installer不強制執行它們。但是,如果你不遵守規則,那麼怪異的巫術就會發生。

簡單的解決方案,堅持每個組件一個文件,並使用heat與編譯時GUID生成(輸出與Guid="*"使用穩定的算法,它不是隨機的)。生成GUID是隨機的,但在編譯時由candle生成的GUID將是穩定的(基於文件名+路徑哈希或來自內存的某些內容)

如果Windows安裝程序在安裝期間發現磁盤上已存在文件,假定它是一個「共享」文件,該文件的引用計數。一旦引用計數返回到零,文件只能從磁盤中刪除,因此如果文件已經存在,則計數可能永遠不會返回到零,並且即使在卸載之後,也可以將文件留在左邊。

+0

關於引用計數:並不那麼簡單。如果您有兩個安裝相同文件的不同組件(違反組件規則),則刪除一個組件將刪除該文件。如果文件具有「sharedllrefcount」,只有在已經存在refcount的情況下才由Windows Installer更新的傳統機制,或者在SharedDllRefCount =「Yes」的組件上顯式啓用該文件,該文件才具有一些額外的保護。 – 2009-11-19 00:37:20

+0

誠然,如果您違反組件規則,則所有投注均關閉;) – saschabeaumont 2009-11-20 03:38:20

相關問題