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 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)scripts
和assets
用来配置未打包进可执行文件的脚本和资源文件,文件路径可以使用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没办法帮你自动识别要打包哪个文件,所以文件就丢失了,所以这时候就使用scripts
和assets
来告诉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)相关推荐
- 用freeze.py打包python程序成可执行程序(linux)
用freeze.py打包python程序成可执行程序(linux) 2009-12-16 19:55:13 分类: 用freeze.py打包python程序成可执行程序(linux) 为了将一批 ...
- windows 打包 python 然后linux执行_使用pyinstaller打包python源代码,成为linux/windows下可执行文件...
pyinstaller,打包python源代码,成为linux/windows下可执行文件,多平台 下载:http://www.pyinstaller.org/static/ http://www.p ...
- 一款支持Linux/Windows/Mac的百度网盘客户端:BaiduPCS-Web
说明:之前介绍过一个仿Linux shell文件处理命令的百度网盘命令行客户端BaiduPCS-Go→点击查看,该工具很大程度上解决了我们在VPS上下载百度云文件速度过慢的问题,不过是用纯命令的形式 ...
- mac 搭建php wamp,Linux,Windows,Mac平台php环境配置
wamp安装 下载wamp,进行安装,由于最新版需要VS2015的支持,博主这里安装了旧版wamp,下面是安装过程: 一路点击next>(协议需要同意,这个都懂),安装过程中注意一下2个界面: ...
- linux刷新本地dns命令_在Linux/Windows/Mac上刷新DNS缓存的方法
刷新dns缓存让你可以得到新的域名解析.当你无法正确访问一个新注册的域名时就可以刷新dns缓存试试.刷新dns缓存非常简单,任何时候都以进行.但是不同的系统,Windows.Mac OS和Linux上 ...
- linux,windows,mac最强Android模拟器
最强模拟器Genymotion 中文官网:http://www.genymotion.net/,这个网站实在没看懂,里面没什么东西,一点注册就跳到英文网了 https://www.genymotion ...
- unix linux windows mac,從 Mac (Unix) 移至 Windows | Microsoft Docs
將開發環境從 Mac 變更為 Windows 的指南Guide for changing your dev environment from Mac to Windows 09/19/2019 本文內 ...
- html如何打包压缩,所有css打包压缩到一个js里面
所有css打包压缩到一个js里面 打包css文件的意义:最终把css文件压缩到最终生成的js文件里,页面不需要再加载css文件,并且是压缩过的 打包css文件,安装style-loader css-l ...
- iOS 15 只是一个更好看的 Linux 吗?
尽管 iOS 已经来到第15个版本,但iOS明显要更年轻,从按辈分讲,Linux可能要管 iOS 叫大爷. 乔布斯与NeXT 在2007年iPhone发布会上,那时候iOS还叫iPhone OS,乔布 ...
最新文章
- Spark集群的启动日志
- java虚拟机栈基本内容
- MyEclipse for Mac快捷键
- HOWTO:InstallShield的Basic MSI工程中如何增加序列号输入选项
- html5——3D转换
- 2021-06-13并发线程控制方法3种
- 诺基亚5800软件测试初学者,诺基亚5800刷机【教程详解】
- 远程桌面管理工具RDCMan
- 整站下载工具 webzip
- 计算机辅助设计职业标准,计算机辅助设计绘图员国家职业标准.doc
- scrapy 爬取酷狗热门歌手音乐
- vite:vue中引入图片报错require is not defined
- JavaScript:自动生成博文目录导航
- 自定义封包协议c语言,Socket分包,封包,粘包
- NAND FLASH -WARMUP CYCLE
- js中有哪几种数据类型
- mysqldump命令备份数据 mysql备份数据
- 024-一次心惊肉跳的服务器误删文件的恢复过程
- android课程助手,小鹅通课堂助手APP
- 【蓝桥杯单片机(12)】PCF8591AD转换模块
热门文章
- [ssh]permissions are too open密钥权限过大错误
- 使用Crowd集成Confluence与JIRA
- AH00526: Syntax error on line 534 of D:/Apache/Apache24/conf/httpd.conf: PHP
- android模拟门禁,IT之家学院:利用tasker实现门禁卡模拟
- 关于[[NSBundle mainBundle] infoDictionary]里面的那些东西
- 使用 MySQL Workbench为现有 MySQL 或 MariaDB 数据库创建ER图
- 2021年云南省职工职业技能大赛CTF流量分析题(wireshark)WriteUp
- 登山赛车破解无线金币实现原理分析
- 真牛皮!手把手教你写Android项目文档,内含福利
- 再深谈TCP/IP三步握手四步挥手原理及衍生问题—长文解剖IP