2

我使用节点pkg来创建我的 nodejs 服务的 .exe:https ://www.npmjs.com/package/pkg

我的问题是:如何让 .exe 使用 config.js 来获取一些设置值?ip、端口、数据库名称等基本内容。因为我有 3 个环境,我想对所有环境使用相同的 exe,但每个环境使用不同的 config.js 文件。

到目前为止,如果我这样做pkg app.js,它会创建一个不查看任何其他文件的 .exe。完全孤立无援。如何让它在config.js启动时查看?

在网站上,他们确实有一个关于config https://github.com/zeit/pkg#config的部分,但我不明白如何使用它。目前我有我的 app.js,还有包含配置信息的 secrets.js。

4

2 回答 2

1

我不确定这是正确的方法,但我希望这对某人有所帮助。
参考 pkg 文档,在运行时,__dirname 变为“/snapshot/project”。

因此,通过检查 __dirname,您可以确定您所在的环境。
(节点 app.js 或 app.exe)。

然后我们可以像下面这样分离require语句。

const PKG_TOP_DIR = 'snapshot';

const runInPKG = (function(){
  const pathParsed = path.parse(__dirname);
  const root = pathParsed.root;
  const dir = pathParsed.dir;
  const firstDepth = path.relative(root, dir).split(path.sep)[0];
  return (firstDepth === PKG_TOP_DIR)
})();

let config = require('./appconfig.json');

if(runInPKG) {
  const deployPath = path.dirname(process.execPath);
  config = require(path.join(deployPath, 'appconfig.json'));
}
  • 将上述代码添加到您的 app.js 会在 pkg 构建时发出一些警告。

包。--targets node8-win-x64 --out-path ./dist

pkg@4.4.0 警告 无法解析 'path.join(deployPath, 'appconfig.json')'
app.js
动态 require 可能在运行时失败,因为请求的文件
在编译时未知并且未包含在可执行文件中。
使用字符串文字作为 'require' 的参数,或保持
原样并在 'scripts' 选项中指定解析的文件名。

于 2019-07-10T04:26:21.570 回答
0

https://github.com/vercel/pkg/issues/195
使用 fs 读取配置文件而不是 require 或 import
例如:
const configPath = path.join(process.cwd(), './config/config.json' );
lset 数据 = fs.readFileSync(configPath);

相同的问题链接:使用 pkg 将节点 js 文件转换为 exe 时排除配置文件

于 2021-05-14T02:22:58.980 回答