Ответ 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).