使用节点pkg通过npm config创建可执行文件

时间:2020-09-17 07:52:51

标签: javascript node.js npm yaml

我正在使用pkg为我的node js应用程序创建可执行文件。这很好。但是,我也使用config module根据环境加载yaml配置文件。使用pkg打包应用程序时,我指定应包含config文件夹。

  "pkg": {
    "assets": [
      "config/*"
    ]
  }

运行pkg . --debug时,可以看到配置文件已打包。但是,如果我随后重命名配置文件夹,删除该文件夹,或者只是将新打包的exe移到另一个文件夹,它会显示No configurations found in configuration directory:C:\Users\me\folderwithexe\config(该配置目录不存在,因为我将exe移到了新文件夹)

据我所知,config模块似乎正在寻找相对于exe执行位置的config文件夹。即使它位于打包的exe文件中,也无法从中获取它。因此,如果要在另一台计算机上运行该exe文件(这是计划中的文件),则它将在exe文件外部查找config文件夹。其他模块似乎都没有此问题。就是这个配置模块。

有什么想法可以使pkg模块和config模块一起工作吗?

这是我完整的package.json

{
  "name": "my-app",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "author": "Me",
  "license": "UNLICENSED",
  "dependencies": {
    "config": "^3.3.1",
    "js-yaml": "^3.14.0",
  },
  "bin": "app.js",
  "pkg": {
    "assets": [
      "config/*"
    ]
  }
}

1 个答案:

答案 0 :(得分:0)

pkg 将捆绑每个 require 依赖项它在配置列表(资产和脚本)中找到的每个资产或脚本。所以,首先你需要让你的配置文件远离 pkg。

为了使 pkg 远离您的配置文件,您可以使用 pkg 无法解析的变量路径,例如:

const config = require(path.join(__dirname, 'config/config.json'));

此时 pkg 不会捆绑您的配置文件,但是如果您运行构建,您会注意到 config.json 的路径类似于 /snapshot/config/config.json (https://www.npmjs.com/package/pkg#snapshot-filesystem)

另一种方法是使用 process.execPath 从二进制路径获取配置文件:

const config = require(path.join(process.execPath, "../","./config/config.json"));

之后,可执行文件将从运行目录的“相对路径”中获取配置文件。

我不使用配置模块进行测试,但我认为如果您从 assets: ["config/*"] 的 pkg 属性中删除 package.json 并将新路径添加到配置模块(如上),它将起作用。

process.env["NODE_CONFIG_DIR"] = path.join(process.execPath, "../","./config/");
const config = require("config");
相关问题