天天看點

如何用VS2008安裝部署做自定義的子安裝程式

有時我們除了需要安裝系統必備元件之外,還需要做自定義的子安裝程式,如我的系統安裝程式就需要同時安裝Oracle精簡用戶端(網上下載下傳的精簡3.0版,以下簡稱JOracle30)才能支撐系統資料庫的應用,怎樣才能讓VS2008部署程式自動執行這套JOracle30的安裝程式呢?

我首先想到的是用程式去實作,必竟大名鼎鼎的InstallShield安裝系統也是MS做的,VS2008部署程式應該也是內建的InstallShield吧,用DoInstall腳本函數還是能輕而易舉地調用其他安裝程式的。可是,我将IDE翻了個遍也沒有找到VS2008部署系統的程式入口,感情是人家根本就沒有提供腳本程式讓你寫吧?C#到是可以寫個類來控制,可我的是VC++程式,折騰半天還不知能不能用,還是另外找條路吧。

于是好一陣鬧騰,網上文章都翻遍了,都是不鹹不淡,語焉不詳,正心灰意冷時,突然想起了在系統安裝部署制作時,要選擇系統必備項,是不是可以将Joracle30作為系統必備項讓部署程式進行選擇呢?這樣的安裝程式可能既專業又優雅。這樣我的突破重點就是如何針對VS2008做自定義的系統必備項了。結果證明我的方向是完全正确的,經過半天的努力,終于成功了!現将操作步驟整理如下,希望能對如我一般陷此困惑的朋友有所幫助,或能抛磚引玉!

(1)将自定義的安裝程式COPY至Bootstrapper檔案夾中

VS2008的系統必備項是用特定檔案路徑和xml描述檔案一起構成的,這點倒是和JAVA應用伺服器很像。這個Bootstrapper是具體路徑在我的機器中是:“C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper/Packages”。在這個目錄中,您可很清楚地看到在VS2008部署程式中可選的所有的元件,呵呵。我們要依葫蘆畫瓢同樣建一個檔案夾“Oracle精簡用戶端”這樣的系統必備元件。名稱就起“Oracle9i用戶端精簡版30”好了。如下:

在“Oracle9i用戶端精簡版30”檔案夾中,斷續建一個“zh-CHS”安裝本地化檔案夾,将安裝程式COPY進這個檔案夾中,如:

我的Oracle精簡用戶端安裝有兩檔案,“Oracle9i用戶端精簡版3.0.msi”和“Oracle9i用戶端精簡版3[1].0.part2.rar”。

至此,我們将系統必備項所需的目錄結建構好了,但是還不行,還需要将描述檔案手動建構起來,其實就是兩個xml檔案。

(2)建立産品清單和程式包清單

産品清單其實就是“Oracle9i用戶端精簡版30”檔案夾下的那個product.xml檔案;程式包清單其實就是“zh-CHS”檔案夾下的package.xml檔案。

Product.xml檔案的清單如下:

<?xml version="1.0" encoding="utf-8"?>

<Product ProductCode="Oracle9i 精簡用戶端3_青蛙王子" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">

</Product>

這倒沒什麼可說的,倒是這個ProductCode究竟是不是一定用精簡用戶端安裝的ProductCode我還沒有發現有什麼弊端,我在一台已安裝精簡用戶端的機器的系統資料庫将實際的ProductCode找了出來,但是沒有用它,反正我用"Oracle9i 精簡用戶端3_青蛙王子"這個字元串也能工作。

Package.xml檔案的清單如下:

<?xml version="1.0" encoding="utf-8"?>

<Package Name="Oracle9i 精簡用戶端3_0"  Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">

  <InstallChecks>

    <RegistryCheck Property="ORACLE_INST" Key="HKLM/SOFTWARE/Microsoft/ORACLE/inst_loc" Value="C:/Program Files/Oracle/Inventory"/>

  </InstallChecks>

  <PackageFiles CopyAllPackageFiles="false">

    <PackageFile Name="Oracle9i用戶端精簡版3[1].0.part2.rar"/>

    <PackageFile

      Name="Oracle9i用戶端精簡版3.0.msi"

      HomeSite="HomeSiteName_32" />

  </PackageFiles>

  <Commands Reboot="Defer">

    <Command PackageFile="Oracle9i用戶端精簡版3.0.msi" Arguments=''>

      <InstallConditions>

        <BypassIf Property="ORACLE_INST" Compare="ValueExists"/>

      </InstallConditions>

    </Command>

  </Commands>

</Package>

Package 元素的 Name 屬性的值 其實就是 在VS2008部署程式的系統必備選擇框中顯示的元件名稱。

<PackageFiles>元素用來指定元件包括的檔案,要将每個安裝檔案要用子元素<PackageFile>指定出來哦,VS2008部署程式在編譯生成安裝檔案時,就是按這個清單将元件的檔案COPY過去的。

<InstallChecks> < Commands >這兩個元素是要配對的,和struts架構的控制檔案一樣,它們的主要作用就是利用系統資料庫項或檔案來判斷元件是否需要安裝。我是用系統資料庫來判斷oracle是否已經在用戶端上安裝,就需要用<RegistryCheck>元素來檢查,用“HKLM/SOFTWARE/Microsoft/ORACLE/inst_loc”這個系統資料庫鍵來判斷檢查,并給這個檢查項目起個名字叫“ORACLE_INST”。

<Command>元素則是在<InstallConditions>元素指定的條件滿足時,執行相應的元件安裝程式,這裡我的安裝程式是“Oracle9i用戶端精簡版3.0.msi”,是一個普通的安裝程式,沒有參數。

<InstallConditions>元素我的了解就是指定安裝條件啦,<BypassIf Property="ORACLE_INST" Compare="ValueExists"/>一句我的想法是:如果系統資料庫存在“HKLM/SOFTWARE/Microsoft/ORACLE/inst_loc”這個鍵就認為已經安裝了Oracle用戶端,就不用執行精簡用戶端安裝,否則視為沒有安裝,就要執行。

   (3)配置完畢!

我們到VS2008部署程式的系統必備選擇項中找找,果真發現了“Oracle9i 精簡用戶端3_0”這個元件了。如下圖:

呵,以下就是選擇他,編譯生成部署項目即可。在生成的安裝目錄中,精簡用戶端目錄就在其中。  (4)運作setup.exe檔案,即可執行安裝程式了,記住了,不是執行msi檔案,msi安裝檔案不能進行系統必備元件的判斷安裝。系統必備元件安裝如下圖。

(5)有一點遺憾的是,我的本意如果用戶端已經安裝了Oracle用戶端,就不用執行精簡用戶端安裝,沒有安裝,就要執行。可我将這個安裝軟體在已經安裝了Oracle用戶端的機器上試運作時,安裝軟體還是提示需要安裝“Oracle9i 精簡用戶端3_0”,雖然安裝過程一閃而過,可能實際上并沒有執行,是不是我的描述檔案沒有了解對呢?

青蛙王子:很抱歉,圖檔無法顯示出來,不過看文字還是可以看懂。