Скрипты npm: читать файл .env - PullRequest
0 голосов
/ 01 января 2019

У меня есть простое требование: в моем файле сценариев npm package.json у меня есть строка:

{
    "scripts": {
        "example": "some-lib --argument --domain \"https://tld.com\""
    }
}

Теперь я хочу, чтобы «домен» был разложен.

Сначалапопробуйте использовать $npm_package_config, который работает:

{
    "config": {
        "domain": "https://tld.com"
    },
    "scripts": {
        "example": "some-lib --argument --domain \"$npm_package_config_domain\""
    }
}

Но я хочу, чтобы домен загружался из локального файла .env.

Я не нашел там никакого решения, чтобы прочитатьсодержимое файла env внутри сценариев npm в командной строке.

Может кто-нибудь дать мне подсказку о возможном решении этой проблемы?

1 Ответ

0 голосов
/ 02 января 2019

Краткий ответ: Нет краткого способа добиться этого, как в вашем втором примере, который ссылается на переменную $npm_package_config.

Вместо этого вам нужно будет выполнить команду (то есть тот, который в настоящее время определен в вашем npm-скрипте) через вспомогательный скрипт nodejs.По сути, ваш скрипт nodejs должен:

Затем можно запустить вспомогательный сценарий nodejs с помощью сценария npm.

Ниже описано, как создать решение, работающее на кроссплатформенном уровне.


Решение

1.Файл .env

Во-первых, давайте предположим, что у нас есть файл .env , находящийся в корневом каталоге нашего проекта.Файл .env содержит следующую запись:

DOMAIN=https://tld.com

2.Установите

Следующий скрипт nodejs использует пакет dotenv для загрузки переменных среды из файла .env .Нам нужно будет установить его.Для этого cd перейдите в каталог вашего проекта и выполните следующую команду:

npm i -D dotenv

3.Сценарий Node.js ( some-lib-cmd.js )

Затем создайте сценарий nodejs следующим образом.Давайте назовем файл some-lib-cmd.js и сохраним его в корне каталога проекта:

// Requirements...
require('dotenv').config();
const execSync = require('child_process').execSync;
const path = require("path");

/**
 * Creates a path to an executable in the node_modules/.bin directory. Each
 * path segment is joined with the appropriate platform-specific separator as
 * a delimiter.
 * @param {String} cmd The name of the executable.
 * @returns {String} The path to the executable.
 */
function getBinFile(cmd) {
  return path.join('node_modules', '.bin', cmd);
}

// Execute the command...
execSync(`${getBinFile('some-lib')} --argument --domain ${process.env.DOMAIN}`, { stdio: [0, 1, 2] });

Примечания:

  • Если ваш файл .env не находится в корне каталога нашего проекта вместе с some-lib-cmd.js ,тогда вы можете использовать опцию dotenv path, чтобы определить собственный путь к местоположению вашего файла .env.Например:

    require('dotenv').config({ path: 'path/to/another/folder/' })
    
  • Для ссылки на переменную DOMAIN из скрипта nodejs мы используем process.env, то есть process.env.DOMAIN.

4.package.json

В разделе scripts вашего package.json определите следующий скрипт:

"scripts": {
  "example": "node some-lib-cmd"
}

Примечание: Если вырешили сохранить some-lib-cmd.js в другом месте, то есть не в корневом каталоге вашего проекта, а затем при необходимости переопределить путь в вашем скрипте example.Например:

"scripts": {
  "example": "node path/to/some/folder/some-lib-cmd"
}
...