如何将 NodeJs 项目打包成带有 zeit/pkg npm 包的可执行文件?



我正在尝试使用 npm 包 https://github.com/zeit/pkg 我的节点应用程序进行可执行文件。我尝试但无法完全理解给定的文档,或者我做错了什么。

使用命令"npm install -g pkg"安装后 我已经将入口点放在package.json文件中,如下所示:

"bin": "app.js"

我正在运行这个 cmnd:

pkg .

在此之后,我将获得可以运行的可执行文件。我尝试在 Windows 上运行它使用 proj_name-win 创建的文件,但它不起作用。 谁能解释一下使可执行的步骤以及我做错了什么?

我做了几件事。

首先,确保所有开发文件夹中的必需文件都添加到 package.json 文件中的键名 pkg 和脚本下。如果资产也包含它们

"pkg": {
"scripts" : [
"src/client/websocket/packets/handlers/*.js",
"src/client/websocket/packets/handlers/Ready.js",
"src/client/actions/*.js",
"src/client/actions/ActionsManager.js"
]
}

这样。如果除了脚本文件之外还有资产,请将它们添加为资产键。

第二个pkg server.js --config package.json是服务器.js是我的索引文件/起始文件

如果出现错误,如果某些包丢失了,那么从相应的位置复制相同的包(大多数情况下,这将来自node_modules(并将其粘贴到可执行文件旁边。

请添加以下代码以使用 pkg :

包.json

"main": "app.js",
"scripts": {
"start": "npm start"
},
"bin" : "$DIRnode_modulesnpmcli.js"

然后运行命令pkg 。

1(您也可以通过命令直接打包app.js(以防您没有任何其他资产要添加到pkg中(:

pkg app.js

2(它将在您当前的工作目录中创建可执行文件。

3(您也可以在"bin"中给出入口点:

例:

包.json

"main": "app.js",
"scripts": {
"start": "npm start"
},
"bin" : "./bin/my-bin.js"

bin/my-bin.js

#!/usr/bin/env node
var join = require('path').join
var childProcess = require('child_process');
var args = process.argv.slice(2);
args.unshift(__dirname + '/../'); 
childProcess.exec('npm start', (err, stdout) => {
if (err) console.log(err);
console.log(stdout);
})

然后,在当前工作目录中,

pkg .

我发现这个例子最有帮助(它也包括package.json中动态引入脚本和资产的功能(: https://github.com/asaf050/loopback-pkg-ready

我发现这些也有些帮助: http://thecodebarbarian.com/standalone-express-apis-binaries-with-pkg https://mrlithium.blogspot.com/2017/11/compiling-nodejs-app-into-exe-using-pkg.html

基本上,"pkg ."应该可以正常工作,如果你的package.json设置正确。请注意,如果您不指定"-t latest-win-x64",它将构建所有 3 个操作系统。您还可以在运行服务器时指定特定于节点的选项(例如 --options expose-gc(。因此,包可能如下所示: pkg -t 最新双赢 x64 .--期权暴露-GC

如果你只使用".",那么它应该是你的package.json所在的目录,你的package.json需要有bin和主条目,就像你指定的那样。我不确定为什么需要垃圾箱,因为它看起来与主箱相同。你也可以在调用 pkg 时指定主文件,如下所示: pkg -t latest-win-x64 ./server/server.js --options expose-gc

同样,"-t"和"--options"是可选的,您只需要调用"pkg ."或"pkg ./app.js"来构建软件包。

您可以发布收到的错误消息吗?不要单击.exe,而是从命令行调用 if 以获取日志或输出到日志文件。对我来说,它没有运行的原因是静态文件和动态模块加载,它在构建和运行.exe时指定了这些内容。

最新更新