青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

使用NSIS (NullSoft Scriptable Install System)制作安裝程序快速指南 ---- 轉

“用戶對你的第一印象是你的安裝程序”

——摘自NSIS網頁

對于非技術用戶,例如兒童,家長,作家等等。如果他們無法很容易地安裝某個軟件,他們就會放棄這個軟件!而開發者和大多數程序員,討厭制作Windows安裝程序,甚至討厭學習如何制作安裝程序。從10年前的Windows Installer Shield, Installer Shield Express等等,我從來沒有耐心下來搞清楚如何制作安裝程序。最近由于需要向兒童發布一個軟件,使得我不得不坐下來親自制作一個安裝程序。我沒有找到好的中文資料,只得自己摸索英文材料。所以我寫這樣一個簡易指南,希望能夠有所幫助。

[Why NSIS]

NSIS是免費的,使用并且許多開源軟件使用NSIS制作其安裝程序。NSIS最早是WinAMP用于為其播放器安裝皮膚的,后來成為了流行的安裝程序制作工具。它使用腳本來制作安裝程序,基本上比較小巧,并且易學易用。

[寫作方法]

例子是最好的學習方法之一。本文不是一個關于NSIS的全面參考,我希望讀者能夠根據本文“照貓畫虎”,快速制作安裝程序,如果讀者遇到了某些特定問題,可以通過NSIS附帶的用戶手冊,或者通過網絡搜索引擎找到答案。

[下載和準備]

首先需要下載NSIS,地址為:http://prdownloads.sourceforge.net/nsis/nsis-2.20-setup.exe?download

如果該連接有變動,讀者可以自行到source forge下載,source forge的網址為:http://sourceforge.net/

進入后搜索nsis即可。下載后即可安裝NSIS。NSIS本身包括幫助手冊,例子目錄,基本編譯器,和一些擴展插件。基本工作原理是,開發者將自己的程序準備好,然后利用文本編輯工具寫好安裝腳本,最后利用NSIS編譯器將腳本編譯,并和程序一起打包。可以用任何文本編輯器制作自己的腳本。這里我推薦一個Eclipse的NSIS插件[1]。其屏幕截圖如下:

 

 該插件可以直接從Eclipse安裝,需要預先安裝Eclipse GEF 3.1。在Eclipse的Update Manager中加入http://eclipsensis.sf.net/update后即可安裝相關插件。

[編寫腳本]

為了不從0開始制造輪子,我們利用NSIS的例子腳本,對其加以改動。首先說明一下我的安裝程序打算做什么事情。我打算制作一個Squeak 3.9[2]的安裝程序。它會從網絡上分別下載Squeak的虛擬機和映象文件共兩個zip包到用戶的計算機上。然后解開這些zip包到用戶的指定目錄,例如C:\Program files\squeak3.9\下。最后在用戶的桌面和啟動菜單建立squeak執行程序的快捷方式以及將來卸載時用的程序。

首先看一看NSIS的最簡單的例子提供了什么,NSIS的Example目錄下有一個例子叫做:example1.nsi,用文本編輯器打開它,其內容為:

; 注釋說明
;--------------------------------

; 安裝程序的名字,該名字會顯示在安裝程序對話框的標題中
Name "Example1"

; 安裝程序的最終文件名,編譯后,所有文件被打包生成一個獨立的安裝程序,名叫example1.exe
OutFile "example1.exe"

; 缺省安裝到的目錄,一般為C:\Program Files\Example1
InstallDir $PROGRAMFILES\Example1

;--------------------------------
; 頁,表示安裝程序的對話框一共會變化幾頁,一般首頁是版權信息,然后第二頁讓用戶選擇安裝目錄,
; 接下來安裝文件等等。這個例子只有兩個頁,選擇目錄,和復制文件。


Page directory
Page instfiles

;--------------------------------
; 每頁有若干節(section),各個節內部才真正進行各種操作

