Есть ли способ включить пробелы в ключевые слова при запуске "npm init"?
Я знаю, что всегда могу вернуться и отредактировать package.json позже, но я не могу не быть любопытным: есть ли способ запустить npm init
и введите фразу с пробелами в части формы "ключевые слова"? Например, ввод "api платформы" приводит к словам "платформа" и "api" с экранированием начальной и конечной кавычек.
1 ответ
Короткий ответ:
Нет, к сожалению, вы не можете ввести фразу для ключевого слова через npm init
команда, содержащая пробелы, например platform api
, и ожидайте, что он станет одним элементом в результирующем keywords
массив файла package.json.
В приведенном ниже примере показан желаемый результат в package.json:
{
...
"keywords": [
"platform api"
],
...
}
Примечание. Хотя приведенный выше пример ключевого слова вполне применим вpackage.json
, этого просто нельзя достичь с помощью ввода из командной строки с помощью npm init
команда. Я бы рассмотрел либо:
- Как вы говорите, ретроспективно вводя его в
package.json
. - Или просто используйте дефис, например введите / введите
platform-api
через командную строку при использованииnpm init
команда. - Примечание: это приведет кplatform-api
в package.json, а неplatform api
Длинный ответ:
Почему это невозможно?
Желаемый результат не может быть достигнут через командную строку с помощью npm init
команда из-за базового исходного кода в пакете init-package-json, который использует инструмент npm-cli.
Давайте посмотрим на соответствующую часть кода, начиная со строки № 210 в файле с именемdefault-input.js
. Вот это показано ниже:
Выдержка из default-input.js
if (!package.keywords) { exports.keywords = yes ? '' : prompt('keywords', function (s) { if (!s) return undefined if (Array.isArray(s)) s = s.join(' ') if (typeof s !== 'string') return s return s.split(/[\s,]+/) // <---- line #215 }) }
В строке № 215 указывается;
return s.split(/[\s,]+/)
строка (то есть ключевое слово (а), которое вы вводите через командную строку), разбивается на массив с помощью split()
метод. Обратите внимание на регулярное выражение, т.е. [\s,]+
, используется как разделитель дляsplit()
метод. Это по существу разбивает строку везде, где есть пробел (и) и / или запятая (и). Именно эта часть делает ваше требование невозможным.
Как такое могло быть?
Если строка № 215 была изменена на:
return s.split(/,\s/)
при этом запятая, за которой следует пробел, использовалась в качестве разделителя дляsplit()
метод. Тогда скажем черезnpm init
команда для введенных вами ключевых слов:
platform api, foobar, quux
это приведет к следующему keywords
запись в результирующем package.json:
{
...
"keywords": [
"platform api",
"foobar",
"quux"
],
...
}
Внимание: хотя в разделе " Как это может быть возможно " описано, какие изменения необходимы в исходном коде для достижения желаемых требований, я не подразумеваю и не предлагаю вам изменить исходный код.