Чтение из конфигурационного файла в разделе скриптов в пакете. json - PullRequest
1 голос
/ 11 февраля 2020

Есть ли возможность чтения из файла конфигурации в разделе "scripts" в пакете. json?

Предпосылки вопроса: Мы несколько разработчиков, которые все работают на одном терминальном сервере. И у нас есть следующий раздел в нашем пакете: json

...
"scripts": {
    "serve": "vue-cli-service serve --port 8080"
}
...

Поскольку мы находимся на одном сервере, нам нужен способ указать другой порт. Одна возможность - использовать параметр командной строки. Но я был бы признателен за «более простой» способ, при котором я могу сохранить порт в файле конфигурации, который я добавляю к .gitignore, чтобы каждый разработчик мог иметь свой собственный файл, и мы можем просто набрать npm run serve, не думая вводить порт.

Может быть, есть лучший способ сделать то, что я хочу. Я открыт для предложений.

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Вы можете делать все что угодно, потому что npm просто запускает команду в подоболочке.

Например, в Bash (или аналогичном) вы можете использовать файл конфигурации:

$ cat config.env
PORT=8080

И затем отправьте файл перед выполнением действительной команды:

"scripts": {
    "serve": "source config.env && vue-cli-service serve --port $PORT"
}

Или, в Windows, вы можете использовать пакетный файл:

C>type config.cmd
set PORT=8080

А затем запустите пакетный файл перед выполнением фактической команды:

"scripts": {
    "serve": "config.cmd && call vue-cli-service serve --port %^PORT%"
}

Обратите внимание на странный синтаксис call и %^PORT%, это не опечатка. В Windows это требуется для задержки раскрытия переменной.

Или, чтобы сделать ее более переносимой, используйте скрипт Python / Node.js / любой другой.

1 голос
/ 11 февраля 2020

Одной из возможностей является использование параметра командной строки.

Да, для этого вам потребуется настроить скрипт serve в пакет. json как это:

"scripts": {
  "serve": "vue-cli-service serve --port"
}

Затем через инструмент CLI запустите:

npm run serve -- <port_number>

Примечание: <port_number> аргумент должен быть заменен реальным номером порта, например 8080, 3000 et c ...


... Я был бы признателен «проще», где я могу сохранить порт в файле конфигурации ...

Файл конфигурации:

Допустим, у нас есть файл с произвольным именем .portnumber, который сохраняется в root каталога проекта. Например:

.
├── .gitignore
├── .portnumber    <------ 
├── node_modules
│   └── ...
├── package.json
└── ...

, а содержимое файла .portnumber содержит только номер порта, который будет использоваться. Например:

3000

Решение A: * Только для платформ Nix (Linux / MacOS ...)

При запуске сценариев npm в * nix платформы, используемая по умолчанию npm оболочка sh. Поэтому будет работать следующее.

package. json

"scripts": {
  "serve": "vue-cli-service serve --port \"$(<.portnumber)\""
}

Часть $(<.portnumber), приведенная выше, по существу считывает содержимое файла .portnumber, ( это то, что делает часть <.portnumber), и использует Подстановка команды .

Так, учитывая, что файл .portnumber содержит 3000 команда, выполняемая в сценарии npm эффективно:

vue-cli-service serve --port 3000

Вы также можете сделать это:

пакет. json

"scripts": {
  "serve-with-default": "port=$(<.portnumber); vue-cli-service serve --port \"${port:-8080}\""
}

Это очень похоже на предыдущий однако если файл .portnumber не существует или является пустым, по умолчанию для номера порта будет использоваться 8080.


Решение B: Кроссплатформенное (Windows / Linux / macOS .. .)

Для кроссплатформенного решения (т. Е. Успешно работающего на Windows, Linux и macOS ...) вам потребуется использовать nodejs для выполнения ваших требований. Есть несколько различных подходов к этому, как описано в следующих двух подразделах:

  • Использование внешнего nodejs (. js) файла
  • Встраивание ваш JavaScript в пакете. json.

Использование внешнего nodejs (. js) файла

Создайте файл с именем serve.js

serve. js

const readFileSync = require('fs').readFileSync;
const execSync = require('child_process').execSync;

const port = readFileSync('.portnumber', {encoding: 'utf8'});

execSync('vue-cli-service serve --port ' + port, {stdio: 'inherit'})

.. и также сохраните его в каталоге вашего проекта:

.
├── .gitignore
├── .portnumber    <------ 
├── node_modules
│   └── ...
├── package.json
├── serve.js       <------ 
└── ...

Переопределите ваш serve npm скрипт выглядит следующим образом:

пакет. json

"scripts": {
  "serve": "node serve"
}

Объяснение:

Файл serve.js по существу выполняет следующие действия:

  • Использует встроенный node.js readFileSync для чтения содержимого файла .portnumber и присваивает номер переменной port.

  • Затем использует встроенный node.js execSync для запуска команды vue-cli-service serve --port с портом номер, ранее считанный из файла .portnumber.

In выровняв свой JavaScript в пакете. json.

Кроме того, вы можете вместо этого встроить свой код nodejs / JavaScript в раздел скриптов вашего пакета. json. В этом случае переопределите ваш скрипт npm следующим образом:

package. json

"scripts": {
  "serve" : "node -e \"require('child_process').execSync('vue-cli-service serve --port ' + require('fs').readFileSync('.portnumber', {encoding: 'utf8'}), {stdio: 'inherit'})\""
}

Объяснение:

  • Это фактически то же самое (хотя и рефакторированное), что и вышеупомянутое решение, в котором использовался отдельный файл .js, однако использование отдельного сценария / файла nodejs теперь избыточно.
  • Параметр командной строки nodejs -e используется для оценки встроенного JavaScript.
1 голос
/ 11 февраля 2020

Одним из решений было бы добавить файл .npmr c в каталог root проекта и указать разные порты для каждого разработчика:

port=8081

Тогда Вы можете использовать эту переменную в своем приложении (process.env.npm_config_port) или пакете. json:

"scripts": {
    "serve": "vue-cli-service serve --port $npm_config_port"
}

Следуя своей идее, вы можете добавить .npmr c до .gitignore .

На мой взгляд, еще более понятным способом было бы добавить .npmr c непосредственно в домашнюю директорию каждого разработчика, указав c конфигурацию для проекта.

...