Section "" ;由于沒有讓用戶選擇需要安裝的組件,所以節的名字可以忽略,腳本將從這里真正執行

  ; 安裝程序解包后,將文件復制到OutPath中。本例將文件復制到用戶選擇的安裝目錄內
  SetOutPath $INSTDIR

  ; 將與腳本處于同一目錄下的文件壓縮打包到安裝程序中,將來用戶安裝時,
  ; 這些文件會被解包復制到OutPath里

  File example1.nsi ; 將腳本自己打包

SectionEnd ; 本節結束

 

這個例子非常簡單,他把腳本自己打包進example1.exe中,然后可以發布這個example1.exe,它本身是一個安裝程序。用戶在自己的計算機上一旦運行此程序,就會出現一個對話框,讓用戶選擇安裝目錄,用戶選擇好后,其會將example1.nsi從包內解出,并復制到用戶選擇好的安裝目錄內。可以用這個腳本做一個測試,有兩個方法可以編譯腳本生成可執行的安裝程序,一個方法時在這個腳本上點鼠標右鍵,選擇“Compile NSIS script”,然后NSIS編譯器就會啟動,編譯腳本打包文件生成example1.exe,第二個方法是在Eclipse內選擇菜單 EclipseNSIS | Compile Script,或者使用快鍵Alt+C,也會生成example.exe。雙擊這個exe就會運行此安裝程序將example.nsi復制安裝的指定目錄。

在這個例子的基礎上,很容易寫出我自己的安裝程序。

例子腳本和我的要求有若干不同,主要如下:

  1. 我需要從網絡下載zip到用戶計算機

  2. 我需要親自解開zip包到用戶目錄

  3. 我需要建立桌面和程序快捷方式

  4. 我需要建立卸載程序

首先針對第1點要求,經過查閱資料,發現NSIS帶有一個下載插件可以完成此功能,其典型用法是:

NSISdl::download http://www.yoursite.org/yourpack.zip "$INSTDIR\yourpack.zip"
Pop $R0 ; 獲得下載結果的返回值
StrCmp $R0 success download_ok
  SetDetailsView show
  DetailPrint "download failed: $R0"
  Abort
download_ok:
  DetailPrint "download $R0 OK"

上面這段代碼的意思是,首先調用NSISdl::download這個插件去網絡上下載yourpack.zip文件到用戶本地的安裝目錄下,并且文件名保持不變。是否下載成功的結果放在寄存器變量$R0中,如果下載成果這個變量中的指應該是字符串success,所以StrCmp的作用就是比較返回結果是否成功,如果成功,就跳轉到download_ok標記,否則如果下載失敗(包括網絡問題等等),就打印出失敗信息,并且終止安裝。

這段代碼具有一定的代表性,實際上可以利用它從網絡下載多個文件到用戶計算機,唯一不同的就是下載地址和保存到本地的文件名。因此可以把它制作成一個函數,如下:

Function DownloadFile
  NSISdl::download $remote_zip_file "$INSTDIR\$local_zip_file"
    ; 略...
  download_ok:
    DetailPrint "download $R0 OK"
FunctionEnd

這個函數的參數,用兩個全局變量$remote_zip_file$local_zip_file傳入。調用方法如下:

Var remote_zip_file
Var
local_zip_file

StrCpy $remote_zip_file "http://ftp.squeak.org/current_stable/win/Squeak-Win32-3.7.1-VM.zip"
StrCpy $local_zip_file "Squeak-Win32-3.7.1-VM.zip"
Call DownloadFile

NSIS中的變量用Var語句聲明,聲明時不帶有$前綴,使用時,利用$前綴進行引用,這一點和Unix的Shell一樣,賦值不采用等號,而使用StrCpy語句,進行字符串復制。

至此第一個需求就可以得到完全滿足了,我可以分別下載Squeak的虛擬機和Squeak的映像到用戶的計算機,此時的安裝腳本如下:

; 安裝程序的名稱
Name "Squeak 3.9 Installer"

; 安裝程序的文件名
OutFile "squeak3.9_win_installer.exe"

; 缺省安裝目錄
InstallDir "$PROGRAMFILES\Squeak3.9"

;--------------------------------
; 安裝對話框包含的頁內容
; Pages


