Как вы используете свойства "файлы" и "каталоги" в package.json?

Если у package.json есть files prop и/или directories prop:

  "files": [
    "./src/assets/fonts/"
  ],
  "directories": {
     "assets:": "./src/assets"
  }

Какие способы их использования? В документации не упоминается, что можно сделать с ними, как только они были указаны.

Например, файлы docs говорят:

Поле "файлы" представляет собой массив файлов для включения в ваш проект. Если вы укажете папку в массиве, то она также будет содержать файлы внутри этой папки.

Что означает "включить в ваш проект"? Включить, где? Как они теперь становятся доступными, что они не были раньше?

В разделе каталогов в документах говорится:

В будущем эта информация может использоваться другими творческими способами.

Каковы существующие творческие способы его использования?

Ответ 1

"включить в свой проект" означает, что файлы будут в упакованном tarball, который создается при запуске npm publish. Вы также можете запустить npm pack для создания tarball для проверки без фактического запуска публикации. Таким образом, вы можете открыть созданный tarball и проверить, какие файлы были/не были включены.

Хотя .npmignore (или .gitignore как прокси, если нет .npmignore) функционирует как черный список файлов для игнорирования (тем самым, включая все остальное по умолчанию), массив files является "белым". То есть вместо того, чтобы включать все по умолчанию, если указан массив files все исключено по умолчанию, и только те файлы, явно перечисленные, будут включены в упакованный архив.

Например, ваш пакет представляет собой библиотеку, предназначенную для использования в браузере. Ваш код находится в lib/, и вы запускаете браузер для компиляции в совместимую с браузером lib на dist/index.js. Вы начинаете с кучи файлов, перечисленных в .gitignore, который используется как defacto .npmignore которого нет. Но теперь, когда dist/ заполнен сгенерированными файлами, вы хотите, чтобы они игнорировались из git repo. Если вы добавите их в .gitignore, они будут исключены из git repo, но они также будут проигнорированы из tarball пакета. Таким образом, у вас есть два варианта: .gitignore свой .gitignore как .npmignore но только список dist/ in .gitignore. Если вы это сделаете, вам придется хранить два файла почти, но не совсем в синхронизации. Этот путь является тедием и подвержен ошибкам.

Другая альтернатива - не иметь .npmignore, а вместо этого просто перечислить файлы, которые вы действительно хотите в пакете, в массиве files. README.*, package.json, CHANGELOG.* (Возможно, несколько других), автоматически включаются в тарболе независимо. Поэтому вы просто добавляете "files": [ "dist" ] и все готово. Теперь ваш пакет tarball не будет включать исходный исходный JS из lib, а не tests/ etc, но вместо этого будет содержать только фактическую скомпилированную lib в dist/.

Что касается directories, я обычно перечисляю lib (для es5), src (для es6, coffeescript, typescript etc sources), dist (для браузеров или vm-специфических сборников), test, output (для временно сгенерированных файлов, таких как отчеты о доставке и т.д.), doc и т.д. Хотя это свойство не используется непосредственно npm или другими инструментами, оно делает структуру каталогов явной. Кроме того, он делает каталоги ссылками в сценариях npm следующим образом:

"scripts": {
  "clean": "rm -rf $npm_package_directories_dist $npm_package_directories_output",
  "lint": "eslint $npm_package_directories_src",
  "test": "teenytest $npm_package_directories_test",
}

Таким образом, каталоги указываются только один раз, и если они меняются, их нужно изменить только в одном месте (а не во всех пакетах package.json).