Что на самом деле упаковано?

Опубликовано: 27/01/2021 Время на прочтение: 5 минут

Изображение с Unsplash.

Введение

После публикации статьи о разработке и публикации пакета npm с использованием TypeScript я получил в Твиттере предложение «создать .npmignore в дополнение к .gitignore, иначе ваш dist не будет включен (если dist находится в .gitignore)». Хотя это правда (вам не нужно добавлять файл .npmignore, если вы используете поле files в файле package.json), учитывая, что все три подхода влияют на то, что входит в ваш пакет npm, я написал эту статью чтобы попытаться демистифицировать процесс.

Давайте посмотрим на эти сценарии, чтобы понять, как может выглядеть каждый результат и каков будет рекомендуемый подход.

Задний план

Мы продолжим использовать этот демонстрационный пакет npm для этой статьи. Исходный код этого пакета можно найти на GitHub. В этой статье предполагается, что папка dist добавляется в файл .gitignore.

Сценарий 1. Использование файлов для включения того, что вы хотите

Чтобы явно указать, какие файлы вы хотите включить в пакет npm, вы можете использовать поле files в файле package.json. Вы можете напрямую указать имя файла или папки или использовать шаблон глобуса. Приведенный ниже фрагмент кода упаковывает папку dist и все файлы внутри папки dist, файл LICENSE и файл README.md.

Фактически, файл LICENSE, файл package.json и файлы README.md (среди нескольких других файлов) включены по умолчанию, поэтому вы также можете не включать их в поле файлов, если хотите. Вы можете запустить команду npm publish —dry-run, чтобы проверить, какие файлы будут упакованы.

В этом сценарии поле файлов в файле package.json имеет приоритет над файлом .gitignore. Вот почему, хотя папка dist находится в файле .gitignore, она включена в пакет npm, потому что мы явно включили ее в поле файлов.

Сценарий 2: файлы не используются

Если вы решите удалить поле files из файла package.json и попробуйте запустить команду npm publish —dry-run, чтобы увидеть, какие файлы будут упакованы, вы будете поражены, обнаружив, что почти все остальные файлы будут включены. это не часть файла .gitignore. Это происходит потому, что, когда вы опускаете поле файлов, он устанавливает значение по умолчанию для поля файлов на [«*»], что означает, что оно будет включать все файлы.

Следовательно, в этом сценарии файл .gitignore действует только как список исключений, и все, что не является частью этого файла, будет включено в пакет npm.

Сценарий 3: Использование файла .npmignore.

Мы определенно не хотим, чтобы все остальные файлы и папки были включены в пакет npm по разным причинам:

  • Это увеличивает размер пакета npm.
  • Мы не хотим, чтобы файлы разработки распространялись.

Чтобы смягчить это, мы можем создать новый файл с именем .npmignore и перечислить файлы и папки, которые мы не хотим упаковывать. Пример может выглядеть примерно так, как приведенный ниже фрагмент кода.

Теперь, если мы снова запустим команду npm publish —dry-run, мы обнаружим, что наш вывод выглядит так же, как когда мы использовали поле files в файле package.json.

Таким образом, в этом сценарии, поскольку файл .npmignore обнаружен, содержимое файла .gitignore игнорируется.

Включения и исключения по умолчанию

Согласно документации npm, определенные файлы всегда включены, независимо от настроек:

  • package.json
  • ПРОЧТИ МЕНЯ
  • ИЗМЕНЕНИЯ / ИЗМЕНЕНИЯ / ИСТОРИЯ
  • ЛИЦЕНЗИЯ / ЛИЦЕНЗИЯ
  • УВЕДОМЛЕНИЕ
  • Файл в «основном» поле

README, CHANGES, LICENSE & NOTICE могут иметь любой случай и расширение.

И наоборот, некоторые файлы всегда игнорируются:

  • .git
  • CVS
  • .svn
  • .hg
  • .lock-wscript
  • .wafpickle-N
  • .DS_Store
  • npm-debug.log
  • .npmrc
  • node_modules
  • config.gypi
  • package-lock.json (используйте термоусадочную пленку)
  • Все файлы, содержащие символ * (несовместимо с Windows)

Заключение

В итоге —

  • Я бы рекомендовал использовать раздел файлов в файле package.json вместо добавления файла .npmignore. Лучше явно указать, что вы хотите, вместо того, чтобы перечислять все, что вы не хотите включать — это больше усилий, и есть вероятность, что вы можете забыть добавить новый файл в список исключений.
  • Файлы, включенные в поле files файла package.json, нельзя исключить через .npmignore или .gitignore. Фактически, файлы .npmignore и .gitignore игнорируются.
  • Определенные файлы всегда включаются, в то время как, с другой стороны, определенные файлы всегда игнорируются, независимо от вашего подхода.

Вот и все. Спасибо за прочтение!



прокрутка вверх