方便客戶對安裝包制作過程中的配置進行更好地理解與應用,我們對nsNiuniuSkin的配置進行如下整理,從手工配置,到全自動集成,做全覆蓋的說明與解釋!
我們以leeqia_mountain模板為例,介紹一下如何配置與打包:
在正式開始配置之前,有幾個點需要先給大家說明一下:
. 7z壓縮工具以及python、bat打包腳本
├── FilesToInstall 待打包文件列表放置的目錄
├── Helper 打包輔助工具
├── NiuNiuCaptureElectronDemo Electron項目示例(用于演示如何打包Electron程序)
├── NSIS NSIS打包工具相關文件
├── Output 打包完成的文件存放目錄
├── SetupScripts 打包核心nsis腳本
│ └── leeqia_mountain nsi文件以及安裝卸載圖標存放位置
│ ├── LanguageFiles 語言翻譯文件
│ └── skin 安裝界面配置文件
│ └── images 安裝界面需要的圖片
└── Sign 簽名腳本
不管采用哪種方式打包,必要的UI修改都是要做的,比如圖標以及個別界面上的提示信息;我們的UI模板已經盡可能做到簡潔與美觀,相信您只需要替換部分圖標后,完全可以直接作為您產品的安裝包界面。
如果對duilib的界面配置不熟悉的話,我們不建議您修改界面的布局,盡量只是按照原尺寸的圖片進行替換即可;在SetupScripts\leeqia_mountain\skin目錄下,用于存儲UI相關的文件:
文件名 | 說明 |
install.xml | 這是一個總領腳本,包含標題欄,陰影以及語言選擇框 |
configpage.xml | 配置打開安裝包后顯示的第一個界面,也是用于選擇安裝路徑等的界面 |
licensepage.xml | 配置許可協議顯示界面 |
installingpage.xml | 安裝過程中的界面 |
finishpage.xml | 安裝完成的界面 |
uninstallpage.xml | 卸載入口界面 |
uninstallingpage.xml | 安裝過程中的界面 |
uninstallfinishpage.xml | 卸載完成的界面 |
msgBox.xml | 二級彈窗 |
以上xml在文本工具中即可編輯,屬性的修改參考duilib_ultimate的屬性列表;同時我們提供一個在線預覽與調試工具,可以在不重新打包的情況下,預覽所有界面效果,將會使您的界面修改效率提升數倍,見如下鏈接:
http://leeqia.com/articles/nsniuniuskin_designer.html
注:
手工配置打包比較適合于那些產品信息及版本信息不怎么變動的項目打包,比如您有一個產品,安裝包上的信息(主要指版本信息)平時并不變更,那么用這種方式配置與打包,是最省時間的。
在soft_setup.nsi文件中,根據您的項目修改如下宏定義:
#======================自定義宏 產品信息==============================!define /ifndef PRODUCT_NAME "利洽科技截圖控件" #產品名稱
!define /ifndef PRODUCT_NAME_EN "Leeqia ScreenCapture" #英文產品名稱
!define /ifndef PRODUCT_PATHNAME "Leeqia_Capture" #安裝與卸載項用到的KEY,與Electron中的guid相同
!define /ifndef INSTALL_APPEND_PATH "Leeqia_Capture" #安裝路徑追加的名稱
!define /ifndef INSTALL_DEFALT_SETUPPATH "$PROGRAMFILES32\${INSTALL_APPEND_PATH}" #默認生成的安裝路徑
!define /ifndef EXE_NAME "牛牛截圖.exe" #主程序EXE文件名
!define /ifndef PRODUCT_VERSION "2.5.0.0" #版本號
!define /ifndef PRODUCT_PUBLISHER "Leeqia" #發布者
!define /ifndef PRODUCT_LEGAL "Leeqia Copyright(c)2020" #版權信息
!define /ifndef INSTALL_MODE_ALL_USERS "all" # all current,是否安裝到所有用戶,默認為是,會影響注冊表、快捷方式、開始菜單等
!define /ifndef INSTALL_EXECUTION_LEVEL "admin" # 如果INSTALL_MODE_ALL_USERS使用current,則此處請同步改成user (RequestExecutionLevel none|user|highest|admin)
!define /ifndef INSTALL_OUTPUT_NAME "Test_PC_Setup_v2.5.0.exe" #默認的安裝包名稱,在bat中控制傳入
!define /ifndef INSTALL_LOCATION_KEY "InstPath" #默認的注冊表中安裝位置的key值
#======================以下宏用于控制特定的行為==============================!define /ifndef INSTALL_DEFAULT_AUTORUN 0 #默認是否自動開機啟動
!define /ifndef INSTALL_DEFAULT_SHOTCUT 0 #默認是否添加快捷方式
!define /ifndef TEST_SLEEP 1 #測試安裝過程中的延時開關,方便查看進度變化和輪播圖,實際使用,請改成0
!define /ifndef INSTALL_DOWNLOAD_BASEURL "http://www.ggniu.cn/test_online_install/"
#======================上述具體的宏定義均可以在pre_define.nsh文件中預先定義,可任意指定為其他的值==============================
在leeqia_mountain目錄下,有根據語言ID命令的rtf文檔,您相應的修改其內容即可,如果有新的語言的許可協議文件,也請進行新增。
將要安裝的文件復制到FilsToInstall目錄下;打包腳本將會對這個目錄下(包含多級子目錄)進行壓縮打包。 這個步驟一般是在測試階段使用,實際打包過程中一般是通過腳本自動化復制。
雙擊指定的bat,即可完成打包:
文件名 | 說明 |
build-leeqia_mountain.bat | 會先將文件壓縮成7z.app,再進行打包 |
build-leeqia_mountain-nozip.bat | 直接打包文件 |
build-leeqia_mountain-online.bat | 打包在線安裝包,同時生成在線數據包文件和配置 |
看了上述的過程,有沒有覺得打包真的很簡單呢,僅僅需要五步,就能實現一個屬于您的安裝啦!
為了能夠更加方便地集成進既有的打包流程中,我們專門用python開發了一套命令行的接口,您不再需要去修改soft_setup.nsi文件中的宏定義,而只需要通過我們package.py的命令行參數來進行控制即可。
之所以能夠如此設置,在于NSIS的宏定義支持 /ifndef屬性,表示如果在此之前未定義才定義,而我們在soft_setup.nsi文件的頂部,優先引入一個叫pre_define.nsh文件,如果在pre_define.nsh中已經定義的宏,那么他將優先使用。
事實上NSIS自身也支持命令行來傳入宏定義,在這個情況下,一個宏有效的優先級為:
NSIS命令行 > pre_define.nsh > soft_setup.nsi
有了這個前提,我們在package.py中,將接受到的命令行參數,轉換成NSIS的宏定義,寫入到pre_define.nsh文件中,以此方式來實現打包時配置信息的參數化。
package.py具體參數較多,如下:
optional arguments:
-h, --help show this help message and exit
--log_dir LOG_DIR if None, log will be written to console
--project_name PROJECT_NAME the project name, eg: leeqia_moutain
--package_mode PACKAGE_MODE the package mode, 0:7z, 1:nozip, 2: online
--need_sign NEED_SIGN check if sign uninstall and setup file
--build_for_electron BUILD_FOR_ELECTRON check if build for electron, if True, we will call npm build in scripts
--electron_build_path ELECTRON_BUILD_PATH electron build path, the dir path of package.json
--generate_latest_file GENERATE_LATEST_FILE check if generate latest.xml for electron-updater
--files_toinstall_name FILES_TOINSTALL_NAME local directory name for nsNiuniuSkin, FilesToInstall default
--auto_write_uninst AUTO_WRITE_UNINST check if generate uninstall automatically, default False
--uninst_file_name UNINST_FILE_NAME the uninstall file name
--src_files_dir SRC_FILES_DIR the unpacked file path, if specified, we will copy the files to [files_toinstall_name] and package them
--PRODUCT_NAME PRODUCT_NAME setup file name, if None, we will use the definition in soft_setup.nsi
--PRODUCT_NAME_EN PRODUCT_NAME_EN setup file name, if None, we will use the definition in soft_setup.nsi
--INSTALL_OUTPUT_NAME INSTALL_OUTPUT_NAME setup file name, if None, we will use the definition in soft_setup.nsi
--PRODUCT_VERSION PRODUCT_VERSION the package version, if None, we will use the definition in soft_setup.nsi
--EXE_NAME EXE_NAME the main exe name, if None, we will use the definition in soft_setup.nsi
--INSTALL_LOCATION_KEY INSTALL_LOCATION_KEY the install localtion key, if None, we will use the definition in soft_setup.nsi
--INSTALL_APPEND_PATH INSTALL_APPEND_PATH the append path when install, if None, we will use the definition in soft_setup.nsi
--PRODUCT_PATHNAME PRODUCT_PATHNAME the identity in reg, if None, we will use the definition in soft_setup.nsi
--INSTALL_DEFALT_SETUPPATH INSTALL_DEFALT_SETUPPATH the default setup path, if None, we will use the definition in soft_setup.nsi
--TEST_SLEEP TEST_SLEEP if True, it will sleep when extract the files, if None, we will use the definition in soft_setup.nsi
--INSTALL_DEFAULT_SHOTCUT INSTALL_DEFAULT_SHOTCUT check if add shortcut for default, if None, we will use the definition in soft_setup.nsi
--INSTALL_DEFAULT_AUTORUN INSTALL_DEFAULT_AUTORUN check if add auto run for default, if None, we will use the definition in soft_setup.nsi
--INSTALL_EXECUTION_LEVEL INSTALL_EXECUTION_LEVEL execution level(admin/user), if None, we will use the definition in soft_setup.nsi
--INSTALL_MODE_ALL_USERS INSTALL_MODE_ALL_USERS install mode(all/current), if None, we will use the definition in soft_setup.nsi
--INSTALL_DOWNLOAD_BASEURL INSTALL_DOWNLOAD_BASEURL download base url for online install, if None, we will use the definition in soft_setup.nsi
--PRODUCT_LEGAL PRODUCT_LEGAL product legal, if None, we will use the definition in soft_setup.nsi
--PRODUCT_PUBLISHER PRODUCT_PUBLISHER publisher info, if None, we will use the definition in soft_setup.nsi
具體每個參數解釋如下:
參數名稱 | 參數類型 | 參數用途 | 備注 |
--log_dir | str | 指定日志寫入路徑 | 如果不指定,則打印到控制臺 |
--project_name | str | 打包的項目名稱 | 對應于您使用的模板名稱,比如高山版本為:leeqia_moutian |
--package_mode | int | 打包模式 | 用于指定使用哪種方式打包:1: 采用7z解壓模式2: 采用非7z模式3: 打在線安裝包 |
--need_sign | bool | 是否要對卸載程序和安裝程序進行簽名 | 默認為False,如果指定為True,還需要配置代碼簽名 |
--build_for_electron | bool | 是否是打包electron程序 | 默認為False |
--electron_build_path | str | electron程序打包的目錄 | 如果build_for_electron為True,則此值必需指定 |
--generate_latest_file | bool | 是否生成匹配給electron-updater使用的latest.xml | 默認為False |
--files_toinstall_name | str | nsNiuniuSkin本地打包目錄名稱 | 默認為FilesToInstall,可不指定 |
--auto_write_uninst | bool | 是否在安裝時自動生成卸載程序 | 默認為False,這種方式生成的卸載程序無法簽名,建議不指定 |
--uninst_file_name | str | 卸載程序的文件名 | 默認為uninst.exe |
--src_files_dir | str | 要打包的源目錄 | 如果指定,則在打包時我們會將此目錄下的文件復制到我們的本地打包目錄下, |
--PRODUCT_NAME | str | 打包的產品名稱 | 中文模式下的快捷方式,開始菜單,安裝界面呈現等均使用此值 |
--PRODUCT_NAME_EN | str | 打包的英文產品名稱 | 英文模式下的快捷方式,開始菜單,安裝界面呈現等均使用此值注意, |
--INSTALL_OUTPUT_NAME | str | 打出來的安裝包名稱 | 當build_fore_electron為False時,此參數必需指定,簽名時也會用到 |
--PRODUCT_VERSION | str | 產品版本號 | 版本號 |
--EXE_NAME | str | 待安裝的主程序名稱 | 快捷方式,開始菜單等地方用到 |
--INSTALL_LOCATION_KEY | str | 安裝路徑的注冊表保存key | 用于找到軟件之前的安裝目錄,默認為InstPath,Electron程序請指定為InstallLocation |
--PRODUCT_PATHNAME | str | 軟件安裝標識在注冊表中的保存key | 用于軟件與卸載信息的保存 |
--INSTALL_APPEND_PATH | str | 安裝時追加的目錄名 | |
--INSTALL_DEFALT_SETUPPATH | str | 軟件默認安裝路徑 | |
--TEST_SLEEP | int | 是否在解壓過程中增加延遲 | 默認為0,表示不增加延遲,1表示增加 |
--INSTALL_DEFAULT_SHOTCUT | int | 默認是否開啟添加快捷方式 | 默認為0,表示不開啟 |
--INSTALL_DEFAULT_AUTORUN | int | 默認是否啟用開機啟動 | 默認為0,表示不開啟 |
--INSTALL_EXECUTION_LEVEL | str | 安裝包權限 | none/user/highest/admin 默認為admin |
--INSTALL_MODE_ALL_USERS | str | 安裝包所有用戶還是當前用 | all/current,此參數與上一個參數應用有關聯性,請關注 |
--INSTALL_DOWNLOAD_BASEURL | str | 在線安裝包的數據包下載基地址 | 如果打在線安裝包,此值必需指定 |
--PRODUCT_LEGAL | str | 版本信息 | 例如:Leeqia Copyright(c)2020 |
--PRODUCT_PUBLISHER | str | 發布者信息 | 例如:公司名 |
比如,想打包一個程序,想指定的信息如下:
那么打包的命令行參數為:
python package.py --package_mode=1 --project_name=leeqia_mountain --PRODUCT_NAME=測試軟件 --PRODUCT_VERSION=0.5.0 --EXE_NAME=Test.exe --INSTALL_OUTPUT_NAME=Test_Setup.exe --src_files_dir=C:\unpacked_files
如果還有更多的參數要指定,則追加即可。
看完這一節,相信您也一定發現了,第一節中的手工配置的soft_setup.nsi文件的步驟完全可以舍棄,可以直接采用這種命令行的方式來打包。 哪怕信息是相對固定的,也可以將這個命令行參數用bat文件保存起來。
注:
利用python.py的命令行腳本,需要在打包的環境中安裝了python3
對于Electron程序的打包,我們支持打包的同時生成與electron-updater兼容的latest.xml,以支持Electron程序的自動升級。
在對Electron程序打包前,我們需要考慮如下幾個問題,并根據結論形成正確的配置:
還需要考慮要如何配置如下參數:
功能項 | 配置參數名 | 建議(盡可能與原安裝包配置一致) |
是否安裝到所有用戶 | --INSTALL_MODE_ALL_USERS | 建議安裝到所有用戶,傳all,同時也要考慮舊的electron程序的權限 |
是否以管理員權限啟動 | --INSTALL_EXECUTION_LEVEL | 建議以管理員權限啟動,傳admin,同時也要考慮舊的electron程序的權限 |
軟件安裝標識 | --PRODUCT_PATHNAME | 根據electron-builder中配置的guid來傳 |
安裝路徑在注冊表中的key | --INSTALL_LOCATION_KEY | 傳InstallLocaltion |
是否生成latest.xml | --generate_latest_file | 傳True |
根據以往客戶用于打包Electron程序時遇到過的問題,容易出錯的地方如下,希望對您有幫助:
問題 | 原因 | 解決辦法 |
在package.json中沒有guid,導致讀取不到 | 這個guid是安裝包在注冊表中的軟件標識,每一個安裝包都需要有一個獨特的值 | 在這種情況下,一般按如下方式解決: |
打包出來的安裝包比electron-builder打出來的安裝包要大 | 這種一般是指定的package_mode未正確指定的問題 | 將package_mode指定為1即可 |
打出來的安裝包不能識別electron-builder打出來安裝包安裝過的路徑 | a) 當前用戶與所有用戶的配置不一致 | 配置正確的值即可 |
打包完成后,發現生成的latest.xml中的大小與sha512值與實際的安裝文件不匹配 | 在打包流程生成latest.xml后,安裝包文件又被變更了 | 在我們的打包流程中,我們的最后一步是生成latest.xml,意味著在這之后對安裝包的所有變更(比如代碼簽名),都將導致latest.xml中的信息變的不再正確。 |
我們已經將完整的安裝功能均寫到了setup_control.nsh腳本中,正常來講,您不需要修改這里的腳本,setup_control.nsh文件中的一些關鍵函數如下:
函數名 | 主要功能說明 |
DUIPage | 安裝入口腳本,用于初始化一些信息 |
un.DUIPage | 卸載入口腳本 |
BindUIControls | 綁定按鈕及其他響應事件 |
ShowMsgBox | 顯示二級子窗口 |
OnBtnInstall | 安裝主流程控制 |
CustomizeInstall | 更多的自定義安裝行為 |
如果是在安裝過程中有一些額外的功能要加,可以在setup_control.nsh中的CustomizeInstall函數下進行擴展,比如安裝.netframework等;這個函數將會運行在BGWorker下,您不用擔心會導致安裝界面卡住。
代碼簽名對于軟件的分發以及防誤報來說有重要作用,我們在Sign目錄下,已經放了簽名的基礎腳本等信息,您只需要替換signfile.bat中的幾個關鍵信息,同時將證書和證書密碼等信息,然后在打包時指定need_sign為True即可。
注:
1)如果您的簽名證書默認不是按我們這種方式簽名的,那么您需要自行修改Sign.bat,保證不破壞他的參數接收的情況下,能夠最終完成簽名即可。
希望這篇配置說明能夠幫助您快速的配置好屬于您項目專屬的打包腳本,核心在于對package.py的命令行參數和NSIS對宏定義的設置順序的理解。
在安裝包安裝過程中,精美的UI往往能讓客戶對所安裝產品的印象更加深刻,更能體現出軟件服務商在用戶體驗上的專注與用心! 希望我們的努力,能夠讓安裝包制作再容易一點,再快樂一點!
愿天下沒有難做的安裝包!
擊右上方紅色按鈕關注“web秀”,讓你真正秀起來
冬至,希望大家都可以有餃子和湯圓吃,主要是能和自己家人愛人一起吃個飯。
下面進入主題,用原生JS給擼個圖片上傳,預覽的小示例,希望對大家有所幫助。
function fChange() { let file=document.getElementById('file'); // 輸出已經選擇圖片名字 console.log(file.value); // 輸出已經選擇的圖片對象 console.log(file.files[0]); } ... <input type="file" id="file" onchange="fChange()">
10行JavaScript代碼完成圖片的上傳預覽
我們怎么把圖片對象渲染到頁面了?達到可以預覽的目的?
// file 轉 blob對象 let bold=window.URL.createObjectURL(file.files[0]); console.log('bold==>'+bold); let boldImg=document.getElementById('bold'); boldImg.src=bold; // file 轉 base64 let base64Img=document.getElementById('base64'); var reader=new FileReader(); reader.readAsDataURL(file.files[0]); reader.onload=function (e) { console.log('base64==>'+this.result); base64Img.src=this.result; }
10行JavaScript代碼完成圖片的上傳預覽
10行JavaScript代碼完成圖片的上傳預覽
這樣看blob對象和base64都可以預覽圖片,但是blob對象僅僅是當次緩存,如果刷新,你重新把之前轉的字符串放到src是不可以預覽的,當時base64是可以的。所以存庫的時候不僅可以圖片路徑,還可以直接存base64(base64很占用數據庫空間,文件越大,base64字符串越大)
下面我們對上面示例做優化,可以上傳多張圖片并預覽,美化界面。
10行JavaScript代碼完成圖片的上傳預覽
10行JavaScript代碼完成圖片的上傳預覽
<div id="img-pre"> </div> <div id="add-pic"> <input type="file" id="up-file" onchange="fChange()"> </div>
css樣式
#add-pic{ width: 100px; height: 100px; background: url('./add-pic.png') } #add-pic input{ width: 100%; height: 100%; display: none; } #img-pre:after{ display: block; content: ''; clear: both; } #img-pre img{ float: left; width: 100px; height: 100px; margin-right: 10px; }
javascript
let addPic=document.getElementById('add-pic'), upFile=document.getElementById('up-file'); // 監聽圖片點擊,從而觸發input file的點擊事件 addPic.addEventListener('click', function(){ upFile.click(); }) function fChange() { let file=document.getElementById('up-file'); let imgPre=document.getElementById('img-pre'); // file 轉 blob對象 let bold=window.URL.createObjectURL(file.files[0]); // 創建img元素,并添加到img-pre元素里 var img=document.createElement("img"); img.setAttribute("src", bold); imgPre.appendChild(img); }
主要是通過css隱藏掉input file選擇文件按鈕,然后用+號圖片點擊事件來觸發input file的點擊事件,達到能選擇圖片的目的。
喜歡小編的點擊關注,了解更多知識!
源碼地址請點擊下方“了解更多”
addy 是一個支持 HTTP/2 的跨平臺 Web 服務器, 使用和配置都非常簡單。Caddy 支持 HTTP/2, IPv6, Markdown, WebSockets, FastCGI, 模板等等。
具有自動 HTTPS 的快速、多平臺 Web 服務器
https://github.com/caddyserver/caddy
中文文檔:
https://dengxiaolong.com/caddy/zh/
Caddyfile是一個配置Caddy的文本文件。它被設計成易于打字,不易出錯。
Caddyfile的第一行始終是要服務的站點的地址。
你可以定義任意多的站點;Caddy支持虛擬主機和許多其他功能!
matt.life # 你的站點地址
ext .html # 美化網址
errors error.log { # 錯誤日志
404 error-404.html # 自定義錯誤頁面
}
# PHP后端
fastcgi /blog localhost:9000 php
# API負載均衡
proxy /api localhost:5001 localhost:5002
瞧!你所要做的就是運行caddy。如果你的Caddyfile在同一個文件夾中,它會被自動加載。對于生產站點,HTTPS是默認開啟的!
$ caddy
Activating privacy features... done.
http://matt.life
https://matt.life
輸入你的站點地址,查看它的運行情況。在線站點被重定向到HTTPS。
Caddy非常適合在家里或工作時開發網站,并服務于生產環境。趕緊嘗試一下!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。