Egg.js線上部署——利用pkg打包Egg.js工程

本文由 @小劉 原創(chuàng)碗啄,轉(zhuǎn)載請(qǐng)注明出處。
? ? ? ?github示例地址:https://github.com/MrSmallLiu/pkg-egg-example
? ? ? ?打包Node.js代碼的工具有很多捡鱼,有些工具在打包時(shí)將自己寫的代碼打包為二進(jìn)制文件配合node_modules一起使用,有些工具將全部代碼打包為二進(jìn)制,個(gè)人比較偏向于全部打包,例如pkg馁龟,都可以支持express、koa等框架打包漆魔,但是對(duì)于將koa框架封裝后的Egg.js框架打包都沒有說明如何使用坷檩,我在多次嘗試后,加之閱讀一部分Egg.js源碼后終于利用pkg成功的打包有送。如下介紹如何利用pkg打包Egg.js代碼淌喻。

利用pkg打包Egg.js代碼

(上面嘟囔了一堆廢話僧家,終于步入正題雀摘。)     

pkg是將整個(gè)工程打包為一個(gè)二進(jìn)制文件,包括node運(yùn)行環(huán)境一起打包八拱,非常方便遷移阵赠,而且不需要客戶環(huán)境重新部署Node.js以及下載相關(guān)依賴涯塔,具體步驟如下:

安裝pkg(參考pkg)

   npm install pkg -g

配置Egg.js的public路徑。由于打包后為二進(jìn)制文件清蚀,對(duì)于某些用戶將前端代碼放在Egg.js工程目錄下的將不能操作匕荸,于是修改Egg.js的public路徑配置到運(yùn)行路徑下:

   // 修改config/config.default.js
   config.static = {
           prefix: '/',
           dir: process.cwd() + '/public'
       }

配置Egg.js的運(yùn)行時(shí)路徑。由于Egg.js運(yùn)行時(shí)會(huì)生成run文件夾以及相關(guān)文件枷邪,而pkg打包后為二進(jìn)制文件榛搔,不能在繼續(xù)進(jìn)行寫操作,故將rundir配置到運(yùn)行路徑下:

    //修改config/config.default.js
   config.rundir = process.cwd() + '/run'

修改package.json配置pkg相關(guān)參數(shù):

  • 將代碼以靜態(tài)文件方式添加到打包中:
    //修改package.json东揣,增加pkg節(jié)點(diǎn)
    "pkg": {
        "assets": [
          "./config/*.js",
          "./app.js",
          "./app/**/*.js",
          "./node_modules/nanoid/**/*.js"  //該行為必須添加践惑,由于Egg.js使用nanoid庫,其中用到一個(gè)文件pkg未能解析嘶卧,于是手動(dòng)添加
            ]
        }
  • 配置pkg入口:
    // 修改package.json尔觉,增加bin節(jié)點(diǎn),指定入口文件
    "bin": "build.js"
    // build.js文件內(nèi)容
    require(__dirname + '/node_modules/egg-scripts/bin/egg-scripts.js')
  • 配置build命令
    // 修改package.json,在scripts下增加build命令
    "scripts": {
        "build": "pkg . --targets node8-linux-x64 --out-path /usr/dist  --debug"
      }
    // --targets 指定node版本為8以及l(fā)inux-x64
    // --out-path 指定打包后文件輸出路徑
    // --debug 指定debug模式編譯

開始打包

    // 初次打包時(shí)間較長(zhǎng)芥吟,后續(xù)打包pkg會(huì)使用node緩存侦铜,提高打包效率
    npm run build

運(yùn)行

    ./test_pkg start /snapshot/test_pkg --port=9001 --title=test_pkg
    // ./test_pkg 打包后的二進(jìn)制文件
    // /snapshot/test_pkg 其中/snapshot為必須路徑,test_pkg為工程目錄路徑
    // --port --title等支持與平常啟動(dòng)時(shí)的任意命令參數(shù)

以上即完成了Egg.js的項(xiàng)目打包工作钟鸵,這時(shí)可能有人會(huì)想到數(shù)據(jù)庫相關(guān)配置怎么動(dòng)態(tài)來改變呢钉稍? C++編譯的模塊能否支持打包呢?棺耍,那請(qǐng)繼續(xù)閱讀嫁盲。

擴(kuò)展

如何支持動(dòng)態(tài)config

