這是歷史版本頁面 — 看 NSIS 最新版本
NSIS 是什麼?Windows 安裝程式製作工具解析
寫完一支程式,想丟給別人用,卻發現對方拿到檔案不知道怎麼裝。你試過把資料夾壓縮寄過去,但對方解壓縮後執行檔東缺西缺,根本跑不起來。你需要的是一個能讓使用者雙擊、下一步、下一步就裝好的安裝程式,而不是叫對方自己處理一堆檔案。
手動建立安裝程式不是不行,但用一般壓縮工具做出來的東西,沒有開始功能表捷徑、沒有解除安裝選項,更別提檢查系統環境或寫入登錄檔。這類工具切入點是:用一套腳本描述「安裝時要做哪些事」,然後產生一個獨立的執行檔,讓使用者照著精靈步驟走完,安裝、設定、解除安裝都幫你處理好。
01NSIS 這套軟體是做什麼用的?
它是一套用來建立 Windows 安裝程式的工具。你寫好安裝腳本,它會編譯成一個獨立的 .exe 執行檔,使用者執行後就能照著精靈步驟安裝你的軟體。官方說明指出它特別適合網路發行,因為產生的安裝檔很小,預設情況下額外負擔只有約 34 KB,對頻寬有限的使用者來說比較友善。
02它能壓縮安裝檔嗎?支援哪些壓縮格式?
可以。它內建支援 ZLib、BZip2 和 LZMA 三種壓縮方式,檔案可以個別壓縮或全部一起壓縮。LZMA 壓縮率較高,但壓縮時間也較長,你可以依安裝檔大小和使用者下載時間的需求來選擇。這部分在官方功能列表中有明確列出。
03安裝程式能讓使用者自己選要裝哪些元件嗎?
可以。它提供元件選擇樹狀介面,使用者可以勾選要安裝哪些部分。也支援多種安裝組態,常見的有 Minimal、Typical、Full 三種預設組合,開發者也可以自訂其他組態。這對功能較多、想讓使用者只裝需要的部分的軟體很有用。
04安裝程式可以顯示授權協議嗎?
可以。它支援在安裝過程中顯示授權協議,文字格式支援純文字和 RTF 兩種。你可以在腳本中指定協議檔的路徑,安裝程式就會在精靈流程中插入一個顯示協議的頁面,使用者必須同意才能繼續安裝。
05它能產生解除安裝程式嗎?
可以。安裝程式可以同時產生一個解除安裝程式,使用者之後可以透過它移除軟體。解除安裝程式會記錄安裝時寫入的檔案和登錄檔項目,移除時一併清理。這對維持使用者系統整潔很重要,也是它內建的功能之一。
06這套軟體適合什麼樣的人用?
適合需要對安裝流程有完整控制權的開發者。因為它是腳本式的,你可以寫邏輯處理複雜的安裝任務,例如偵測目的地目錄、與 Windows 或其他軟體元件溝通、安裝或更新共用元件。如果你只是要一個簡單的「下一步下一步」安裝包,它也能做到,但學習腳本語法需要一些時間。
07我不會寫程式,能用這套軟體嗎?
可以,但門檻比圖形化工具高。它本質上是腳本驅動,你需要理解安裝腳本的語法才能自訂安裝流程。官方提供了多個現成的腳本和外掛可以參考,也有超過 40 種語言的翻譯檔可以直接使用。如果你完全不想碰腳本,可以考慮其他圖形介面的安裝程式製作工具。
08它支援多國語言嗎?
支援。官方說明指出它完全多語系,一個安裝程式可以內含多種語言,包括由右至左書寫的語言。目前已有超過 40 種翻譯可用,你也可以自己建立新的語言檔。使用者在安裝時可以選擇自己慣用的語言,這對跨國發行軟體很有幫助。
09這套軟體還在持續更新嗎?
根據現有資料,它的版本紀錄最後一次更新停在 2020 年 8 月,近 24 個月內沒有新版本。如果你在意安裝程式製作工具是否持續維護,這點需要列入考量。功能上它仍然可用,但如果你需要較新的技術支援或修補,可能要評估其他更新較頻繁的替代方案。
10它和 Inno Setup 比起來,哪個比較多人用?
以現有評分人數來看,Inno Setup 和 NSIS 都是 42 人評分,數量相同。Advanced Installer 有 162 人評分,IObit Uninstaller 有 403 人評分。評分人數多寡不代表品質好壞,但可以反映社群活躍度和能找到的資源多寡。如果你重視社群支援,可以參考這些數據。
11我只需要做一個簡單的安裝包,不想學腳本,適合用這套嗎?
不適合。它的核心是腳本式設計,即使簡單的安裝任務也要寫腳本。如果你只需要把檔案打包、顯示授權協議、產生解除安裝程式,其他圖形化工具可能更直覺。它的優勢在於複雜安裝邏輯的彈性,但這也意味著學習曲線較陡。
12我的軟體需要支援 Windows 11,這套可以嗎?
官方支援系統列表只列到 Windows 10,沒有提到 Windows 11。如果你需要安裝程式在 Windows 11 上正常運作,現有資料無法確認相容性,建議自行在 Windows 11 環境測試,或考慮其他有明確支援 Windows 11 的安裝程式製作工具。
下載與官方連結
nsis-2.15-setup.exe · 1.36 MB
版本紀錄
- 2020-08-01 NSIS 3.06 1.47 MB
- 2020-08-01 NSIS 3.06.1 1.47 MB
- 2019-12-16 NSIS 3.05 1.46 MB
再看 5 筆
- 2018-12-16 NSIS 3.04 1.45 MB
- 2018-01-31 NSIS 3.03 1.64 MB
- 2017-08-01 NSIS 3.02.1
- 2017-07-24 NSIS 3.02 1.63 MB
- 2016-12-12 NSIS 3.01 1.62 MB
這一版改了什麼
What's new in this version:
New/Changed Commands
- Added !if for more complex compile-time flow control (patch #1412982)
- Added /math switch to !define for simple compile-time mathematical operations (patch #1372561)
Minor Changes
- Added more replacement options to WordReplace
- Added NSIS_CONFIG_LOG_STDOUT configuration option for logging to stdout
- Added path translation for !addincludedir (bug #1431958)
- ConfigRead now sets the error flag, if the entry wasn't found
- Documented Nop
- Edit box in the installation directory selection page is now always LTR, even for RTL languages
- Fixed improper iterator usage in dir_reader (bug #1431593)
- Fixed MessageBox MB_TOPMOST not showing up, if used as the first sections' instruction (bug #1400995)
- Fixed RMDir skipping files with names starting with two dots (bug #1420657)
- GetOptions now sets the error flag, if the option wasn't found
- Made !include stop searching the include directories after a match is found (bug #1441877)
- Made header functions use /NOUNLOAD for faster plug-in calls
- Minor documentation improvements and fixes (including bug #1420352, bug #1432423)
- More informative Icon error messages (bug #1174742)
- New Case sesnsitive functions in headers: WordFindS, WordFind2XS, WordFind3XS, WordReplaceS, WordAddS, WordInsertS, StrFilterS, TextCompareS, ConfigReadS, ConfigWriteS, GetOptionsS
Translations
- Added proper language identifier for Breton
- Breton translation improvements
- Bulgarian translation improvements
- Fixed Czech grammer mistakes (patch #1427189)
- Fixed Italian typo (patch #1416988)
- Updated Mongolian
Build System
- Fixed __BIG_ENDIAN__ definition
- Fixed improper handling of paths passed to the compiler (bug #1434215)
- Improved GCC 4.2 compatibility (patch #1434174)
- Moved NSIS_VARS_SECTION from config.h to scons
- Write all configuration to sconf.h instead of passing it on the command line