步驟
1. 開(kāi)始
網(wǎng)上說(shuō)一般的打包工程選擇Basic MSI Project,如果需要對(duì)界面需要進(jìn)行很高的定制就需要選擇InstallScript MSI Project。

由于我只需要打包,已經(jīng)執(zhí)行部分腳本因此我選擇了Basic MSI Project。輸入Project Name,選擇Location后點(diǎn)擊OK,新建工程。
進(jìn)入到下圖界面,此時(shí)我們可以選擇兩種打包方式(紅框處選擇)
1.Project Assistant 可以進(jìn)行簡(jiǎn)單的類似向?qū)ь惖呐渲眉纯蛇M(jìn)行打包工作,如果選擇這種方式,Visual Studio自帶的工具也能輕松實(shí)現(xiàn)
2.Installation Designer 完全自由化的配置,自我定制程度最高。
根據(jù)需求情況,我自然選擇第二種方式

2.配置
點(diǎn)選Installation Designer,進(jìn)入如下界面

紅框處就是需要選擇配置的區(qū)域了。
2.1 General Information
在Installation Information中選擇General Information,在這里配置軟件的基本信息

紅線處你可以寫(xiě)上你的大名,你是這個(gè)Project的作者
下面的Setup Langueages可以選擇安裝語(yǔ)言,我這里只考慮了簡(jiǎn)體中文,故未更改設(shè)置。

紅框里填寫(xiě)上你公司的名字和網(wǎng)址,我舉個(gè)例子才寫(xiě)的這兩個(gè)

在Product Properties中填入軟件的信息,軟件的名字、版本什么的。
INSTALLDIR是指安裝目錄,圖中的配置方法默認(rèn)是指這個(gè)路徑: C:/Program Files/Transformers/Demo
2.2 Files

右邊的區(qū)域被分成了四塊,上面兩塊是本地計(jì)算機(jī),下面兩塊是目標(biāo)計(jì)算機(jī)
總的思路跟資源管理一樣,這里你就可以按照你自己的思路來(lái)定制了
舉個(gè)列子,我隨便找點(diǎn)東西打包
在Destination computer’s folders中把樹(shù)展開(kāi),選中Demo[INSTALLDIR],這是什么東西相信看看就明白了,如果不明白的話那就需要再學(xué)習(xí)下基礎(chǔ)知識(shí)了。
從Source computer‘s files(本地計(jì)算機(jī))中拖動(dòng)一些文件到Destination computer’s files中,就會(huì)彈出如下提示

你需要?jiǎng)?chuàng)建一個(gè)Feature,什么是Feature我不太清楚,我把它理解成一個(gè)文件的集合。輸入名字,我輸入的是Main,點(diǎn)擊OK

(如果你看不到上圖中左邊紅框內(nèi)的東西,就在那里的樹(shù)狀結(jié)構(gòu)任意節(jié)點(diǎn)點(diǎn)擊右鍵,勾選Show Components就能看到了)
當(dāng)你把你想打包的東西添加進(jìn)入過(guò)后,一個(gè)最基本的包就打好了,已經(jīng)可以編譯執(zhí)行嘗試安裝了。

工具欄上的圖標(biāo)編譯跟執(zhí)行跟VC++6.0的圖標(biāo)是一樣的吧,第三個(gè)紅圈就是卸載
當(dāng)然只做到這一步是不能滿足我的需求的,我還需要添加一個(gè)數(shù)據(jù)庫(kù)文件夾,在Demo[INSTALLDIR]上點(diǎn)擊右鍵——選擇New Folder——命名為Database
進(jìn)行圖中操作

直接點(diǎn)擊下一步,到第二步,按圖中操作

再下一步,將數(shù)據(jù)庫(kù)相關(guān)文件都添加進(jìn)去,當(dāng)然你可以先添加一個(gè)文件(夾)進(jìn)去,其余的在“Files and Folders”中繼續(xù)添加。
至此,數(shù)據(jù)庫(kù)文件也添加到了安裝包內(nèi),不過(guò)默認(rèn)的安裝流程中只有選擇主程序的安裝路徑?jīng)]有選擇數(shù)據(jù)庫(kù)的路徑,因此需要手動(dòng)添加。
方法見(jiàn)2.3
2.3 Sequences
大家應(yīng)該都安裝過(guò)軟件,最菜的人也知道一路點(diǎn)擊“下一步”來(lái)安裝程序。這部分就講一下如何定制安裝的順序,就是“上一步”與“下一步”的跳轉(zhuǎn)。

最左邊選擇Custom Actions and Sequences后,在中間的樹(shù)中如圖操作,User Interface上點(diǎn)擊右鍵——Insert…

點(diǎn)擊OK后Sequences樹(shù)中多了個(gè)DatabaseFolder,可以拖動(dòng)他到想要的位置。
當(dāng)然Sequences的編輯還沒(méi)那么簡(jiǎn)單,貌似通過(guò)拖動(dòng)無(wú)法實(shí)現(xiàn),需要對(duì)每個(gè)窗體進(jìn)行編輯。

如圖所示,圖中的意思就是在選擇DatabaseFolder的路徑的對(duì)話框中,點(diǎn)擊“上一步”按鈕會(huì)跳轉(zhuǎn)到CustomerInformation這個(gè)對(duì)話框中
就是這樣編輯,工作量也不小,或者是有其他什么簡(jiǎn)便方法,可是我不知道
2.4 動(dòng)態(tài)修改XML或者INI文件
在這個(gè)項(xiàng)目中,我需要將項(xiàng)目的安裝路徑寫(xiě)在安裝目錄下的一個(gè)ini文件中,這個(gè)ini文件是需要打包在項(xiàng)目中的。

