#javascript #node.js #npm #yaml
#javascript #node.js #npm #yaml
Вопрос:
Я использую pkg для создания исполняемого файла для моего js-приложения node. Это отлично работает. Тем не менее, я также использую модуль конфигурации для загрузки конфигурационных файлов yaml на основе среды. При упаковке приложения с помощью pkg я указываю, что должна быть включена папка конфигурации.
"pkg": {
"assets": [
"config/*"
]
}
Когда я запускаю pkg . --debug
, я вижу, что конфигурационные файлы упаковываются. Однако, если я затем переименую папку конфигурации, удалю папку или просто перемещу недавно упакованный exe-файл в другую папку, появится сообщение No configurations found in configuration directory:C:Usersmefolderwithexeconfig
(этот каталог конфигурации не существует, потому что я переместил exe-файл в новую папку)
Из того, что я могу сказать, config
модуль, похоже, ищет папку конфигурации относительно того, где выполняется exe. Он не получает его из упакованного exe-файла, даже если он там есть. Итак, если вы должны были запустить этот exe-файл на другом компьютере (что является планом), тогда он ищет папку конфигурации за пределами exe. Ни у одного из других модулей, похоже, нет этой проблемы. Это просто этот модуль конфигурации.
Есть идеи, как я могу заставить 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:
pkg будет связывать каждую требуемую зависимость и все ресурсы или скрипты, которые он нашел в списках конфигурации (активы и скрипты). Итак, сначала вам нужно хранить свои файлы конфигурации подальше от 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"));
После этого исполняемый файл получит конфигурационный файл из «относительного пути» запущенного каталога.
Я не тестирую с помощью модуля config, но я думаю, что если вы удалите свойство assets: ["config/*"]
from из pkg package.json
и добавите новый путь к модулю config (выше), он будет работать.
process.env["NODE_CONFIG_DIR"] = path.join(process.execPath, "../","./config/");
const config = require("config");