Page directory
Page instfiles

;--------------------------------
; 自定義的全局變量

Var remote_zip_file
Var local_zip_file

; 安裝Section
Section ""

  ; 安裝輸出的目錄
  SetOutPath $INSTDIR

  ; 從網絡分別下載虛擬機和映像
  Call DownloadVM
  Call DownloadImage

SectionEnd ; Section結束
 

; 下載虛擬機
Function DownloadVM
  StrCpy $remote_zip_file "http://ftp.squeak.org/current_stable/win/Squeak-Win32-3.7.1-VM.zip"
  StrCpy $local_zip_file "Squeak-Win32-3.7.1-VM.zip"
  Call DownloadFile
FunctionEnd
 

; 下載映像
Function DownloadImage
  StrCpy $remote_zip_file "http://ftp.squeak.org/3.9/Squeak3.9-RC2-7064.zip"
  StrCpy $local_zip_file "Squeak3.9-RC1-7064.zip"
  Call DownloadFile
  Call ExtractFile
FunctionEnd
 

; 下載文件的通用函數
Function DownloadFile
  NSISdl::download $remote_zip_file "$INSTDIR\$local_zip_file"
  Pop $R0 ; Get the return value
  StrCmp $R0 success download_ok
    SetDetailsView show
    DetailPrint "download failed: $R0"
    Abort
  download_ok:
    DetailPrint "download $R0 OK"
FunctionEnd

讀者可以使用NSIS編譯這個腳本并運行安裝程序,它會將虛擬機和映像的zip文件下載到指定目錄下(例如C:\Program Files\Squeak3.9\)并結束。下面著手實現第二個需求,將zip包解開。查閱NSIS手冊,沒有發現類似功能的函數或者插件。其原因是, NSIS在打包時,會自動將普通文件按照zip標準的壓縮算法打包,而執行exe時,則自動解包。所以NSIS沒有考慮將zip再次打包,以及顯式解壓縮 zip文件的功能。經過在網絡上使用搜索引擎查找,發現了一個第三方插件NsisUnz[3],其可以從這里下載http://home.no.net/nxs/nsis/nsisunz.7z,該文件是7zip格式,可以在這里下載其壓縮解壓縮工具:http://www.7-zip.org/。解開軟件包后,將其中的nsisunz.dll復制到NSIS目錄下的Plugins子目錄下即可(例如C:\Program Files\NSIS\Plugins\),該Plugin的使用方式為:

nsisunz::UnzipToLog "$INSTDIR\myfile.zip" "$INSTDIR"

若解壓縮成功,該命令返回字符串success,否則表示解壓縮失敗。因此可以仿照上面的下載函數,寫出一個通用的解壓縮函數,它接受一個zip文件的文件名字符串,然后對其解壓縮,如下:

Function ExtractFile
  nsisunz::UnzipToLog "$INSTDIR\$local_zip_file" "$INSTDIR"
  Pop $R0
  StrCmp $R0 "success" unzip_ok
    DetailPrint "$R0"
    Abort
  unzip_ok:
    DetailPrint "extract $R0 OK"
    Delete "$INSTDIR\local_zip_file"
FunctionEnd

這個解壓縮函數一旦成功,就會刪除原來下載的zip文件,以節約用戶空間。采用這個通用的解壓縮函數,可以修改上面的虛擬機和映像下載函數為:

Function DownloadVM
  StrCpy $remote_zip_file "http://ftp.squeak.org/current_stable/win/Squeak-Win32-3.7.1-VM.zip"
  StrCpy $local_zip_file "Squeak-Win32-3.7.1-VM.zip"
  Call DownloadFile
  Call ExtractFile
FunctionEnd

Function DownloadImage
  StrCpy $remote_zip_file "http://ftp.squeak.org/3.9/Squeak3.9-RC2-7064.zip"
  StrCpy $local_zip_file "Squeak3.9-RC1-7064.zip"
  Call DownloadFile
  Call ExtractFile
FunctionEnd

