如何使用zeit / pkg npm包将NodeJs项目打包成可执行文件?

时间:2017-08-21 06:37:24

标签: node.js npm

我正在尝试用https://github.com/zeit/pkg npm包制作我的节点应用程序的可执行文件。我试过但完全不理解给定的文件或者我做错了。

使用命令安装后,npm install -g pkg' 我把入口点放在package.json文件中,如:

"bin": "app.js"

我正在运行这个cmnd:

pkg .

在此之后,我将获得可以运行的可执行文件。我尝试在Windows上使用proj_name-win运行它创建的文件,但它无法正常工作。 任何人都可以解释一下制作可执行文件的步骤以及我做错了什么吗?

4 个答案:

答案 0 :(得分:1)

我做了几件事。

首先请确保所有开发文件夹中的必需文件都以pkg和脚本的键名添加到package.json文件中。如果资产也包括在内

"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是server.js是我的索引文件/起始文件

万一出现错误,某些软件包是否丢失了,那么请从相应的位置复制相同的软件包(主要是从node_modules复制)并将其粘贴到可执行文件旁边。

答案 1 :(得分:0)

我发现这个例子最有用(它包括在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 latest-win-x64。 --options expose-gc

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

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

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

答案 2 :(得分:0)

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

<强>的package.json

"main": "app.js",
"scripts": {
"start": "npm start"
 },
"bin" : "$DIR\node_modules\npm\cli.js"

然后运行命令 pkg。

注意

1)你也可以通过命令直接打包app.js(如果你没有任何其他资产可以在pkg中添加):

pkg app.js

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

3)你也可以在&#34; bin&#34;中给出入口点。 :

示例:

<强>的package.json

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

<强>斌/我的-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 .

答案 3 :(得分:0)

pkg似乎维护得不多,我建议您研究nexe