如何使用package.json中的“文件”和“目录”属性?


74

如果一个package.json具有files道具和/或directories道具:

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

有什么方法可以利用它们?文档中没有提及一旦指定它们后可以做什么。

例如,文件docs说:

“文件”字段是要包含在项目中的文件数组。如果您在阵列中命名一个文件夹,则该文件夹还将包含该文件夹中的文件。

“包含在您的项目中”是什么意思?包括在哪里?现在已经不存在了,它们如何可访问?

目录部分,文档说:

将来,此信息可能会以其他创造性方式使用。

现有的创造性使用方式是什么?


2
不幸的是,在JavaScript世界中,您将获得的所有文档都类似“文件模式遵循与.gitignore类似的语法,但取反”之类的东西。我想知道有多相似?通常,您期望找到一种语法,或者至少参考一些其他说明来解释该值。
兰迪·哈德森

Answers:


91

“包含在您的项目中”表示文件将在运行时创建的打包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.jsonCHANGELOG.*(也许一对夫妇等)会自动包含在压缩包而不管。因此,您只需添加即可"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中的多个位置)进行更改。


对我来说,文件显示在tarball内容中,但在node-mosules文件夹中不可用。您知道可能是什么问题吗?
ZaidRehman

1
现在,您也可以执行操作npm publish --dry-run以找出确切包含了哪些文件,而无需执行实际的发布步骤
Dan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.