編譯這個改進的腳本并運行,可以發現zip被下載后解開成各自的文件了。這里有一些小問題,有些zip包里,就包含一些文件,但是有些zip包里,卻包含目錄,例如上面兩個zip包解開后,在$INSTDIR下就會出現這樣的文件結構:

+Squeak.exe
+SqueakFFIPrims.dll
+Squeak3.9-RC2-7064\
  +Squeak3.9-RC2-7064.image
  +Squeak3.9-RC2-7064.changes
  +SqueakV39.source
  +WelcomeSqueak39

而我需要所有這6個文件,都在同一目錄下,因此需要使用NSIS的Rename函數移動這些文件。為此修改DownloadImage函數如下:

Function DownloadImage
  ;略...
  Call DownloadFile
  Call ExtractFile

  ; 將文件移動到$INSTDIR下,并刪除空掉的子目錄
  Rename "$INSTDIR\Squeak3.9-RC2-7064\Squeak3.9-RC2-7064.changes" "$INSTDIR\Squeak3.9-RC2-7064.changes"
  Rename "$INSTDIR\Squeak3.9-RC2-7064\Squeak3.9-RC2-7064.image" "$INSTDIR\Squeak3.9-RC2-7064.image"
  Rename "$INSTDIR\Squeak3.9-RC2-7064\SqueakV39.sources" "$INSTDIR\SqueakV39.sources"
  Rename "$INSTDIR\Squeak3.9-RC2-7064\WelcomeSqueak39" "$INSTDIR\WelcomeSqueak39"
  RMDir "$INSTDIR\Squeak3.9-RC2-7064"
FunctionEnd

至此,第二個需求就滿足了,為了方便用戶使用,下面實現第3個需求——在桌面和程序菜單中建立Squeak的快捷方式,這樣用戶只需要雙擊這些快捷方式的圖標,就可以運行Squeak了。squeak的運行方式是按照這樣的命令行:

squeak.exe squeak_iamge_filename.image

但是Windows的目錄名可能會帶有空格,例如C:\ Program Files\Squeak3.9\中,Program和Files之間就存在一個空格,這樣squeak.exe會把空格前的部分,C:\Program 當作映像文件名,而把后面的Files\Squea...當作參數,這就出現了歧義。為此需要把路徑用""括起來。但是NSIS中,會把""忽略掉,辦法是在""外再括一層''。此后就可以使用NSIS的CreateShortCut函數創建快捷方式了。當必要的文件下載并解壓縮成功后就進行這一步的內容,為此修改Section如下:

Section ""

  SetOutPath $INSTDIR

  Call DownloadVM
  Call DownloadImage

  ; 創建快捷方式
  CreateDirectory "$SMPROGRAMS\Squeak\3.9\"
  CreateShortcut "$SMPROGRAMS\Squeak\3.9\squeak.lnk" $INSTDIR\Squeak.exe
     '"$INSTDIR\Squeak3.9-RC2-7064.image"'
  CreateShortcut "$DESKTOP\squeak3.9.lnk" $INSTDIR\Squeak.exe
     '"$INSTDIR\Squeak3.9-RC2-7064.image"'

  Exec '$INSTDIR\Squeak.exe "$INSTDIR\Squeak3.9-RC2-7064.image"' ; 安裝成功后自動運行Squeak
  SetAutoClose true ; 安裝結束后自動關閉安裝程序
SectionEnd

為了進一步增強用戶友好性,還在安裝成功后,自動運行Squeak并關閉安裝程序。

最后,良好的安裝程序還應該提供卸載功能,并干凈地清除用戶計算機上的內容。為此可以利用NSIS提供的 UnistPage命令創建卸載程序頁面,并提供一個名叫Uninstall的Section實際進行卸載工作。對于Squeak這點卸載工作的內容包括,刪除程序文件,刪除快捷方式等,其實現如下:

; 用于安裝的頁

Page directory
Page instfiles
 

; 用于卸載的頁
UninstPage uninstConfirm
UninstPage instfiles

;--------------------------------
; 略...

