2017-08-25 178 views
0

我有一個項目有很多插件和配置文件。現在我正在爲它做一個Visual Studio安裝項目。
我不想手動添加每個配置文件到安裝項目,所以我想這樣做:Visual Studio安裝項目 - 快捷方式導致安裝回滾

  • 創建一個空的壓縮文件,說config.zip,並將其添加到安裝項目
  • 添加一個預生成操作,將所有配置文件壓縮到config.zip
  • 添加運行vbs腳本的自定義操作,該腳本將config.zip解壓縮到正確的文件夾並將其刪除。

的vbs腳本如下:

sArchiveName = "Config.zip" 
sLocation = "C:\Data\Configurations" 

Set oFSO = CreateObject("Scripting.FileSystemObject") 
Set oShell = CreateObject("Wscript.Shell") 

oShell.Run """" & s7zLocation & "7z.exe"" x " & sLocation & "\" & sArchiveName & " -aoa -o" & sLocation, 1, True 

'--- If I uncomment the following 2 lines, 
'--- as I click on the shortcuts the installation rollbacks. 
'--- If I leave them the shortcuts work fine. 
'Set f = oFSO.GetFile(sLocation & "\" & sArchiveName) 
'f.Delete True 

我的問題是,我在程序菜單中添加快捷方式會導致安裝的回滾。原因是在安裝過程結束時刪除config.zip。如果我離開它一切正常。

我已經搜索了一個解決方案,但找不到任何東西,有人可以幫我嗎?

回答

1

這似乎是一個自我修復問題

  • 自我修復是一個核心的Windows安裝程序功能,它會檢查你的軟件安裝正確,只要你通過「advertised shortcut」(本質上是一種特殊類型的快捷方式,指向Windows安裝程序的功能,而不是直接將其啓動一個文件 - 在提供的鏈接中查看更多信息)。
  • Windows安裝程序跟蹤您的zip文件並發現它缺少,因此正確觸發您的安裝修復。
  • 沒有很好的解決方法,因爲您的部署設計不健全。 MSI專門設計用於這種行爲,並且您無法禁用此「自我修復」功能。一旦你安裝了zip文件,它就被跟蹤了。
  • 如果你真的想要了解自我修復,這裏有一個很長的答案,但是如果沒有事先知道它是什麼以及它是如何工作的,它通常是太細緻了。仍然添加鏈接以供參考:How can I determine what causes repeated Windows Installer self-repair?
  • 處理此問題的最簡單方法是通過MSI文件正確安裝配置文件,然後刪除整個zip文件。這些配置文件會在安裝後更新嗎,還是會被視爲只讀?
  • Visual Studio安裝項目是非常基本的。現在推薦的創建MSI文件的方法是使用WiX工具包。這是用於創建MSI文件(Windows Installer文件)的新框架,它允許您將安裝創作爲XML文件,然後將其編譯爲MSI二進制文件。這是一個非常優雅的工具包,但有一條學習曲線。
  • 也許檢查這個答案更多的上下文在WiX上:Wix generate single component id for entire tree。如果您下載並安裝了WiX工具包和Visual Studio插件,您將獲得允許創建WiX XML包文件的新項目類型。
  • 以下是關於「WiX起源」的答案:Windows Installer and the creation of WiX。實質上是其創作背後的基本原理。
+0

這是一個自我修復的問題,我已經明白了。但我認爲有一種方法可以告訴Windows Installer不要跟蹤特定的文件。該項目有很多由不同人開發的插件,所以我想避免每個人都必須把他的手放到設置項目中。現在我知道這是不可能的,謝謝! –

+1

有一種方法,但我擔心它會導致你誤入歧途。如果你設置了一個「空白組件GUID」,該文件將被安裝,但從未跟蹤或卸載 - 這將消除自我修復。看起來像解決您的問題,但它並不理想。您有時在新安裝時遇到文件覆蓋問題(未安裝新文件)。如果你刪除了zip文件,這個問題也不應該發生,但我不喜歡這種設計 - 這是不好的部署。首選的方法是使用WiX,並在項目設置完成後讓每個開發人員添加一個簡單的XML元素來添加他們的文件。 –

0

這些症狀幾乎肯定意味着您的自定義操作失敗,因此安裝會回滾。你需要發佈你的VBScript讓我們看看。

詳細日誌應顯示腳本失敗的位置。執行msiexec/I [msi文件路徑]/l * vx [日誌文件路徑]

VBScript自定義操作中的一個常見問題是使用WScript對象,如WScript.CreateObject。這會失敗,因爲在WSH環境中運行時會提供WScript對象,但在Windows Installer調用期間不會發生這種情況。

在您發佈的腳本中,s7zLocation似乎未初始化。

另外,請注意該代碼正在從msixec.exe調用,系統帳戶運行,並且沒有任何基礎設施,將看到,如果你是從一個交互式用戶資源管理器環境下運行(如工作目錄)。您需要指定所有可執行文件和正在使用的文件的完整路徑。

+0

感謝您的回答,vbs腳本完成它的工作,無論如何我更新了我的問題,以澄清我的問題。看看腳本末尾的評論。 –

+0

我會再次指出s7zLocation未在您的腳本中初始化。 – PhilDW

+0

我同意,但也許'7z.exe'是在路徑中,或者甚至可以安裝到與VBScript相同的文件夾,以便's7zLocation'中的空字符串不重要? @ simone-cifani:如果它只是在路徑中,它將永遠不會在目標系統上工作,我會假設(除非7z.exe安裝程序更新系統路徑並且位於每個目標系統上)。我發現解壓縮一個大的部署反模式順便說一句。 –