DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

cargo package 把 .venv 里的 LICENSE 当成未提交文件:收窄 include 匹配

明明忽略了 .venv,打包仍报告其中的 LICENSE 未提交。检查 package.include 是否用了未锚定根目录的 LICENSE 模式。

cargo package 或 cargo publish 提示 .venv/some-package/LICENSE 有未提交改动,但 .venv/ 已在 .gitignore 中。若清单包含 package.include = ["src/**/*", "Cargo.toml", "LICENSE"],先看 LICENSE 的匹配范围,不必先怀疑 Git 忽略失效。

include 是包内容的显式选择规则。启用它后,Cargo 不再用 Git 忽略规则过滤这份选择;其中没有前导斜杠的 LICENSE 可以匹配嵌套目录里的同名文件。文件处于被 Git 忽略的目录,并不能证明它不在待打包集合中。

把根目录文件写明确

如果只想发布包根的许可证,可把对应项改为 /LICENSE。下面是 Cargo.toml 的局部示例,其他必须发布的资源仍需保留:

[package]
include = ["/src/**", "/Cargo.toml", "/LICENSE"]

/ 在这里锚定包根,不是操作系统文件系统根目录。改之前先确定项目是否有意发布嵌套的许可证、示例或生成资源,不要把所有模式一律加斜杠后遗漏必需文件。

Git 忽略文件也可能是有意要发布的生成资源。因此,改 .gitignore 并不是这条路径的完整处理;include 本身才决定要选哪些文件。include 与 exclude 也不是可以任意叠加的两层过滤,已有 include 时应直接修正它的模式。

先看清单,再决定是否允许脏目录

在正常开发环境检查:

cargo package --list

这会读取项目、解析打包信息,并可能访问依赖,不是生产发布命令。若仍因未提交文件而中止,先依据错误给出的路径检查模式;不要马上使用 --allow-dirty。该选项允许把未提交内容带入包,不能区分意外资源和真正需要的生成文件。

修改后重新列出文件,确认 .venv 内容消失,源码、许可证和运行所需资源仍完整。随后按项目流程验证打包产物及构建。这里无需清空 Cargo 缓存,也无需把虚拟环境提交到 Git。

这是 include 的既有匹配规则,不应把升级当成替代模式修正的办法。若明确的根路径仍匹配到无关文件,再保留最小清单和实际文件列表,按另一条故障继续排查。