Section "Uninstall"
  ; 刪除文件
  Delete "$INSTDIR\*.image"
  Delete "$INSTDIR\*.changes"
  Delete "$INSTDIR\*.dll"
  Delete "$INSTDIR\*.sources"
  Delete "$INSTDIR\*.exe"
  Delete "$INSTDIR\WelcomeSqueak39"
  RMDir "$INSTDIR"

  ; 刪除快捷方式
  Delete "$SMPROGRAMS\Squeak\3.9\squeak.lnk"
  Delete "$DESKTOP\squeak3.9.lnk"
  RMDir "$SMPROGRAMS\Squeak\3.9"

  SetAutoClose true
SectionEnd

提供Uninstall功能的腳本,需要在安裝的最后一步身成uninstall.exe供用戶日后使用,為此在安裝Section最后增加這樣一行:

  CreateShortcut "$SMPROGRAMS\Squeak\3.9\uninstall.lnk" "$INSTDIR\uninstall.exe"
  WriteUninstaller "$INSTDIR\uninstall.exe"

并在Uninstall的Section中增加對卸載快捷方式的刪除動作:

  Delete "$SMPROGRAMS\Squeak\3.9\uninstall.lnk"
 

至此一個完整的安裝程序就制作完成了,該安裝腳本的完整代碼可以在這里下載。squeak3.9_win_install.nsi

[繼續提高]

包括國際語言支持,斷點續傳等。待續

[參考文獻]

[1]. Eclipse NSIS plug-in: http://eclipsensis.sourceforge.net/

[2]. Squeak http://www.squeak.org

[3]. Nsisunz plug-in http://nsis.sourceforge.net/Nsisunz_plug-in 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1552043

