npm - `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 --
如果你想自己尝试:
- 克隆存储库
cd common/contracts/rust
cargo build
(你需要安装 Rust)cd ../../..
npm pack --dryrun
对你起作用吗?这是“仅在我的机器上损坏”的事情吗?
解决方案
“这是“只在我的机器上坏了”的东西吗?”
不,考虑到您的项目当前配置,这(几乎)是预期的行为 - 并且没有npm 不会在.npmignore
某处缓存文件。
我之前说“几乎”的原因是因为您在上一条评论中说:
“所以在这种情况下,所有路径
templates/*
都被忽略,但路径common/contracts
包含在包中。”
这不应该是这种情况,因为根据文档中所述的 npm 预期行为(请参阅下面的“为什么会发生这种情况?”部分) ,鉴于您当前的包,您的.npmignore文件中当前指定的任何模式都不应该有效。 json的files
配置。
您遇到的是奇怪的行为,即某些模式受到尊重,而另一些则不受到尊重,但是希望通过遵循两种建议的解决方案/方法(如下)中的任何一种,您将获得正确的预期结果。
为什么会这样?
package.json字段的文档files
说明了与您的问题相关的以下内容:
注意:我添加的粗体强调。
您还可以
.npmignore
在包的根目录或子目录中提供一个文件,以防止包含文件。在你的包的根目录,它不会覆盖“files”字段,但在子目录中它会覆盖。
因此,当前在您的.npmignore文件中指定的模式未被忽略的原因是因为它们试图覆盖当前在您的 package.json 字段中指定的包含模式files
。本质上,因为您的.npmignore文件当前位于包的根目录,它不会覆盖“文件”字段。
解决方案
以下是要考虑的两种不同的解决方案/方法(它们没有特定的顺序):
省略package.json
files
中的条目并根据需要增加当前的.npmignore文件即从package.json中删除:
“文件”:[ “/常见的”, “/模板” ],然后在您当前的.npmignore文件中为任何其他也应从打包/发布中排除的目录/文件创建其他模式。换句话说,将任何模式添加到.npmignore中,用于不驻留在某处
/common
或/templates
也应排除的资产。例如,在简要查看您的 repo 之后,您还需要将模式添加
tests
到.npmignore。总之,第一种方法是删除
files
字段并在一个位置指定要忽略的资产的所有模式 - 在.npmignore
项目根目录的文件中。或者,将package.json
files
中的条目保持原样并在子目录中创建额外的.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] 不会覆盖“文件”字段,但在子目录中它会“然后你需要:
在包含以下模式的目录中创建一个.npmignore文件:
common/contracts/
rust/target out
在包含以下模式的目录中创建一个.npmignore文件:
templates/
*/.cache */assembly */contract */package.json */src/assets */src/config.js */src/global.css */src/utils.js
.npmignore
使用第二种方法,当前驻留在项目目录根目录(原样)的文件变得多余。
注意:希望通过遵循上述两种解决方案/方法中的任何一种(它们确实严格遵守 npm 记录的期望),您将获得所需的结果。但是,如果这些提议的解决方案都没有产生预期的结果,那么我建议将提议的解决方案之一作为基线起点,然后阅读这个 SO 线程中的一些答案。是的,这个问题与您的问题相反,但是您可能会进一步了解下一步,特别是从这个答案中 - 它提到“npm 打包并发布尊重您在目录树中拥有的任何 package.json 文件,而不仅仅是在根目录。” .
推荐阅读
- python - 默认损失函数 contrib.learn DNNRegressor
- java - 写文本文件不起作用java
- javascript - 具有分层图像的帆布手电筒效果
- java - RegEx 仅匹配不以单引号开头或结尾的数字
- java - Switch 语句 vs Enum 变量
- symfony - 使用 TWIG 从 HTML 中提取“src”
- rxjs - 使用 mapPropsStream 过滤不起作用
- javascript - 如何在打字稿中导入存储在外部文件变量中的字符串值,而不会丢失特殊字符内容?
- python - 在单行上打印斐波那契数列
- c - 在代码块与 gcc 中编译:错误:Id 返回 1 退出状态