How to create installation patches for VS.NET deployment projects

(下載後改擴展名爲zip文件,包括Patch.pcp,patch.cmd)

如何爲VS 安裝文件MSI 製作更新補丁MSP

計算機 2010-03-09 11:08:56 閱讀23 評論0 字號:大中小
(此文轉自互聯網)
Net 部署二三事之一——如何爲VS 安裝文件MSI 製作更新補丁MSP 前言
首先需要說明的是,本文使用的工具是 VS IDE 、 Orca.exe ,所以 InstallShield 、
Wise 等其它打包工具不在討論範圍,另外需要 InstallShield 、 Wise 關於製作安裝
文件和更新補丁比 VS IDE 和 Orca.exe 更復雜。
其次本文的背景是,筆者發現國內關於如何在 VS IDE Setup Project (安裝和部署
工程)製作的 MSI 基礎上製作 MSP 更新補丁的文章少之又少,所以再查詢了衆多
英文文章後,總結了如下經驗,大部分內容可能只是
http://www.codeproject.com/KB/install/dotnetpatching.aspx?fid=209224&fr=51&df=90
&mpp=25&noise=3&sort=Position&view=Quick#xx0xx 中 How to create installation
patches for VS.NET deployment projects 一文的翻譯。(如果英文好的朋友可以直接
看上文,但筆者也有一些解決按照上文步驟製作 MSP 遇到問題的經驗共享)
準備
1、首先需要下載 Microsoft Platform SDK ,地址:
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-
A93E-40C0EC4F68E5&displaylang=en ;
2、下載後,安裝 Orca.Msi ( Orca 其實是一個 Microsoft 用於編輯配置 MSI 、
MSP 以及打開製作 MSP 必須的 PCP 文件的工具),在 Microsoft Platform SDK 的
安裝目錄下, C:\Program Files\Microsoft Platform SDK\Bin\ ;
3、其次,需要有升級前的 MSI 安裝文件,以及對應的 VS 的安裝部署工程;(注
意 codeproject 中一文所有準備文件都放在安裝部署工程所在目錄,否則套用它提
供的 Patch.cmd 將會出錯,其實完全不用在安裝部署目錄下,可以另行建立一個工
作目錄,但如果讀者一開始不熟悉 Orca 工具的情況下,還是按照 codeproject 中一
文來設置工作目錄,切記所有的目錄都不宜太長,最好沒有特殊字符和空格。)
4、在工作目錄中,需要有如下子目錄: TargetImage 和 UpgradedImage ,
TargetImage 用於存放升級前的 MSI 安裝文件, UpgradedImage 用於存放升級後的
MSI 安裝文件;(如果沒有生成升級後的安裝文件,先不執行該步。)這裏需要
注意,提醒按照 codeproject 製作 MSP 的讀者,由於它在文中用到的 Patch.cmd 與
本文有所不用,因此按照 codeproject 製作 MSP 的讀者需要建立不用的目錄結構,
這裏就不再贅述。
5、需要有一些安裝文件製作的基本知識,如主版本號: MajorVersion ,次版本
號, ProductCode 、 UpgradeCode 等等。
製作步驟
1、將 C:\Program Files\Microsoft Platform SDK\Samples\SysMgmt\Msi\Patchi ng\
Template.pcp 拷貝到工作目錄下,並重新命名爲 patch.pcp ;(名字可自定義,但
注意在 Patch.cmd 中相應修正)
2、利用 Orca 打開 patch.pcp ,爲 ImageFamilies 表添加一行記錄, Family 字段需
賦值,可以自定義,該值表示產品所在家族系列加上主版本號,例如 ESRI 將該值
賦爲 ArcGIS92 ;
3、爲 PatchSequence 表添加一行記錄, PatchFamily 設爲上表中 Family 的值(也
可以不同), Sequence 字段爲 1.0.0 (所有 pcp 表中字段設置可參考
http://msdn.microsoft.com/en-us/library/aa370890(VS.85).aspx );
4、修改 Properties 表中記錄, PatchGUID 右鍵後選取粘貼生成一個新的 GUID
(非常重要,每次製作 MSP 都需要重新生成,筆者犯過類似錯誤,花了半天時間
才找到原因), PatchOutputPath 設置需要導出的地址,可設置爲
Patch\Patch.msp ,注意這是相對目錄,相對於 patch.pcp 文件,另外爲該表添加一
記錄, Name : MinimumRequiredMsiVersion , Value : 200 ;

5、爲 TargetImages 表添加一記錄, Target :可自定義(推薦爲 Family 值加上升
級前次版本號,如 ArcGIS92MSI1 ,原因是此表可添加多條記錄,以後應用將多個
不同的目標版本升級到最新版本,後面將詳述,該段在 codeproject 中未提到,屬
於高級應用), MsiPath : TargetImage\setup.msi (相對目錄,注意 setup.msi 不用
改爲讀者的 msi 文件名,因爲在 Patch.cmd 中將讀者的 msi 拷貝爲 setup.msi ,可細
讀 Patch.cmd ), Upgraded :與下面 UpgradeImages 表中該值對應,(推薦爲
Family 值加上升級後的次版本號,如 ArcGIS92MSI2 ), Order : 1 (多條記錄時
需要有大小順序,後面詳述), IgnoreMissingSrcFiles : 0 ;
6、爲 UpgradeImages 表添加一記錄, Upgraded :與上表中該值對應, MsiPath :
UpgradedImage\setup.msi (相對目錄,此處不用改,細讀 Patch.cmd ), Family :
與 ImageFamlies 表中該值對應。
7、創建 Patch.cmd 文件,(按照 codeproject 一文的讀者參考它的 Patch.cmd 文
件)
@SETLOCAL
@set path=%path%;"C:\Program Files\Microsoft Platform
SDK\Samples\SysMgmt\Msi\Patching"
@set PatchTmp=C:\Tmp1
:ok
rmdir /s /q %PatchTmp%
mkdir C:\Tmp1
mkdir C:\Tmp1\TargetImage
mkdir C:\Tmp1\UpgradedImage
mkdir C:\Tmp1\Patch
for %%a in ("TargetImage\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\TargetImage\ /L*v
C:\Tmp1\TargetImage\setup.log
del C:\Tmp1\setup.msi
for %%a in ("UpgradedImage\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\UpgradedImage /L*v
C:\Tmp1\UpgradedImage\setup.log
del C:\Tmp1\setup.msi
copy patch.pcp C:\Tmp1
set PatchDir=%CD%
C:
cd Tmp1
msimsp -s patch.pcp -p Patch\patch.msp -l Patch\patch.log -f C:\Tmp1\Tmp -d
rmdir /s /q C:\Tmp1\TargetImage
rmdir /s /q C:\Tmp1\UpgradedImage
rmdir /s /q C:\Tmp1\Tmp
F:
cd %PatchDir%
mkdir Patch
mkdir Patch\%1
copy C:\Tmp1\Patch\*.* Patch\%1\*.*
rmdir /s /q C:\Tmp1
:end
Pause
注意,定位到 F :該行,改爲讀者工作目錄所在盤符,切記。
8、生成升級後的安裝文件 MSI ,修改 VS 安裝部署工程屬性 Version ,(如升級
前爲 1.0.0 ,升級後可改爲 1.0.1 ,注意改次版本號,關於主版本號和次版本號的升
級請參閱 MSDN ,也可見下文。)此時,系統提示是否自動修改 ProductCode 和
UpgradedCode ,注意此處非常關鍵,一定要記住選 NO 。具體爲什麼,有一定
ProductCode 和 UpgradedCode 知識的讀者肯定了解此處的意義, UpgradedCode 每
個產品家族爲同一個, ProductCode 只有在主版本號升級時,才需要修改,而 MSP
一般爲最小版本號升級所使用,所以,一句話,不要改。(改了,如果有問題,筆
者解決不了)

9、將生成的 MSI 拷貝到工作目錄的 UpgradedImage 下,按照 codeproject 一文的
讀者不用執行該步,因爲它文中的 Patch.cmd 將自動讀取 Debug 目錄下的 MSI ,
這就是它文中必須要求讀者將所有文件拷貝到安裝部署工程目錄下的原因。
10、該步不用執行,每當用戶 Build 安裝部署工程時,系統會自動更新
PackageCode ,這裏如修改 PackageCode ,可使用 Orca 打開 MSI ,在查看菜單下
摘要信息中修改。
11、終於到最後一步,運行 Patch.cmd ,如前後改動不大、並且打包文件較少時,
執行時間非常短,如果是改動較大,就稍等幾分鐘,抽根菸,喝杯咖啡。提醒:在
Properties 表中的 IncludeWholeFilesOnly 字段用於判定當打包文件不同時,提取增
量,還是直接採取整個新文件,前者可使得 MSP 瘦身,但 MSP 執行時間較長,
後者相反。
關於 PatchCMD :
1、首先設置環境變量 Path 以及臨時目錄;
2、如臨時目前存在先刪除,然後建立目錄格式;
3、拷貝升級前 MSI 到臨時目錄,並利用 MSIExec 解壓;注意:
TARGETDIR=C:\Tmp1\TargetImage\ ,一定不要與拷貝後的 MSI 相同目錄,因爲
MSI 解壓後還會生成一個較小的文件名相同的 MSI ,這樣會導致 MSIExec 解壓出
錯;(筆者被這步給整得很慘)
4、拷貝升級後 MSI 到臨時目錄,並利用 MSIExec 解壓;
5、拷貝 PCP 文件到臨時目錄,利用 msimsp 生成 MSP ;
6、將生成 MSP 拷回工作目錄,刪除臨時目錄。
關於主版本號、次版本號、最小版本號(當版本格式爲 1.0.0 時,個人意見如
下):
1、當程序只是局部更新,改動較小,修正少量 Bug ,可選擇發佈 MSP ,修改最
小版本號, ProductCode 不變;
2、當程序更新大量模塊的代碼,做了較大改動和調整,但結構保持不變,可修改
第二位版本號, ProductCode 改變,重新發布 MSI ;
3、當程序的架構發生變化,如從面向過程改動到面向對象全組件式架構,修改主
版本號, ProductCode 改變,重新發布 MSI 。
關於多個不同的目標版本升級到最新版本:
在 TargetImages 中一條記錄就對應一個目標版本升級到最新版本,例如 1.0.0 到
1.0.2 , 1.0.1 到 1.0.2 ,這樣建立的 MSP 可適用與將 1.0.0 、 1.0.1 升級到 1.0.2 ,
如果只有 1.0.1 到 1.0.2 ,就無法將 1.0.0 升級到 1.0.2 。對應的 Patch.cmd 和工作目
錄結構只需做略微改動即可達到目的。以下 Patch.cmd 可供參考:

(cd C:\Users\liuj\Desktop\PatchOld\Patch msimsp -s NMCPPatch.pcp -p NMCP_2010_patch1.msp -l log.txt)


@SETLOCAL
@set path=%path%;"C:\Program Files\Microsoft Platform
SDK\Samples\SysMgmt\Msi\Patching"
@set PatchTmp=C:\Tmp1
:ok
rmdir /s /q %PatchTmp%
mkdir C:\Tmp1
mkdir C:\Tmp1\TargetImage
mkdir C:\Tmp1\TargetImage\1
mkdir C:\Tmp1\TargetImage\2
mkdir C:\Tmp1\TargetImage\3
mkdir C:\Tmp1\UpgradedImage
mkdir C:\Tmp1\Patch
for %%a in ("TargetImage\1\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\TargetImage\1 /L*v
C:\Tmp1\TargetImage\setup.log
del C:\Tmp1\setup.msi
for %%a in ("TargetImage\2\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\TargetImage\2 /L*v
C:\Tmp1\TargetImage\setup.log
del C:\Tmp1\setup.msi
for %%a in ("TargetImage\3\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\TargetImage\3 /L*v
C:\Tmp1\TargetImage\setup.log
del C:\Tmp1\setup.msi
for %%a in ("UpgradedImage\*.msi") do copy "%%a" C:\Tmp1\setup.msi
msiexec /qb /a C:\Tmp1\setup.msi TARGETDIR=C:\Tmp1\UpgradedImage /L*v
C:\Tmp1\UpgradedImage\setup.log
del C:\Tmp1\setup.msi
copy patch4.pcp C:\Tmp1
set PatchDir=%CD%
C:
cd Tmp1
msimsp -s patch4.pcp -p Patch\patch4.msp -l Patch\patch4.log -f C:\Tmp1\Tmp -d
rmdir /s /q C:\Tmp1\TargetImage\1
rmdir /s /q C:\Tmp1\TargetImage\2
rmdir /s /q C:\Tmp1\TargetImage\3
rmdir /s /q C:\Tmp1\TargetImage
rmdir /s /q C:\Tmp1\UpgradedImage
rmdir /s /q C:\Tmp1\Tmp
F:
cd %PatchDir%
mkdir Patch
mkdir Patch\%1
copy C:\Tmp1\Patch\*.* Patch\%1\*.*
rmdir /s /q C:\Tmp1
:end
pause
參考鏈接:
1、
http://www.codeproject.com/KB/install/dotnetpatching.aspx?fid=209224&fr=1&df=90&
mpp=25&noise=3&sort=Position&view=Quick#xx0xx
2、http://msdn.microsoft.com/en-us/library/aa367816(VS.85).aspx



How to build a MSP?
You do not have to re-package the new version.
You can simply copy the previous structure and overwrite the files by the updated ones.

Related topics: MSI Automation, MSI Tables Overview, MSI Command Line, Create MSI Tables, MSI UAC VISTA, MSI Error Table, BootStrapper VISTA, MSP VISTA, Install MSI SDK Tools V3.1.4, Create CAB File, VB Script to Update PCP / MSI

1) Create a folder named for example C:\MSP an put the SDK MSP tools in it.
mpatch.exe, MsPatchC.dll, PatchWiz.dll
2) Create a Target Folder for example C:\MSP\Target
3) Copy the structure from the delivered original released product in the Target folder and put its MSI at the top of the structure.
4) Create an Upgraded Folder for example C:\MSP\Upgraded
5) Copy the content of C:\MSP\Target into the C:\MSP\Upgraded.
6) Overwrite the files that need to be patched with their newer better versions.
7) Edit the C:\MSP\Upgraded\MyAppXYZ.MSI and for example change the versions of the versioned files, the size and dates of the un-versioned files that need to replace the old and bad ones on the target machine.
Change the Package Code of the Upgraded MSI (do or do no change the version number in the Property Table of the Upgraded MSI see the Small Update vs. Minor Upgrade rules on the Microsoft Web site)
8) Update the PCP file (Patch Creation Properties File) to point to the Target and Upgraded MSIs
For example:
ImageFamilies Table
PDSCAN    DSCANPropName    93    3000
PatchMetadata Table
It is pretty self-explanatory
Properties Table 
It is pretty self-explanatory
TargetImages Table
PDSCAN_error    C:\MSP\Target\MyAppXYZ.MSI    PDSCAN_fixed    1        0
UpgradedImages Table
PDSCAN_fixed    C:\MSP\Upgraded\MyAppXYZ.MSI    PDSCAN
Save the PCP file.
9) To create the patch Run the command line:
Msimsp.exe -d -l MyAppXYZ.log -s MyAppXY.pcp -p MyAppXYZ.msp
10) To install the patch Run the command line:
msiexec /l*v MyAppXYZInstal.log /p MyAppXYZmsp REINSTALLMODE=omus /qb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章