posted on 2008-01-30 19:37 大龍 閱讀(3221) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久视频精品| 最新国产成人在线观看| 久久久国产91| 美女国内精品自产拍在线播放| 欧美成人激情在线| 久久久在线视频| 欧美日韩视频专区在线播放 | 香蕉成人伊视频在线观看| 久久国产手机看片| 欧美日韩一区在线观看视频| 在线看视频不卡| 久久精品官网| 一区二区三区四区五区精品视频| 在线亚洲欧美专区二区| 麻豆国产va免费精品高清在线| 国产精品久久夜| 亚洲伦理网站| 免费观看成人鲁鲁鲁鲁鲁视频| a4yy欧美一区二区三区| 欧美sm视频| 极品尤物av久久免费看| 欧美一区三区三区高中清蜜桃| 日韩午夜黄色| 欧美精品一区二区久久婷婷| 久久网站免费| 国内综合精品午夜久久资源| 亚洲欧美国产毛片在线| 亚洲精品视频在线看| 理论片一区二区在线| 国内揄拍国内精品久久| 久久久国产精品一区二区三区| 一区二区三区免费观看| 美女视频黄免费的久久| 午夜天堂精品久久久久| 国产精品久久久免费| 亚洲图片自拍偷拍| 99国产精品99久久久久久粉嫩| 欧美激情四色| 一区二区久久| 一卡二卡3卡四卡高清精品视频| 欧美激情一区二区三区在线| 亚洲日本中文字幕| 91久久国产综合久久91精品网站| 美女国产精品| 亚洲久久一区二区| 日韩亚洲精品视频| 欧美无砖砖区免费| 亚洲伊人伊色伊影伊综合网| 中文高清一区| 国产欧美韩国高清| 99av国产精品欲麻豆| 亚洲精品视频在线观看网站| 欧美日韩视频在线第一区| 亚洲综合国产| 亚洲永久免费精品| 狠狠做深爱婷婷久久综合一区| 欧美风情在线观看| 欧美日韩亚洲综合| 久久成人精品视频| 久久在精品线影院精品国产| 日韩视频在线一区二区三区| 亚洲午夜高清视频| 一区免费视频| 亚洲人成在线观看网站高清| 欧美视频一区二区三区…| 午夜亚洲性色福利视频| 性欧美暴力猛交69hd| 尤物99国产成人精品视频| 亚洲国产激情| 国产精品户外野外| 久久久99爱| 欧美激情按摩| 欧美一级在线亚洲天堂| 午夜精品福利一区二区三区av | 欧美一级网站| 久久久久久久999精品视频| 91久久精品一区二区别| 一本一道久久综合狠狠老精东影业 | 亚洲一区二区三区欧美| 精品电影在线观看| 亚洲精品在线视频| 国产一区二区三区在线免费观看| 久久久精品国产一区二区三区| 久久久久91| 亚洲尤物视频在线| 你懂的网址国产 欧美| 欧美一区成人| 久久久亚洲一区| 亚洲精选91| 亚洲第一毛片| 国产女人精品视频| 亚洲激情在线观看| 男男成人高潮片免费网站| 亚洲一级在线观看| 亚洲女性裸体视频| 日韩午夜电影av| 久久久久国产精品一区| 亚洲一区二区三区免费视频| 久久亚洲视频| 久久国内精品自在自线400部| 欧美不卡视频一区| 久久久亚洲综合| 国产精品私拍pans大尺度在线| 久久不射中文字幕| 欧美色欧美亚洲另类二区| 亚洲成色999久久网站| 国产主播一区二区| 欧美一二三视频| 欧美体内she精视频| 欧美激情小视频| 亚洲国产精品一区二区第一页| 欧美在线在线| 欧美专区在线| 麻豆亚洲精品| 欧美高清在线精品一区| 国内精品美女在线观看| 欧美专区福利在线| 久久另类ts人妖一区二区 | 欧美精品亚洲精品| 久久字幕精品一区| 国产一区二区久久| 欧美在线你懂的| 久久国产精品久久久久久| 国产欧美在线播放| 欧美一区二区三区在线播放| 午夜久久久久久| 国产欧美欧美| 欧美一区影院| 老司机67194精品线观看| 在线观看日韩av先锋影音电影院| 久久久精品日韩| 欧美在线高清视频| 激情欧美一区二区三区| 久久视频这里只有精品| 欧美韩国日本综合| 夜夜爽av福利精品导航| 久久久免费观看视频| 亚洲国产精品久久| 亚洲综合精品一区二区| 国产欧美69| 久久全国免费视频| 久久国产精品72免费观看| 国产婷婷色综合av蜜臀av| 久久精品99国产精品日本| 亚洲第一精品在线| 午夜欧美精品久久久久久久| 国模精品一区二区三区| 亚洲伊人第一页| 美女尤物久久精品| 日韩一级不卡| 国产日韩欧美91| 欧美电影免费观看| 亚洲国产另类 国产精品国产免费| 夜夜嗨av一区二区三区网站四季av | 在线免费观看欧美| 欧美超级免费视 在线| 一区二区三区成人| 久久这里只有| 亚洲欧美激情视频| 亚洲丁香婷深爱综合| 狂野欧美激情性xxxx| 一区二区三区高清在线观看| 亚洲欧美一区二区三区在线| 在线看成人片| 国产欧美激情| 欧美日韩福利在线观看| 久久本道综合色狠狠五月| 亚洲欧洲综合| 久久久久国产精品午夜一区| 免费在线欧美黄色| 亚洲欧美日韩国产一区二区三区| 欧美国产1区2区| 欧美在线一二三区| 亚洲乱码国产乱码精品精可以看| 欧美性jizz18性欧美| 欧美成人精品不卡视频在线观看| 亚洲视频在线观看免费| 亚洲国产精品一区二区三区| 欧美亚洲综合另类| 亚洲天堂免费在线观看视频| 一区在线观看视频| 欧美日韩国产色站一区二区三区| 久久疯狂做爰流白浆xx| 亚洲欧美久久久| 妖精视频成人观看www| 亚洲黑丝在线| 欧美aaa级| 亚洲欧美日韩国产一区| 亚洲精品一区二区在线观看| 激情欧美日韩| 国产一区999| 国产婷婷精品| 国产欧美另类| 国产精品你懂得| 国产精品扒开腿做爽爽爽视频 | 欧美精品色综合| 久久精品日韩| 久久精品国产亚洲精品| 亚洲在线中文字幕| 久久青草久久|