“包含在您的项目中”表示文件将在运行时创建的打包tarball中npm publish。您也可以运行npm pack生成tarball以进行检查,而无需实际触发发布。这样,您实际上可以打开生成的tarball并检查不包含/不包含哪些文件。
虽然.npmignore(或.gitignore作为代理,如果没有.npmignore)用作要忽略的文件的黑名单(因此默认情况下包括其他所有内容),则该files阵列为白名单。也就是说,如果files没有指定默认值,则默认情况下不包括所有内容,并且默认情况下不包括所有内容,仅打包列出的tarball中将包含明确列出的那些文件。
例如,假设您的软件包是一个供浏览器使用的库。您的代码已包含lib/在内,然后运行browserify编译为兼容浏览器的lib dist/index.js。您首先.gitignore从中列出的一堆文件开始,这些文件实际上是.npmignore不存在的。但是现在dist/已经充满了生成的文件,您希望从git repo中忽略它们。如果将它们添加到.gitignoregit repo中,则会将它们排除在外,但也会从tarball包中忽略它们。因此,您有两个选择:复制您的.gitignoreas,.npmignore但仅dist/在中列出.gitignore。如果这样做,则必须使两个文件几乎同步但不完全同步。这种方式很麻烦并且容易出错。
另一种选择是不使用.npmignore,而是只在files数组中的包中列出您实际想要的文件。README.*,package.json,CHANGELOG.*(也许一对夫妇等)会自动包含在压缩包而不管。因此,您只需添加即可"files": [ "dist" ]完成。现在,您的压缩包tarball将不会包含来自的原始源JS lib,也不会包含tests/etc,而仅包含中的实际已编译库dist/。
至于directories,我通常列出lib(对于es5),src(对于es6,coffeescript,打字稿等源),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中的多个位置)进行更改。