Использование node pkg для создания исполняемого файла с конфигурацией npm

#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");