`npm publish`忽略对.npmignore的新添加

`npm publish`忽略对.npmignore的新添加,npm,npm-publish,npmignore,npm-pack,Npm,Npm Publish,Npmignore,Npm Pack,在app附近构建create时,会在项目树中创建工件。其中一些文件被保存到.npmignore文件中,但其他文件被丢失,直到我尝试发布新版本,并注意到由于生锈的构建工件,npm包将有数百兆字节大(!!)。我将这些信息发送给了.npmignore,但是npm publish没有注意到 我可以通过删除文件来解决这个问题,但是对于一个开放源代码库来说,这样的解决方法很容易出错,而这个库可能是由不断增长的贡献者团队维护和发布的 npm是否将.npmignore文件缓存在某个地方?如何使npm使用新设置

在app附近构建
create
时,会在项目树中创建工件。其中一些文件被保存到
.npmignore
文件中,但其他文件被丢失,直到我尝试发布新版本,并注意到由于生锈的构建工件,npm包将有数百兆字节大(!!)。我将这些信息发送给了
.npmignore
,但是
npm publish
没有注意到

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

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


详细信息和快速参考:

操作系统:macOS 10.15.6
节点版本管理器:v0.7.6
节点:v12.14.1
npm:v6.13.7

package.json

-- snip --
"files": [
  "/common",
  "/templates"
],
-- snip --
common/contracts/rust/target
common/contracts/out
templates/*/.cache
templates/*/assembly
-- snip --
-- 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 --
.npmignore

-- snip --
"files": [
  "/common",
  "/templates"
],
-- snip --
common/contracts/rust/target
common/contracts/out
templates/*/.cache
templates/*/assembly
-- snip --
-- 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 --
npm包的输出--dryrun

-- snip --
"files": [
  "/common",
  "/templates"
],
-- snip --
common/contracts/rust/target
common/contracts/out
templates/*/.cache
templates/*/assembly
-- snip --
-- 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 --

如果您想亲自尝试:

  • 克隆存储库
  • cd普通/合同/锈蚀
  • 货物建造
    (您需要)
  • cd../../..
  • npm包——干运行
  • 对你有用吗?这是“我的机器上唯一坏的”吗

    这是“我的机器上唯一坏掉的”东西吗

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

    我之前说“几乎”的原因是因为你在上次评论中说:

    因此,在这种情况下,
    templates/*
    中的所有路径都将被忽略,但
    common/contracts
    中的路径将包含在包中

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

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


    为什么会这样? package.json的docs字段说明了与您的问题相关的以下内容:

    注意:我添加了粗体强调

    您还可以在包的根目录或子目录中提供一个
    .npmignore
    文件,这样可以避免包含文件在包的根目录处,它不会覆盖“文件”字段,但在子目录中会覆盖

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


    解决

    这里有两个不同的解决方案/方法要考虑(它们没有特定的顺序):

  • 省略package.json中的
    文件
    条目,并根据需要扩充当前的.npmignore文件

    i、 e.从package.json中删除此项:

    同时,考虑到文档中指出:“在包的根目录下,[.npmignore]不会覆盖“文件”字段,但在子目录中它将”,那么您需要:

  • common/contracts/
    目录中创建一个.npmignore文件,其中包含以下模式:

    锈蚀/目标
    出来
    
  • templates/
    目录中创建包含以下模式的.npmignore文件:

    */.cache
    */装配
    */合同
    */package.json
    */高级文书主任/资产
    */src/config.js
    */src/global.css
    */src/utils.js
    
  • 当前位于项目目录根目录(原样)的
    .npmignore
    文件对于第二种方法变得多余


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



    因此,假设您的文档中当前指定的每个模式都没有被忽略,也就是说,它们都被包括在内。这是您认为问题所在的正确假设吗?还是仅仅是您说“我将这些添加到了.npmignore中?”",没有被忽略,而所有其他模式都被正确忽略?@RobC只有新添加的模式没有被正确拾取,但是我最初添加的模式被正确拾取。因此,在这种情况下,
    templates/*
    中的所有路径都被忽略,但是
    common/contracts
    中的路径都包含在包中。谢谢,@RobC!此处已修复–如前所述,我错误地认为
    模板/*
    规则工作正常。
    npm-pack
    始终忽略符号链接,我现在还验证了
    npm-pack
    在每个子目录中使用
    .gitignore
    ,这就是忽略
    .cache
    文件夹的原因。所有
    templates/*
    我最初的问题中的规则是多余的;是一种误导。