node pkg 打包一个为一个可执行程序(linux、windows、mac)

概要:如果将node项目打包为一个可执行的文件,那么对于部署、安装来说,以及源码的保护性都有很多的好处

1.全局安装pkg库,也可以不局部安装,全局安装为了方便(npm install pkg -g)

    以下为了演示,用express搭建一个默认的web项目,如下,结构如下:

     

2. 编辑package.json文件,如下:

{
  "name": "test",
  "version": "0.0.0",
  "private": true,
  "bin":"./bin/www",
  "scripts": {
    "start": "node ./bin/www",
    "pkg": "pkg . -t  node6-win-x64 -o app"
  },
  "pkg":{
    "assets":["public/**/*","views/*"]
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0"
  },
  "bundledDependencies": ["express"]
}

   解释:1)指定bin,为项目启动文件

               2) pkg .,会寻找指定目录下的package.json文件,然后在找bin字段作为入口文件。

               3)-t指定打包的目标平台和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64可以同时打包3个平台的可执行程序

               4) -o指定输出可执行文件的名称,但如果用-t指定了多个目标,那么就要用--out-path指定输出的目录

               5)scriptsassets用来配置未打包进可执行文件的脚本和资源文件,文件路径可以使用glob通配符。这里就浮现出一个问题:为什么有的脚本和资源文件打包不进去呢?

要回答这个问题,就涉及到pkg打包文件的机制。按照pkg文档的说法,pkg只会自动地打包相对于__dirname__filename的文件,例如path.join(__dirname, '../path/to/asset')。至于require(),因为require本身就是相对于__dirname的,所以能够自动打包。假设文件中有以下代码:

扫描二维码关注公众号,回复: 9210175 查看本文章
require('./build/' + cmd + '.js')
  path.join(__dirname, 'views/' + viewName)

cmd和viewname这些路径都不是常量,pkg没办法帮你自动识别要打包哪个文件,所以文件就丢失了,所以这时候就使用scriptsassets来告诉pkg,这些文件要打包进去

3. 运行npm run pkg打包 出来你想要的可执行文件

附:我配置pkg中的assets和我app.js对应代码

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
发布了55 篇原创文章 · 获赞 17 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/XuHang666/article/details/83587953