目標
打包 egg 項目為單一的可執行文件,支持跨平台,擺脫環境依賴。
准備
npm install -g pkg
初始化項目
1.0.0-使用腳手架初始化 eggjs 項目
npm init egg --type=ts
1.0.1-安裝依賴
npm i
1.0.2-測試運行
npm run dev
1.0.3 創建測試用靜態文件並配置 egg-etag
npm install egg-etag
在plugin.ts中增加配置啟用egg-etag
etag: {
package: 'egg-etag',
},
增加 pkg 相關配置 1.0.4
在項目根目錄創建pkg-entry.js
"use strict";
const fs = require("fs");
// 如果是egg的ts項目,由於egg-script會給ts項目通過-r引入sourcemap的注入文件,但是pkg的spawn不支持,所以把項目標識為飛ts
// 如果不是ts項目忽略一下兩行
const pkgInfo = require("./package");
pkgInfo.egg.typescript = false; // 防止egg-script識別為 typescript 自動添加soucemap支持(--require 在pkg的spawn中不支持)
// 由於egg-script是默認以當前執行proccess.cwd() 路徑為默認項目的,打包后需要每次輸入 /snapshot/${項目文件夾名} 作為指定目錄
// 所以,以下為修改參數,自動嵌入“/snapshot/${項目文件夾名}”
const baseDir = "/snapshot/" + fs.readdirSync("/snapshot")[0];
// 當 start 的時候,自動嵌入bashDir為 /snapshot/${項目文件夾名}
// 如果要傳入自定義啟動參數也可以在這里處理,如指定是否后台運行,指定端口號等
const startIndex = process.argv.indexOf("start");
if (startIndex > -1) {
process.argv = [].concat(
process.argv.slice(0, startIndex + 1),
baseDir,
process.argv.slice(startIndex + 1)
);
}
// 然后直接調起egg-scripts執行
require("./node_modules/egg-scripts/bin/egg-scripts.js");
在.eslintignore中增加忽略pkg-entry.js
在package.json中增加以下內容
"bin": "pkg-entry.js",
"pkg": {
"scripts": [
"./app/**/*.js",
"./config/**/*.js"
],
"assets": [
"./app/public/**/*",
"./node_modules/nanoid/**/*.js"
]
},
在項目根目錄創建編譯腳本build.sh
set -e # 編譯ts為js npm run tsc # 編譯生成二進制文件 pkg . --out-path ./dist # 清理臨時js文件 npm run clean
將dist/目錄加入.gitgnore
config.prod.ts中的可選配置
// 配置運行時相關文件存儲路徑
config.rundir = process.cwd() + "/run";
// 配置日志目錄
config.logger = {
dir: process.cwd() + "/logs",
};
// 配置靜態資源路徑
config.static = {
prefix: "/public",
dir: process.cwd() + "/public",
};
填坑
.gitignore中增加 !pkg-entry.js
重點
轉自:http://lidong.xin/egg/eggts-pkg.html#%E7%9B%AE%E6%A0%87
