概要:如果将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  node10-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的,所以能够自动打包。假设文件中有以下代码:

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 developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;

4. pkg打包后的路径和node有些区别,详情对应如下

比如:__dirname 对应 proccess.cwd()

exe文件路径:process.execPath

build失败异常解决

1. pkg需要特殊的node环境,默认去cache目录找,没有从github下载(比较慢,可能会造成打包失败)

解决办法:直接下对应的文件放在pkg的cache目录下面

1. 对应的fetch下载地方: https://github.com/vercel/pkg-fetch/releases

2. 一般全局安装后pkg后,pkg的缓存目录是在 C:\Users\用户名\.pkg-cache\

3. 将下载好的文件放在目录下重新打包就不会下载,打包成功率会高很多!

官方文档地址:https://www.npmjs.com/package/pkg

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

  1. 用freeze.py打包python程序成可执行程序(linux)

    用freeze.py打包python程序成可执行程序(linux) 2009-12-16 19:55:13 分类: 用freeze.py打包python程序成可执行程序(linux)    为了将一批 ...

  2. windows 打包 python 然后linux执行_使用pyinstaller打包python源代码,成为linux/windows下可执行文件...

    pyinstaller,打包python源代码,成为linux/windows下可执行文件,多平台 下载:http://www.pyinstaller.org/static/ http://www.p ...

  3. 一款支持Linux/Windows/Mac的百度网盘客户端:BaiduPCS-Web

    ​说明:之前介绍过一个仿Linux shell文件处理命令的百度网盘命令行客户端BaiduPCS-Go→点击查看,该工具很大程度上解决了我们在VPS上下载百度云文件速度过慢的问题,不过是用纯命令的形式 ...

  4. mac 搭建php wamp,Linux,Windows,Mac平台php环境配置

    wamp安装 下载wamp,进行安装,由于最新版需要VS2015的支持,博主这里安装了旧版wamp,下面是安装过程: 一路点击next>(协议需要同意,这个都懂),安装过程中注意一下2个界面: ...

  5. linux刷新本地dns命令_在Linux/Windows/Mac上刷新DNS缓存的方法

    刷新dns缓存让你可以得到新的域名解析.当你无法正确访问一个新注册的域名时就可以刷新dns缓存试试.刷新dns缓存非常简单,任何时候都以进行.但是不同的系统,Windows.Mac OS和Linux上 ...

  6. linux,windows,mac最强Android模拟器

    最强模拟器Genymotion 中文官网:http://www.genymotion.net/,这个网站实在没看懂,里面没什么东西,一点注册就跳到英文网了 https://www.genymotion ...

  7. unix linux windows mac,從 Mac (Unix) 移至 Windows | Microsoft Docs

    將開發環境從 Mac 變更為 Windows 的指南Guide for changing your dev environment from Mac to Windows 09/19/2019 本文內 ...

  8. html如何打包压缩,所有css打包压缩到一个js里面

    所有css打包压缩到一个js里面 打包css文件的意义:最终把css文件压缩到最终生成的js文件里,页面不需要再加载css文件,并且是压缩过的 打包css文件,安装style-loader css-l ...

  9. iOS 15 只是一个更好看的 Linux 吗?

    尽管 iOS 已经来到第15个版本,但iOS明显要更年轻,从按辈分讲,Linux可能要管 iOS 叫大爷. 乔布斯与NeXT 在2007年iPhone发布会上,那时候iOS还叫iPhone OS,乔布 ...

最新文章

  1. Spark集群的启动日志
  2. java虚拟机栈基本内容
  3. MyEclipse for Mac快捷键
  4. HOWTO:InstallShield的Basic MSI工程中如何增加序列号输入选项
  5. html5——3D转换
  6. 2021-06-13并发线程控制方法3种
  7. 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】
  8. 远程桌面管理工具RDCMan
  9. 整站下载工具 webzip
  10. 计算机辅助设计职业标准,计算机辅助设计绘图员国家职业标准.doc
  11. scrapy 爬取酷狗热门歌手音乐
  12. vite:vue中引入图片报错require is not defined
  13. JavaScript:自动生成博文目录导航
  14. 自定义封包协议c语言,Socket分包,封包,粘包
  15. NAND FLASH -WARMUP CYCLE
  16. js中有哪几种数据类型
  17. mysqldump命令备份数据 mysql备份数据
  18. 024-一次心惊肉跳的服务器误删文件的恢复过程
  19. android课程助手,小鹅通课堂助手APP
  20. 【蓝桥杯单片机(12)】PCF8591AD转换模块

热门文章

  1. [ssh]permissions are too open密钥权限过大错误
  2. 使用Crowd集成Confluence与JIRA
  3. AH00526: Syntax error on line 534 of D:/Apache/Apache24/conf/httpd.conf: PHP
  4. android模拟门禁,IT之家学院:利用tasker实现门禁卡模拟
  5. 关于[[NSBundle mainBundle] infoDictionary]里面的那些东西
  6. 使用 MySQL Workbench为现有 MySQL 或 MariaDB 数据库创建ER图
  7. 2021年云南省职工职业技能大赛CTF流量分析题(wireshark)WriteUp
  8. 登山赛车破解无线金币实现原理分析
  9. 真牛皮!手把手教你写Android项目文档,内含福利
  10. 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP