首页 > 解决方案 > `npm publish` 忽略 .npmignore 的新增内容

问题描述

在构建create-near-app时,会在项目树中创建工件。其中一些已添加.npmignore文件中,但其他一些在我尝试发布新版本并注意到由于 Rust 构建工件而导致 npm 包将有数百兆字节大(!!)之前被遗漏了。我这些添加到.npmignore,但npm publish没有注意到。

我可以通过删除文件来解决这个问题,但是对于一个开源库来说,这样的解决方法很容易出错,该库可能由一个不断成长和变化的贡献者团队维护和发布。

npm 是否将.npmignore文件缓存在某处?如何让 npm 使用新设置?


详细信息和快速参考:

os:macOS 10.15.6
节点版本管理器:asdf v0.7.6
节点:v12.14.1
npm:v6.13.7

包.json

-- snip --
"files": [
  "/common",
  "/templates"
],
-- snip --

.npmignore

common/contracts/rust/target
common/contracts/out
templates/*/.cache
templates/*/assembly
-- snip --

输出npm pack --dryrun

-- snip --
npm notice 293.2kB common/contracts/rust/target/debug/build/ryu-140fa0ad757694f9/build_script_build-140fa0ad757694f9                                                                           
npm notice 20.6kB  common/contracts/rust/target/debug/build/ryu-140fa0ad757694f9/build_script_build-140fa0ad757694f9.dSYM/Contents/Resources/DWARF/build_script_build-140fa0ad757694f9         
npm notice 297.4kB common/contracts/rust/target/debug/build/serde-3bef95b74f70906a/build_script_build-3bef95b74f70906a                                                                         
-- snip --

如果你想自己尝试:

  1. 克隆存储库
  2. cd common/contracts/rust
  3. cargo build(你需要安装 Rust
  4. cd ../../..
  5. npm pack --dryrun

对你起作用吗?这是“仅在我的机器上损坏”的事情吗?

标签: npmnpm-publishnpmignorenpm-pack

解决方案


“这是“只在我的机器上坏了”的东西吗?”

不,考虑到您的项目当前配置,这(几乎)是预期的行为 - 并且没有npm 不会在.npmignore某处缓存文件。

我之前说“几乎”的原因是因为您在上一条评论中说:

“所以在这种情况下,所有路径templates/*都被忽略,但路径common/contracts包含在包中。”

这不应该是这种情况,因为根据文档中所述的 npm 预期行为(请参阅下面的“为什么会发生这种情况?”部分) ,鉴于您当前的包,您的.npmignore文件中当前指定的任何模式都不应该有效。 jsonfiles配置。

您遇到的是奇怪的行为,即某些模式受到尊重,而另一些则不受到尊重,但是希望通过遵循两种建议的解决方案/方法(如下)中的任何一种,您将获得正确的预期结果。


为什么会这样?

package.json字段的文档files说明了与您的问题相关的以下内容:

注意:我添加的粗体强调。

您还可以.npmignore在包的根目录或子目录中提供一个文件,以防止包含文件。在你的包的根目录,它不会覆盖“files”字段,但在子目录中它会覆盖。

因此,当前在您的.npmignore文件中指定的模式未被忽略的原因是因为它们试图覆盖当前在您的 package.json 字段中指定的包含模式files。本质上,因为您的.npmignore文件当前位于包的根目录,它不会覆盖“文件”字段


解决方案

以下是要考虑的两种不同的解决方案/方法(它们没有特定的顺序):

  1. 省略package.jsonfiles中的条目并根据需要增加当前的.npmignore文件

    即从package.json中删除:

    “文件”:[
     “/常见的”,
     “/模板”
    ],

    然后在您当前的.npmignore文件中为任何其他也应从打包/发布中排除的目录/文件创建其他模式。换句话说,将任何模式添加到.npmignore中,用于不驻留在某处/common/templates也应排除的资产。

    例如,在简要查看您的 repo 之后,您还需要将模式添加tests.npmignore

    总之,第一种方法是删除files字段并在一个位置指定要忽略的资产的所有模式 - 在.npmignore项目根目录的文件中。

  2. 或者,将package.jsonfiles中的条目保持原样并在子目录中创建额外的.npmignore文件

    鉴于您的.npmignore文件中当前指定的模式是:

    common/contracts/rust/target
    common/contracts/out
    templates/*/.cache
    templates/*/assembly
    templates/*/contract
    templates/*/package.json
    templates/*/src/assets
    templates/*/src/config.js
    templates/*/src/global.css
    templates/*/src/utils.js
    

    并且还鉴于文档所述;“在包的根目录 [.npmignore] 不会覆盖“文件”字段,但在子目录中它会然后你需要:

    1. 在包含以下模式的目录中创建一个.npmignore文件:common/contracts/

      rust/target
      out
      
    2. 在包含以下模式的目录中创建一个.npmignore文件:templates/

      */.cache
      */assembly
      */contract
      */package.json
      */src/assets
      */src/config.js
      */src/global.css
      */src/utils.js
      

    .npmignore使用第二种方法,当前驻留在项目目录根目录(原样)的文件变得多余。


注意:希望通过遵循上述两种解决方案/方法中的任何一种(它们确实严格遵守 npm 记录的期望),您将获得所需的结果。但是,如果这些提议的解决方案都没有产生预期的结果,那么我建议将提议的解决方案之一作为基线起点,然后阅读这个 SO 线程中的一些答案。是的,这个问题与您的问题相反,但是您可能会进一步了解下一步,特别是从这个答案中 - 它提到“npm 打包并发布尊重您在目录树中拥有的任何 package.json 文件,而不仅仅是在根目录。” .



推荐阅读