【需求】
即將迎來2017的除夕夜,公司剛發佈的是一個小的版本,在這個版本中我的工作是:用InstallShield製作新的安裝包。
爲什麼變更重新制作安裝包的方式?是之前用XX插件(沒去了解)做的安裝包經常會被殺毒軟件報病毒。
【初嘗InstallShield】
原來也玩的做過安裝包,用vs自帶的工具去製作,在vs2013下,已經沒有提供部署工具了,不過可以下載安裝,一樣的用。
既然需求已經指明是IS(InstallShield)來製作,那就去看看。
早在上一個版本中,因爲個人對這個感興趣,使用InstallShield2013LimitedEdition,這是一個輕巧的嵌入vs使用的版本,因爲可以免費試用,是“可視化界面”引導的方式,Next/Next以及網上初級的資料較多,還是很容易做出一個demo。
在這個版本中,想用之前自己做的demo,發現工程無法使用,試用期到了,註冊一下可以永久使用,那就去註冊吧。
註冊界面中的“國籍”一項是ComboBox,沒有數據,需要翻牆……
翻牆後發現給的序列號沒有作用……
有破解工具/方法,沒用……
網上說可以打電話給中國區的客服解決,告知已經對該版本已經不在維護……
給官方發郵件,來回兩三封,還是推薦使用最新版本……
讓我感慨一下這裏,因爲已有的demo,內心排斥新的版本,所以在怎麼幹掉試用期,花費了一段時間去……
【使用IS時遇到的事一:第三方軟件打包】
如何將.NET Framework或者其他更多的第三方打包到安裝包中,如果目標機器沒有,自動安裝,且安裝的版本與電腦位數一樣?
這是一個系列問題。
1.在IS中,提供了一大部分可供打包的第三方文件列表,以.prq文件的方式提供,在列表中勾選下載,便下載到你的本地IS路徑SetupPrerequisites文件夾中。(.prq是個xml一樣,裏面記錄了下載的地址路徑等信息)
2.如果你需要的第三方軟件不在此列表中,尋找該軟件的.prq文件,放在SetupPrerequisites文件夾中,刷新IS的該列表即可。
3.在列表中勾選,且每個右鍵/屬性都設置爲從安裝包中提取使用。
4.在生成安裝包的時候,也設置爲從安裝包中提取軟件。
這裏就體現了IS的強大,安裝包運行時,目標機器如果沒有你勾選打包進去的第三方軟件,會自動安裝。且如果是x86的電腦,會安裝x86的第三方軟件,否則安裝x64第三方軟件,前提是該第三方軟件的x86和x64版本都打包進去了。
【使用IS時遇到的事二:安裝界面】
當我看到IS的logo,用IS做出一個安裝包時,我才明白小時候玩的遊戲和一些軟件的安裝包是用IS做的。
IS製作的安裝包界面可以選擇需要的Dialogs,也提供了一些theme,但是主體佈局結構逃不開左右雙欄結構。我替換素材,修改文字後,界面是美觀了一點,但是還是無法忍受這種佈局,且最不能讓我忍受的是,每一個界面中有“InstallShield”的字樣無法去掉。理解,但不願意接受。
工期還有一段時間,我問Frank
Frank,爲什麼要用IS來做安裝包,醜爆了。
因爲強大,可以滿足我們的需求。
我們的需求很簡單。
如果可以滿足我們的需求,當然是越漂亮越好了。
【我對打包的理解】
當我用IS做出一個可以用於發佈的安裝包時,對打包有了一個系統的理解。
打包就是將vs下realease模式運行的文件加密後遷移至目標機器,且正常運行,在署個名。
填寫基本信息
a.軟件名稱
b.公司名稱
c.軟件版本號
d.安裝包、應用程序和卸載程序的icon
軟件文件
程序集、config、數據庫……
部署軟件運行環境
.NET Framework、數據庫
其他(Core)
軟件安裝默認的路徑
軟件安裝目錄的結構
安裝時候美麗的界面
創建桌面與任務欄的快捷方式
軟件是否可以重複安裝
軟件是否可以在運行的時候卸載
軟件卸載的是否乾淨
軟件需要的第三方軟件是怎麼安裝給用戶
……
前三步是必須的,總結爲:某人的某物在各種環境下可以正常運行。
第四步並不是必須的,但是軟件與軟件的安裝包用戶體驗就差距在了這裏。
【嘗試Inno Setup】
在網上查找,別人的安裝包是怎麼做的?驚訝的發現,360、騰訊管家、PPTV等很多軟件的安裝界面風格很相似,尤其是有道雲筆記、網易雲音樂和QQ音樂,是一個有顏色的矩形,上面寫點字,下面有簡單的選項,安裝過程是輪播圖片。
Inno Setup也支持可視化的界面製作,製作步驟比IS簡單多了,但相對功能也簡單多了。採取腳本的方式製作,找到了一個成熟軟件的安裝包,本着”有輪子就不造輪子”的思想,嘗試改改。支持pascal語言,用C#的底子嘗試去改,變量名放前面,類型放後面,Boolean和vb一樣,寫方法簽名是function和js一樣(能看到“語言是共通的”影子,也讓我堅定,要把C#精通才是目標。)
兩天的時間,居然真的該成功了。我在裏面加入了一些自己需要的功能,核心是:
- 打包.NET Framework,如果目標機器沒有,運行安裝包中.NET Framework的安裝包。
- 打包SqlCe,如果目標機器沒有,是x86運行安裝包中x86版本SqlCe安裝包,是x64運行安裝包中x64版本SqlCe安裝包。
- 打包VC++,如果目標機器沒有,運行安裝包中的VC++安裝包。
由此感慨爲什麼程序猿喜歡開源。因爲開源,資料多一點,因爲開源,可以自己定義。IS固然強大,但也是在故步自封。
還有一點:自己做的東西,一定要自己看得過去才行。
【使用Inno Setup遇到的事】
在打包VC++組件的時候,我也想讓它像我打包的.NET Framework一樣,檢測目標機器沒有,運行VC++的安裝包,但是發現VC++不同於.NET Framework和數據庫,在XP SP2、XP SP3、Win7中註冊表的GUID各不相同,沒有辦法根據註冊表判斷。
那不管用戶有沒有,都去嘗試去安裝,這總不會有大問題…,但帶來的負面效果就是,用戶有了,還會彈出VC++的Windows Installer的界面,顯示要修復還是卸載,多一個沒有用的界面,總是讓人不爽。
有一種叫"靜默安裝"的方式,即不會顯示安裝過程,有就不安裝了,沒有就【偷偷的】給用戶安裝。但是VC++2012_x86版本給xp的目標機器上靜默安裝後,會自動重啓目標機器,這就更讓我惱火了,換成vc++2010的不會重啓,但是10不足以支持我們的需求。
直接將vc++的dll放到主程序文件夾中,當做軟件的一部分,也不去單獨安裝,以這樣的方式解決。
”靜默安裝”,哦,原來安裝完一些軟件,會推薦安裝一些軟件,有良心的呢,推薦安裝的軟件前面有個勾選,流氓的呢,在你不知情下就偷偷在安裝了,連托盤的提示都沒有。在這個版本中我還知道了有“靜默升級”這個詞,既有新版本發佈,用戶登錄舊的版本會自動升級。
【尾聲】
當我內心覺得驕傲時候,遇到了冷水,在這裏總結,和諸位共勉:
打包了6個無用的文件,xml、pak、ico
xml文件一般是代碼註釋的文件,像數據庫、ORM等都會有,不用打包進去。
ico製作安裝包的時候選好就可以了,沒有必要放在安裝包裏面中。
安裝過程中操作/提示增多
目標機器沒有安裝.NET Framework,會先彈出一個僅含有"確定"的mbx提示:我們將引導您……
目標機器沒有安裝數據庫,會先彈出一個僅含有"確定"的mbx提示:我們將引導您安裝……
第三方軟件安裝與主程序安裝相對獨立
之前的版本是用壓縮包製作的安裝包,檢測到目標機器沒有.NET Framework和數據庫後,分別點同意協議和確定,然後.NET Framework、數據庫和主程序三個軟件會共享一個進度條進行安裝。
現在的版本是檢測到目標機器沒有.NET Framework,提示引導安裝後,提取安裝包中打包進去的.NET Framework安裝包運行,是原生的安裝過程。
安裝成功後,緊接着自動檢測目標機器是否有數據庫,當目標機器中沒有數據庫,提示引導安裝後,提取安裝包中打包進去的數據庫安裝包運行,是原生的安裝過程。
安裝成功後,緊接着安裝主程序軟件。
雖然是運行的一個安裝包,但過程中展現的是三個獨立的安裝過程,三個進度條,會給用戶造成一種錯覺:我安裝你的軟件,你給我安裝了些什麼亂七八糟的。
卸載不乾淨
軟件使用過程中產生的一些文件在軟件卸載的時候沒有刪掉。
可以覆蓋安裝
軟件已經安裝好,可以直接再次安裝覆蓋,沒有像Windows Installer一樣,有一個修復/卸載的界面。
可以在運行時卸載
會刪掉一大部分文件,但是運行時用到的一些文件存留。
默認安裝在D盤更好
如果檢測目標機器有D盤,將軟件安裝在D盤,即使用戶重裝系統也沒事。
當雙屏的用戶運行安裝包,出現兩個安裝首頁,其中一個還帶有Windows邊框
...
但還是有做的好的地方
安裝過程漂亮多了
安裝目錄/任務欄的文件夾是中文名稱
感悟:沒有一個功能是一個版本造就十全十美的。