如今公司有以私有部署增加營(yíng)收的打算,于是便著手開始對(duì)所負(fù)責(zé)項(xiàng)目進(jìn)行一鍵打包醇锚。
pkg簡(jiǎn)述
既然是私有部署,自然需要做到易于部署,保護(hù)代碼焊唬,易于維護(hù)恋昼。
https://github.com/zeit/pkg
pkg便能滿足這些需求
This command line interface enables you to package your Node.js project into an executable that can be run even on devices without Node.js installed
首先看一下官方的簡(jiǎn)介,pkg能將node.js項(xiàng)目打包成一個(gè)不需要node環(huán)境就可以運(yùn)行的可執(zhí)行文件
pkg使用
這里直接使用package.json 進(jìn)行打包(當(dāng)然也可以針對(duì)js文件直接進(jìn)行打包赶促,此處不做贅述)液肌,
"bin": "index.js",//項(xiàng)目啟動(dòng)文件
"pkg": {"scripts": "build/**/*.js","assets": "views/**/*" } //需要額外打包進(jìn)去的目錄
在package.json中增加這段,scripts鸥滨,assets配置未打包進(jìn)可執(zhí)行文件的js/json 文件及其他資源文件嗦哆,文件路徑可以使用glob通配符
這是由于pkg只會(huì)自動(dòng)打包require或__dirname的文件(如下),其余文件需手動(dòng)配置
require('./build/'+cmd+'.js')
path.join(__dirname,'views/'+viewName)
之后使用以下命令即可打包婿滓,
pkg .? --target node8-linux --out-path package
(使用node8版本打包一個(gè)linux可運(yùn)行文件老速,放入package文件夾中,詳細(xì)參數(shù)參見https://github.com/zeit/pkg/blob/master/README.md)
同時(shí)需要的是凸主,打包進(jìn)可執(zhí)行文件中的文件橘券,以下的系統(tǒng)文件路徑發(fā)生了變化。因此如有必要卿吐,需要對(duì)文件地址進(jìn)行調(diào)整旁舰。
注意事項(xiàng)
以下是實(shí)際打包中遇到的一些問題及解決方法,
1.pkg無(wú)法識(shí)別引用的變量地址
如
require('./test/'+ test +'.js')
由于路徑不是常量嗡官,pkg無(wú)法識(shí)別要打包的文件是什么鬓梅,因此盡量將引用地址寫為常量地址
如果node_modules里的文件引用存在該現(xiàn)象怎么辦呢?
筆者這次便遇到了這個(gè)問題谨湘,于是采用改寫node_modules相關(guān)類庫(kù)相關(guān)文件,通過patch-package進(jìn)行補(bǔ)丁打包芥丧,請(qǐng)參考 https://github.com/ds300/patch-package#readme
2.pkg無(wú)法打包Native addons (.node?files)?
Native addons (.node?files) use is supported, but packaging?.node?files inside the executable is not resolved yet. You have to deploy native addons used by your project to the same directory as the executable.
看一下官方的處理方法紧阔,把這類文件拿出來(lái)放在可執(zhí)行文件相同的目錄里。
3.配置文件外部掛載续担,方便運(yùn)維維護(hù)
對(duì)config的引用進(jìn)行處理
var fs =require('fs');
try {
var configJson =JSON.parse(fs.readFileSync(
process.cwd() +'/config.json',
? 'utf-8'));
}catch (e) {
? configJson =null;
}
var config =configJson ?configJson :require('./config.json');
exports.config =config;
優(yōu)先讀取掛載在外部的配置文件擅耽,如果不存在再讀取pkg內(nèi)部的快照文件,如此便實(shí)現(xiàn)了外部掛載物遇,
方便運(yùn)維對(duì)配置文件進(jìn)行修改乖仇。