nodejs egg+pkg打包部署文档
egg框架配置pkg打包成可执行文件,网上找了好多资料都打包不成功,这里记录一下需要配置的地方
- 安装pkg
npm install pkg -g
- 在egg框架项目下的
config/config.default.js
里添加配置:
// pkg打包配置 begin
const process = require('process')
// 通过process.cwd()获取当前执行文件执行的路径
config.rundir = process.cwd() + '/run';// 配置执行时临时文件的路径
config.logger = {
dir: path.join(process.cwd(), 'logs'),//配置普通日志文件地址
};
config.static = {
dir: process.cwd() + '/public',
};
config.customLogger = {
scheduleLogger: {
file: path.join(process.cwd(), 'logs', 'egg-schedule.log'),//配置定时任务日志的地址
},
};
// pkg打包配置 end
package.json
里添加pkg
打包支持
- pkg里的scripts 里配置需要打入的脚本文件,比如你写了个
dateUtil.js
放在了utils/
文件下,那么scripts就需要加入配置./utils/dateUtil.js
,或者./utils/*.js
- pkg里的assets 就是一些存放静态文件的路径
"bin": "pkg-build.js",
"pkg": {
"scripts": [
"build/**/*.js",
"./app/**/*.js", //必须
"./config/**/*.js", //必须
"./config/*", //可选,建议填写,与下面第3条对应
"./app.js",
"./agent.js",
"./node_modules/nanoid/**/*.js" //必须
],
"assets": [
"./app/view/**/*", //如果使用了模板文件这个必须有,比如使用了html等(我这里所有的html就在view文件下,你放在哪这里就写哪个文件)
"./public/**/*", //必须
"./node_modules/egg-mysql/**/*", //如果使用了mysql,那么这个也必须有
"./node_modules/egg-view-nunjucks/**/*" //我这里使用的模板文件是html,所以需要配置这个。具体配什么根据实际情况来
]
},
//在scripts加入如下代码(打包使用,不加也行,如果不加就用pkg来打包,具体参数可参考pkg文档)
"scripts": {
"pkg:win": "pkg . -t win --out-path ./dist --debug",
"pkg:linux": "pkg . -t linux --out-path /usr/dist --debug",
},
- 在
config
下添加env
文件,里面内容填prod
。(这个文件主要是解决打包完成后运行会一直显示XXX文件不存在的问题。问题就是:本地开发运行环境下 watcher 插件功能异常,实时上我们打包生成可执行文件的时候应该默认是应用于生产环境的,所以这个时候我们需要在 config 目录下新增 env 文件来指定当前环境为生产环境) - 在与
package.json
同级的目录下新建pkg-build.js
,内容如下
- 写法1(固定端口):
const egg = require('egg');
const workers = Number(process.argv[2] || require('os').cpus().length);
egg.startCluster({
workers,
baseDir: __dirname,
});
- 写法2(在启动时指定端口,启动示例:
myApp.exe start --port=7002
):
const egg = require('egg');
const workers = Number(process.argv[2] || require('os').cpus().length);
let port=7001 // 默认端口
// 获取指定的参数,我这里就是截取了一个参数 虽能使用但并不严谨,可自行修改,
process.argv.forEach((val, index) => {
console.log(`${index}:${val}`)
if (val.indexOf('--port=')>-1){
port = val.replace('--port=','')
}
});
egg.startCluster({
workers,
port:port,
baseDir: __dirname,
});
- 打包(如果package.json里没配置,那就使用pkg命令来打包)
npm run pkg:win
npm run pkg:linux
- 打包成功后就能运行了,(
linux
下启动要先赋予启动权限chmod +xr 程序名称
)
windows下运行: 程序名称.exe start
linux下运行: ./程序名称 start
- 最后配上我的项目目录,具体pkg打包的配置内容可参考你自己的格式修改