可能有人會(huì)想到利用Egg.js的啟動(dòng)周期來做呀,那么說對(duì)了烈掠,就是利用configWillLoad周期來做羞秤,在項(xiàng)目中創(chuàng)建app.js文件(如果已經(jīng)有的請(qǐng)忽略),利用周期讀取外部config.js左敌,然后替換config/config.default.js內(nèi)容瘾蛋,示例代碼如下:

// 替換sequelize的storage,替換dataPath路徑
var fs = require('fs');
class AppBootHook {
    constructor(app) {
        this.app = app;
    }
    configWillLoad() {
        let customConfig = require(process.cwd() + '/config.js');
        this.app.config.sequelize.storage = customConfig.dbPath;
        this.app.config.dataPath = customConfig.dataPath;
    }
}
 
module.exports = AppBootHook;

<font color=red>注意</font>
Node.js大部分用戶應(yīng)該都會(huì)使用sequelize矫限,而對(duì)于Egg.js使用egg-sequelize哺哼,由于egg-sequelize周期中包含agent.js,啟動(dòng)時(shí)讀取config/config.default.js叼风,會(huì)導(dǎo)致啟動(dòng)失敗取董,于是本人修改了一版egg-sequelize_pkg用于打包使用,除配置名稱差異外使用方法與egg-sequelize一致无宿,不需要修改原有代碼,如下配置更改即可

// {app_root}/config/plugin.js
exports.sequelizePkg = {
  enable: true,
  package: 'egg-sequelize_pkg',
};
// {app_root}/config/config.default.js
exports.sequelizePkg = {
};

github地址為:https://github.com/MrSmallLiu/egg-sequelize_pkg 歡迎提問題茵汰,也歡迎star

C++模塊引入

pkg介紹對(duì)于C++編譯的.node模塊,在打包時(shí)不會(huì)將其打包進(jìn)二進(jìn)制文件中孽鸡,故需要特殊處理蹂午,目前是修改源碼引用(各位有好的辦法可以推薦給我),然后將.node模塊拿到運(yùn)行目錄下:

  • 修改node_modules中對(duì)應(yīng)模塊源碼的require二進(jìn)制文件的地方栏豺,將其修改為:
// 以node-sqlite3為例
將lib/sqlite3.js中的
var binding = require(binding_path);
修改為
var binding = require(process.cwd()+'/node_sqlite3.node')
  • 將源碼中的node_sqlite3.node文件拷貝到編譯后的運(yùn)行目錄,將整個(gè)文件夾zip即可在任何地方運(yùn)行

以上介紹了如何利用pkg進(jìn)行打包Egg.js工程豆胸,如有疑問可以聯(lián)系作者或者下方評(píng)論奥洼,一起討論。
QQ: 1016817543 郵箱:1016817543@qq.com github:https://github.com/MrSmallLiu (歡迎star)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晚胡,一起剝皮案震驚了整個(gè)濱河市灵奖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌估盘,老刑警劉巖桑寨,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忿檩,居然都是意外死亡尉尾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門燥透,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沙咏,“玉大人,你說我怎么就攤上這事班套≈辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吱韭,是天一觀的道長(zhǎng)吆豹。 經(jīng)常有香客問我,道長(zhǎng)理盆,這世上最難降的妖魔是什么痘煤? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮猿规,結(jié)果婚禮上衷快,老公的妹妹穿的比我還像新娘。我一直安慰自己姨俩,他們只是感情好蘸拔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著环葵,像睡著了一般调窍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上张遭,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天邓萨,我揣著相機(jī)與錄音,去河邊找鬼。 笑死先誉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的的烁。 我是一名探鬼主播褐耳,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渴庆!你這毒婦竟也來了铃芦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤襟雷,失蹤者是張志新(化名)和其女友劉穎刃滓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸弄,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咧虎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了计呈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰诵。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捌显,靈堂內(nèi)的尸體忽然破棺而出茁彭,到底是詐尸還是另有隱情,我是刑警寧澤扶歪,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布理肺,位于F島的核電站,受9級(jí)特大地震影響善镰,放射性物質(zhì)發(fā)生泄漏妹萨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一炫欺、第九天 我趴在偏房一處隱蔽的房頂上張望眠副。 院中可真熱鬧,春花似錦竣稽、人聲如沸囱怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃弓。三九已至,卻和暖如春岛宦,著一層夾襖步出監(jiān)牢的瞬間台丛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挽霉,地道東北人防嗡。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侠坎,于是被迫代替她去往敵國(guó)和親蚁趁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容