Есть ли способ включить пробелы в ключевые слова при запуске "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"
  ],
  ...
}

Внимание: хотя в разделе " Как это может быть возможно " описано, какие изменения необходимы в исходном коде для достижения желаемых требований, я не подразумеваю и не предлагаю вам изменить исходный код.

Другие вопросы по тегам