首先確保ini文件已經(jīng)添加進(jìn)入打包工程。

在INI File Changes中新建一個(gè)與欲改寫(xiě)的ini文件同名的ini文件——my.ini
在my.ini文件下建立欲改寫(xiě)的section(我的例子是installdir)以及keyword(例子中是dir),編輯keword
在Data Value中寫(xiě)入系統(tǒng)變量[INSTALLDIR],這個(gè)就表示程序的安裝目錄。如果要獲取數(shù)據(jù)庫(kù)的安裝目錄就可以寫(xiě)入[DATABASEDIR]
XML的修改跟這個(gè)類似,相信都可以融會(huì)貫通。
在我的實(shí)際項(xiàng)目中,遇到個(gè)問(wèn)題。
my.ini是mysql要用到的東西,是放在數(shù)據(jù)庫(kù)目錄中的,安裝上面的方法略加修改就可以實(shí)現(xiàn)。
但是mysql需要的路徑類似于C:/MyDataBase/MySql/
而通過(guò)我上面方法[DATABASEDIR]獲得的路徑是Windows標(biāo)準(zhǔn)的 C:/MyDataBase/MySql/
因此我必須要把這個(gè)斜線給反過(guò)來(lái),我不知道怎么反。只知道可能通過(guò)腳本來(lái)修改(如果有高人知道簡(jiǎn)便方法,請(qǐng)指點(diǎn))
腳本見(jiàn)2.5
2.5 InstallScript
剛剛接觸,我連在哪里寫(xiě)腳本都不知道,跟別說(shuō)如何寫(xiě)腳本了,雖然我現(xiàn)在也不會(huì)寫(xiě)腳本~~(求教啊)
雖然還不會(huì)寫(xiě)腳本,還是先把在哪里寫(xiě)以及如何運(yùn)行腳本寫(xiě)出來(lái),希望有跟我有同樣問(wèn)題的朋友看到。

然后出現(xiàn)下圖

右邊是編輯區(qū),用于寫(xiě)腳本。有編程經(jīng)驗(yàn)的話這個(gè)不難理解
腳本的執(zhí)行回到Custom Actions and Sequences,在中間的列表中的Custom Actions上點(diǎn)擊右鍵,選擇Custom Actions Wizard
在Action Type中選擇Run InstallScript code,在Insert into Sequence中的Install Execute Sequence處選擇何時(shí)執(zhí)行,其余按向?qū)崾静僮鳌?/p>
#include "ifx.h" export prototype ProcessAfterDataMove(HWND); export prototype STRING ReplaceStr(STRING); export prototype RunBat(STRING);
function ProcessAfterDataMove(hMSI) STRING P_Dir,DB_Dir; // P_Dir是主程序目錄下ini文件的路徑,DB_Dir是數(shù)據(jù)庫(kù)的路徑 begin P_Dir = TARGETDIR + "temp.ini"; //TARGETDIR是系統(tǒng)變量,存放安裝路徑 //GetProfString()函數(shù)是系統(tǒng)函數(shù),用于讀取ini文件中的信息 //第一個(gè)參數(shù)指定文件所在路徑 //第二個(gè)參數(shù)指定section名 //第三個(gè)參數(shù)指定keyword名 //最后一個(gè)參數(shù)用于 返回 前面指定的keyword的值。注意:是返回! GetProfString (P_Dir, "temp", "dir", DB_Dir); //ReplaceProfString()函數(shù)是系統(tǒng)函數(shù),用于修改ini文件中keyword的值 //第一個(gè)參數(shù)指定文件所在路徑 //第二個(gè)參數(shù)指定section名 //第三個(gè)參數(shù)指定keyword名 //第四個(gè)參數(shù)指定keyword原值 //第五個(gè)參數(shù)指定keyword的新值 //只有前面4個(gè)條件完全匹配時(shí),原值才會(huì)被第五個(gè)參數(shù)中的新值替換 ReplaceProfString (DB_Dir + "my.ini", "mysqld", "basedir", "/"" + DB_Dir + "/"", "/"" + ReplaceStr(DB_Dir) + "/""); ReplaceProfString (DB_Dir + "my.ini", "mysqld", "datadir", "/"" + DB_Dir + "Data/"", "/"" + ReplaceStr(DB_Dir + "Data") + "/""); //執(zhí)行批處理 RunBat(DB_Dir); end; function STRING ReplaceStr(Str) LIST StrList; STRING temp,path; begin //創(chuàng)建List存放Tokens StrList = ListCreate(STRINGLIST); //分解出Token存入List StrGetTokens( StrList, Str, "http://"); //取出TokenList的頭節(jié)點(diǎn) ListGetFirstString(StrList, temp); //頭節(jié)點(diǎn)后加入 “/” path = temp + "/"; //循環(huán) 取出所有的節(jié)點(diǎn) 后面加入“/” while(ListGetNextString(StrList, temp) = 0) path = path + temp + "/"; endwhile; return path; end; function RunBat(DB_Dir) //執(zhí)行批處理 STRING dir; begin dir = DB_Dir + "bin//exec.bat" ; //調(diào)用其他程序 //第一個(gè)參數(shù)是調(diào)用程序的位置 //第二個(gè)參數(shù)是調(diào)用程序運(yùn)行所需參數(shù) //WAIT表示等到執(zhí)行完畢這個(gè)程序,安裝再繼續(xù)進(jìn)行 LaunchAppAndWait(dir, "",WAIT); end; |