更新日志
Cargo 1.87 (2025-05-15)
新增
变更
- cargo-add: 折叠大型特性列表 #15200
修复
- cargo-publish: 修复 man 手册页中格式错误的
{{#options}}块 #15191
仅 Nightly 版本
-Zscript: 处理更多 frontmatter 解析边缘情况 #15187
文档
内部
Cargo 1.86 (2025-04-03)
新增
变更
- ❗️ 合并时,替换而不是合并引用程序路径及其参数的配置键。 #15066
这些键包括registry.credential-providerregistries.*.credential-providertarget.*.runnerhost.runnercredential-alias.*doc.browser
- ❗️ 如果同时传递
--package和--workspace但请求的包缺失,则报错。此前会静默忽略,这被视为一个 bug,因为应报告缺失的包。 #15071 - 在更新索引缓存失败时新增警告。 #15014
- 错误中不再使用“你是不是想说”。直接给出建议。 #15138
- 为依赖源中无效的 SSH URL 提供更好的错误消息。 #15185
- 当包没有给定特性时,建议类似的特性名称。 #15133
- 找不到工作空间成员时,打印 glob 模式。 #15093
- cargo-fix: 使
--allow-dirty隐含--allow-staged#15013 - cargo-login: 为准备弃用,在 CLI 帮助中隐藏
token参数。 #15057 - cargo-login: 使用不兼容的凭据提供程序时,不建议使用
cargo login。 #15124 - cargo-package: 通过 pathspec 匹配某些路径前缀,提高 VCS 状态检查的性能。 #14997
修复
rerun-if-env-changed构建脚本指令现在可以正确检测[env]配置表中的更改。 #14756- 为不支持的 crate 类型学习 Rust 目标信息时,强制将警告作为警告发出。 #15036
- cargo-package: 当符号链接指向当前包根目录之外的路径时,验证其 VCS 状态。 #14981
仅 Nightly 版本
- 🔥
-Zfeature-unification: 这个新的不稳定标志启用了resolver.feature-unification配置选项,用于控制特性如何在工作空间中统一。(RFC 3529) (文档) #15157 - cargo-util-schemas: 修正并更新 JSON Schema #15000
- cargo-util-schemas: 修复
[lints]JSON Schema #15035 - cargo-util-schemas: 修复 ‘metadata’ JSON Schema #15033
cargo rustc --print: 为cargo rustc --print设置 cargo 环境。 #15026-Zbuild-std: 将值解析为逗号分隔列表,并将此行为扩展到build-std-features。 #15065-Zgc: 使缓存跟踪能够应对意外文件。 #15147-Zscript: 合并从 manifest 路径创建 SourceId 的逻辑 #15172-Zscript: 将 cargo-script 逻辑集成到主解析器中 #15168-Zscript: 为 cargo-script 添加cargo pkgid支持 #14961-Zpackage-workspace: 报告所有无法发布的包 #15070
文档
- 文档说明 Cargo 从 1.46 版本起会自动注册
env!宏中使用的变量以触发重建。 #15062 - 将更新日志移至 The Cargo Book。 #15119 #15123 #15142
- 注意
package.authors已弃用。 #15068 - 修复 Package Id Specification 的语法错误。 #15049
- 修复关于 MSRV 的反转逻辑。 #15044
- cargo-metadata: 修复
"root"字段的描述。 #15182 - cargo-package: 注意 lockfile 始终包含在内。 #15067
- contrib: 开始编写 schema 设计指南。 #15037
内部
- 在 Solaris 上不使用
libc::LOCK_*。 #15143 - 清理字段 -> 环境变量处理。 #15008
- 简化 SourceID 的 Ord/Eq 实现。 #14980 #15103
- 为 SourceKind 添加手动 Hash impl 并记录原因。 #15029
- ci: 允许在 CI 中使用 Windows 保留名称。 #15135
- cargo-test-macro: 移除
RUSTUP_WINDOWS_PATH_ADD_BIN的条件限制。 #15017 - resolver: 简化回溯。 #15150
- resolver: 小型清理。 #15040
- test: 清理浅层 fetch 测试。 #15002
- test: 修复 macOS 上的
https::self_signed_should_fail测试。 #15016 - test: 修复 benchsuite 在较新 Git 版本下的问题。 #15069
- test: 修复 shared_std_dependency_rebuild 在 Windows 上运行时的问题。 #15111
- test: 更新测试以修复 nightly 版本中的错误。 #15110
- test: 移除未使用的
-C link-arg=-fuse-ld=lld#15097 - test: 使用
LazyLock移除unsafe#15096 - test: 移除不必要的 into 转换。 #15042
- test: 修复 panic_abort_tests 中的竞态条件。 #15169
- 更新 deny.toml #15164
- 更新依赖项。 #14995 #14996 #14998 #15012 #15018 #15041 #15050 #15121 #15128 #15129 #15162 #15163 #15165 #15166
Cargo 1.85 (2025-02-20)
新增
- 🎉 Cargo 现在支持 2024 edition。更多信息请参阅edition 指南。 #14828
- cargo-tree:
--depth标志现在接受workspace值,该值仅显示属于当前工作空间的依赖项。 #14928 - 构建脚本现在接收一个新的环境变量
CARGO_CFG_FEATURE,其中包含正在构建的包的每个已激活特性。 #14902 - perf: 由于
ActivationsKey使用了更高效的哈希算法,依赖项解析现在更快。 #14915
变更
- ❗️ cargo-rustc: 尾随标志现在具有更高的优先级。此行为自 1.83 版本起仅限 nightly 版本,现已稳定化。 #14900
- ❗️ Cargo 现在使用来自
rustc-stable-hash的跨平台哈希算法。因此,依赖项缓存路径(例如$CARGO_HOME/registry/index/index.crates.io-<hash>)的哈希部分将发生变化。这将触发注册表索引和.cratetar 包的重新下载,以及 Git 依赖项的重新克隆。 #14917 - 为 Cargo.toml 和 Cargo 配置中
cfg中的关键字新增了未来不兼容警告。此前错误地接受了带有cfg(true)和cfg(false)等关键字的cfg。为了向后兼容,引入了原始标识符的支持;例如,请改用cfg(r#true)。 #14671 - 依赖项解析现在提供更丰富的错误消息,解释了为什么某些版本被拒绝、不匹配或无效。
#14897 #14921 #14923 #14927 - cargo-doc: 当没有生成文档时使用
--open打开文档,改进了错误消息。 #14969 - cargo-package: 如果符号链接作为纯文本文件检出,则发出警告。 #14994
- cargo-package: 显示相对于 Git 工作目录的未暂存文件路径。 #14968 #14970
修复
- 设置
GIT_DIR,以确保在使用net.git-fetch-with-cli=true时与裸仓库兼容。 #14860 - 修复了修改工作空间 Cargo.toml 未使构建缓存失效的问题。 #14973
- 防止在
RUSTFLAGS更改后丢弃构建缓存。 #14830 #14898 - cargo-add: 规范化名称时,不选择 yanked 版本。 #14895
- cargo-fix: 将工作空间依赖项迁移到 2024 edition,也适用于虚拟 manifest。 #14890
- cargo-package: 当
package.readme和package.license-file指向当前包根目录之外的路径时,验证其 VCS 状态。 #14966 - cargo-package: 确保不会选取可能阻塞的非文件(如 FIFO)进行发布。 #14977
仅 Nightly 版本
path-bases: 支持虚拟 manifest 中[patch]的 bases。 #14931unit-graph: 使用配置的 shell 打印输出。 #14926-Zbuild-std: 通过探测目标 spec JSON 中的metadata.std字段,检查构建目标是否支持std。 #14183 #14938 #14899-Zbuild-std: 测试 proc-macros 时始终链接到 std。 #14850 #14861-Zbuild-std: 清理 build-std 测试。 #14943 #14933 #14896-Zbuild-std: 对 std 工作空间的相对路径进行哈希处理,而不是绝对路径。 #14951-Zpackage-workspace: 允许对未提升版本的工作空间进行空运行(dry-run)。 #14847-Zscript: 允许从 cargo 脚本添加/移除依赖项。 #14857-Zscript: 跨 edition 迁移 cargo 脚本 manifest。 #14864-Zscript: 不覆盖 release profile。 #14925-Ztrim-paths: 使用Path::push构造remap-path-prefix标志。 #14908
文档
- 阐明如何选择
cargo::metadata环境变量。 #14842 - cargo-info: 移除
cargo-info文档中对默认注册表的引用。 #14880 - contrib: 为 Rustup Cargo workaround 添加缺失参数。 #14954
- SemVer: 添加关于 RPIT capturing 的章节。 #14849
内部
- 在编译器更改之前,将
testcfg 添加为已知 cfg。 #14963 - 启用 triagebot 合并冲突通知。 #14972
- 将发布触发限制为
0.*标签。 #14940 - 简化
SourceID哈希。 #14800 - build-rs: 在访问 Cargo 为构建脚本执行设置的环境变量时,自动发出
rerun-if-env-changed。 #14911 - build-rs: 在 assert 中正确引用项。 #14913
- build-rs: 添加 ‘error’ 指令。 #14910
- build-rs: 移除无意义的 ‘cargo_cfg_debug_assertions’。 #14901
- cargo-package: 将
cargo_package拆分为模块。 #14959 #14982 - cargo-test-support:
requires属性接受命令的字符串字面量。 #14875 - cargo-test-support: 将 ‘exec_with_output’ 切换为 ‘run’。 #14848
- cargo-test-support: 为
.crate文件发布验证跟踪调用者。 #14992 - test: 直接验证
-Cmetadata,而不是通过-Cextra-filename。 #14846 - test: 确保 PGO 工作正常。 #14859 #14874 #14887
- 更新依赖项。 #14867 #14871 #14878 #14879 #14975
Cargo 1.84 (2025-01-09)
新增
- 🎉 稳定化解析器 v3,也称为 MSRV 感知的依赖解析器。稳定化内容包括 Cargo.toml 中的
package.resolver = "3"和 Cargo 配置中的[resolver]表。(RFC 3537) (manifest 文档) (配置文档) #14639 #14662 #14711 #14725 #14748 #14753 #14754 - 新增了一个构建脚本调用
cargo::error=MESSAGE用于报告错误消息。(文档) #14743
变更
- ❗️ cargo-publish: 发布 crate 时始终包含 Cargo.lock。最初,仅当包包含可执行文件或示例用于
cargo install时才包含。 #14815 - 依赖解析器性能改进,包括共享缓存、减少迭代开销以及移除冗余的 fetch 和克隆。 #14663 #14690 #14692 #14694
- 弃用
cargo verify-project。 #14736 - 依赖项解析期间找不到匹配包时,添加源替换信息。 #14715
- 找到
[patch.crates.io]时,提供使用crates-io的提示。 #14700 - 规范化 Cargo targets 的源路径以改善诊断。 #14497 #14750
- 允许注册表在索引元数据 JSON 中省略空/默认字段。出于向后兼容性考虑,crates.io 会继续发出这些字段。 #14838 #14839
- cargo-doc: 在 extra verbose 模式下显示环境变量。 #14812
- cargo-fix: 替换对重复的仅插入替换的特殊处理。 #14765 #14782
- cargo-remove: 找不到依赖项时,尝试建议其他名称类似的依赖项。 #14818
- git: 对于 Git 依赖项的全新检出,跳过不必要的 submodule 验证。 #14605
- git: 增强了找不到 refspec 时 fetching Git 依赖项的错误消息。 #14806
- git: 当
net.git-fetch-with-cli = true时,默认向 git CLI 传递--no-tags。 #14688
修复
- 修复了旧版本 Cargo 无法读取构建缓存中较新 dep-info 格式的问题。 #14751 #14745
- 修复了重建检测不遵从
[env]表更改的问题。 #14701 #14730 - cargo-fix: 为
rustfix添加了事务语义,以便在多个建议包含重叠 span 时保持代码修复处于有效状态。 #14747
仅 Nightly 版本
- 不稳定环境变量
CARGO_RUSTC_CURRENT_DIR已被移除。 #14799 - 🔥 Cargo 现在在源代码中包含了一个实验性的
Cargo.tomlJSON Schema 文件。这有助于外部工具验证或自动完成 manifest 的 schema。(manifest.schema.json) #14683 - 🔥
Zroot-dir: 一个新的不稳定标志-Zroot-dir,用于配置应从哪个路径调用 rustc。(文档) #14752 - 🔥
-Zwarnings: 一个新的不稳定特性,通过build.warnings配置字段控制 Cargo 如何处理警告。(文档) #14388 #14827 #14836 edition2024: 验证 2024 edition / resolver=3 不影响解析。 #14724native-completions: 在 zsh 中包含描述。 #14726-Zbindeps: 修复在带有交叉编译 bindep 的包上运行 cargo tree 时 panic 的问题。 #14593-Zbindeps: 下载 artifact deps 的目标平台对应的定向传递依赖项。 #14723-Zbuild-std: 移除对--target的要求。 #14317-Zpackage-workspace: 在cargo publish中支持包选择选项,例如--exclude。 #14659-Zscript: 移除接受Cargo.toml的支持。 #14670-Zscript: 将配置路径更改为仅检查CARGO_HOME。 #14749-Zscript: 更新 RFC 3503 的 frontmatter 解析器。 #14792
文档
- 阐明
--tests和--benches标志的含义。 #14675 - 阐明工具应仅将以
{开头的行作为 JSON 消息解释。 #14677 - 阐明
cargo package包含和不包含的内容。 #14684 - 文档说明官方外部命令:
cargo-clippy、cargo-fmt和cargo-miri。 #14669 #14805 - 增强环境变量文档。 #14676
- 简化文档中使用的英语。 #14825 #14829
- 新增一个关于弃用和移除命令的文档页面。 #14739
- cargo-test-support: 基于移植工作量文档说明
Execs断言。 #14793
内部
- 🎉 将
build-rscrate 作为 Cargo 团队的意向产物迁移到rust-lang/cargo仓库。 #14786 #14817 - 在 triagebot 中启用 transfer 功能。 #14777
- InternedString 需要时进行 clone-on-write。 #14808
- ci: 将 CI 从 bors 切换到合并队列。 #14718
- ci: 将
lint-docs作业设为必需。 #14797 - ci: 检查 clippy
correctness。 #14796 - ci: 对于 renovate,将 matchPackageNames 切换为 matchDepNames。 #14704
- fingerprint: 跟踪
UnitHash每次使用的意图。 #14826 - fingerprint: 向
rustc_fingerprint添加更多元数据。 #14761 - test: 将剩余的 snapshotting 迁移到 snapbox。 #14642 #14760 #14781 #14785 #14790
- 更新依赖项。 #14668 #14705 #14762 #14766 #14772
Cargo 1.83 (2024-11-28)
新增
--timingsHTML 输出现在可以根据浏览器偏好自动切换浅色和深色配色方案。 #14588- 引入了一个新的环境变量
CARGO_MANIFEST_PATH,类似于CARGO_MANIFEST_DIR但直接指向 manifest 文件。 #14404 - manifest: 新增
package.autolib,允许禁用[lib]自动发现。 #14591
变更
- ❗️ Lockfile 格式 v4 现在是创建/更新 lockfile 的默认格式。Rust toolchain 1.78+ 支持 lockfile v4。为了与早期 MSRV 兼容,请考虑将
package.rust-version设置为 1.82 或更早版本。 #14595 - ❗️ cargo-package: 使用
--package标志时,仅打包指定的包。此前,当前工作目录中的包会被自动选中进行打包。 #14488 - cargo-publish: 如果包版本已发布,现在会快速失败。 #14448
- 改进了缺失特性的错误消息。 #14436
- 如果未看到错误,记录
rustc调用失败的详细信息。 #14453 - 提升了
windows-gnullvm导入库,使其与windows-gnu对齐。 #14451 - 在
cargo search结果中建议cargo info命令。 #14537 - 增强了依赖项更新状态消息,现在以不同颜色显示更新(兼容、不兼容、直接依赖),并附带消息和 MSRV。 #14440 #14457 #14459 #14461 #14471 #14568
Locking状态消息不再显示工作空间成员。 #14445
修复
- 防止递归调用
cargo时出现重复的库搜索环境变量。 #14464 - 不再对
$CARGO_HOME/config没有.toml扩展名发出双重警告。 #14579 - 使用
--message-format json时,更正了诊断计数消息。 #14598 - cargo-add: 转换包名称时执行模糊搜索。 #13765
- cargo-new: 仅将新包自动添加到相对于 manifest 的工作空间中,而不是当前目录。 #14505
- cargo-rustc: 修复了
--crate-type标志中逗号分隔值的解析问题。 #14499 - cargo-vendor: 仅在 crate 版本来自注册表时才信任该版本。这导致 Git 依赖项即使没有更改也会被重新 vendor。 #14530
- cargo-publish: 在 dry-run 时,将版本已存在的错误降级为警告。 #14742 #14744
仅 Nightly 版本
- ❗️ cargo-rustc: 在 nightly 版本中,尾随标志具有更高的优先级。此 nightly 限制将在几个版本后移除。如果此行为破坏了任何工作流程,请提供反馈。提供了一个临时环境变量
__CARGO_RUSTC_ORIG_ARGS_PRIO=1来选择退出此行为。 #14587 - 🔥 cargo-install: 新增
--dry-run标志,但不实际安装二进制文件。 #14280 - 🔥
native-completions: 将手写的 shell 补全脚本迁移到 Rust 原生实现,使我们更容易添加、扩展和测试新的补全。(文档) #14493 #14531 #14532 #14533 #14534 #14535 #14536 #14546 #14547 #14548 #14552 #14557 #14558 #14563 #14564 #14573 #14590 #14592 #14653 #14656 - 🔥
-Zchecksum-freshness: 将 cargo 重建检测中使用的文件修改时间替换为文件校验和算法。这在 mtime 实现不佳或 CI/CD 系统中最为有用。(文档) #14137 - cargo-update: 添加
matches_prerelease语义。 #14305 build-plan: 文档说明其已被弃用。 #14657edition2024: 从 2024 edition 移除隐式特性移除。 #14630lockfile-path: 在cargo install上隐含--locked。 #14556open-namespaces: 允许在PackageIdSpec中使用开放命名空间。 #14467path-bases: 支持cargo [add|remove|update]命令。 #14427-Zmsrv-policy: 根据工作空间中 MSRV 数量最多的情况确定工作空间的 MSRV。 #14569-Zpackage-workspace: 允许在工作空间中发布多个 crate,即使它们之间存在相互依赖。(文档) #14433 #14496-Zpublic-dependency: 在cargo metadata中包含公共/私有依赖项状态。 #14504-Zpublic-dependency: 不要求提升 MSRV 版本。 #14507
文档
- 🎉 新增章节,介绍
package.rust-version(即 MSRV) 的用途、支持期望和管理。(文档) #14619 #14636 - 阐明
target.'cfg(...)'不尊重构建脚本中的 cfg。 #14312 - 阐明
[[bin]]target 自动发现可以包括src/main.rs和/或src/bin/中的文件。 #14515 - 消除 feature resolver v2 文档中 ‘target’ 用法的歧义。 #14540
- 使
--config <PATH>更醒目。 #14631 - 次要页面重新分组。 #14620
- contrib: 更新 Cargo 发布方式的文档。 #14539
- contrib: 在 Cargo Charter / crate 文档中声明每个 crate 的支持级别。 #14600
- contrib: 将新的 Intentional Artifacts 声明为 ‘small’ 更改。 #14599
内部
- 清理重复的 check-cfg lint 逻辑。 #14567
- 修复由于 nightly rustc 更改导致的省略生命周期问题。 #14487
- 改进了在
activated_features中找不到特性时的错误报告。 #14647 - cargo-info: 使用
shell.note打印 note。 #14554 - ci: 更新 CI 工具。 #14503 #14628
- perf: 可能时,对编译器消息进行零拷贝反序列化。 #14608
- resolver: 添加更多 SAT resolver 测试。 #14583 #14614
- test: 将更多测试迁移到 snapbox。 #14576 #14577
- 更新依赖项。 #14475 #14478 #14489 #14607 #14624 #14632
Cargo 1.82 (2024-10-17)
新增
变更
- ❗️ Doctest 通过将
--color传递给 rustdoc 调用来遵循 Cargo 的颜色选项。 #14425 - 改进了 Cargo.toml 中同时缺失
[package]和[workspace]时的错误消息。 #14261 - 为错误消息枚举
profile.*.debug的所有可能值。 #14413
修复
- 使用完整 gitoxide path-spec 模式。此前实现使用了简写 pathspec,可能会产生无效语法,例如 manifest 文件路径包含前导下划线
_时。 #14380 - cargo-package: 修复裸提交 Git 仓库上的失败问题。 #14359
- cargo-publish: 不从发送到注册表的 HTTP JSON 主体中剥离重命名依赖项的非 dev 特性。此 bug 仅影响第三方注册表。 #14325 #14327
- cargo-vendor: vendoring 时,不复制被排除的 Cargo targets 的源文件。 #14367
仅 Nightly 版本
- 🔥
lockfile-path: 新增--lockfile-path标志,允许指定 lockfile 的路径,而不是默认路径<workspace_root>/Cargo.lock。(文档) #14326 #14417 #14423 #14424 - 🔥
path-bases: 在 Cargo 配置文件中引入了路径“bases”表,可用于为 path dependencies 和 patch 条目前缀路径。(RFC 3529) (文档) #14360 - 🔥
-Zpackage-workspace: 增强了工作空间中 crate 之间存在依赖关系时cargo package --workspace的体验。工作空间中的 crate 不再要求发布到实际注册表。这是迈向支持cargo publish --workspace的一步。 #13947 #14408 #14340 - cargo-update: 将 pre-release 匹配语义限制为仅在
OptVersionReq::Req上使用。 #14412 edition2024: 撤销“fix: 确保 dep/feature 在 2024 edition 下激活依赖项”。 #14295update-breaking: 改进了当update --breaking具有无效 spec 时的错误消息。 #14279update-breaking: 使用--breaking更新时,不对 prereleaseVersionReq进行降级。 #14250-Zbuild-std: 移除创建虚拟 std 工作空间的 hack。 #14358 #14370-Zmsrv-policy: 调整 MSRV 解析配置字段名称/值。之前的占位符resolver.something-like-precedence现已重命名为resolver.incompatible-rust-versions。 #14296-Zmsrv-policy: 报告何时选择了不兼容 rust 版本的包。 #14401-Ztarget-applies-to-host: 修复了在使用 target-applies-to-host 和隐式 target 时传递 links-overrides 的问题。 #14205-Ztarget-applies-to-host:-Cmetadata包含 extra rustflags 是否与 host 相同的信息。 #14432-Ztrim-paths: rustdoc 支持 diagnostics 的 trim-paths。 #14389
文档
- 将
Workspace的注释转换为 doc 注释。 #14397 - 修复
workspace.package和workspace.dependencies的 MSRV 指示器。 #14400 - FAQ: 移除过时的 Cargo 离线使用章节。 #14336
内部
- 增强了
cargo-test-support的可用性和文档。 #14266 #14268 #14269 #14270 #14272 - 通过使用 Arc 而不是 Rc 使 summary 同步。 #14260
- 使用
Rc而不是Arc存储 rustflags。 #14273 - 移除对
--check-cfg支持的 rustc 探测。 #14302 - 将所有与 manifest 规范化相关的项中的 ‘resolved’ 重命名为 ‘normalized’。 #14342
- cargo-util-schemas: 新增
TomlPackage::new,以及TomlWorkspace的Default实现。 #14271 - ci: 将 macos aarch64 切换到 nightly。 #14382
- mdman: 渲染选项时规范化换行符。 #14428
- perf: 在无操作的
source_id::with*中不调用 wrap。 #14318 - test: 将更多测试迁移到 snapbox。 #14242 #14244 #14293 #14297 #14319 #14402 #14410
- test: 不依赖于
RUST_BACKTRACE的缺失。 #14441 - test: 在 AIX 上使用 gmake。 #14323
- 更新到
gix0.64.0。 #14332 - 更新到
rusqlite0.32.0。 #14334 - 更新到
windows-sys0.59。 #14335 - 更新依赖项。 #14299 #14303 #14324 #14329 #14331 #14391
Cargo 1.81 (2024-09-05)
新增
变更
- ❗️ cargo-package: 打包时禁止
package.license-file和package.readme指向不存在的文件。 #13921 - ❗️ cargo-package: 生成的
.cargo_vcs_info.json始终包含在内,即使传递了--allow-dirty。 #13960 - ❗️ 禁止同时传递
--release/--debug标志和--profile标志。 #13971 - ❗️ 移除 Cargo.toml 中对
lib.plugin键的支持。Rust 插件支持已弃用四年,并在 1.75.0 版本中移除。 #13902 #14038 - 使 rustc 的
-Cmetadata计算在不同平台上保持一致。 #14107 - 即使 MSRV 未设置,当
edition未设置时也发出警告。 #14110
修复
- 修复依赖项中的 proc-macro 示例影响特性解析的问题。 #13892
- 不因使用 ‘..’ 导致的重复包发出警告。 #14234
- 加载每个 Git 源时不再执行
du命令。 #14252 - 不对未引用的重复包发出警告。 #14239
- cargo-publish: 不从发送到注册表的 HTTP JSON 主体中剥离重命名依赖项的非 dev 特性。此 bug 仅影响第三方注册表。 #14328
- cargo-vendor: vendoring 时,不复制被排除的 Cargo targets 的源文件。 #14368
仅 Nightly 版本
- 🔥
update-breaking: 为cargo update添加--breaking标志,允许将依赖项升级到 breaking 版本。文档 #13979 #14047 #14049 --artifact-dir: 将--out-dir重命名为--artifact-dir。--out-dir标志为了兼容性保留,特性稳定化后可能移除。 #13809edition2024: 确保未使用的可选依赖项对 shadowed 依赖项触发。 #14028edition2024: 解决隐式 -> 显式特性迁移中的问题。 #14018-Zcargo-lints: 将unknown_lints添加到 lints 列表。 #14024-Zcargo-lints: 添加工具以文档说明 lints。 #14025-Zcargo-lints: 保持 lints 更新和排序。 #14030-Zconfig-include: 允许在 config 中启用config-include特性。 #14196-Zpublic-dependency: 从 resolver 中移除一些旧的公共依赖项代码。 #14090-Ztarget-applies-to-host: 使用 target-applies-to-host 时,将 rustflags 传递给使用隐式 targets 构建的 artifacts。 #13900 #14201- cargo-update: 跟踪
--precise <prerelease>的行为。 #14013
文档
- 阐明
CARGO_CFG_TARGET_FAMILY是多值。 #14165 - 文档说明
CARGO_CFG_TARGET_ABI。 #14164 - 文档说明每个 manifest 字段和构建脚本调用的 MSRV。 #14224
- 移除重复的
strip章节。 #14146 - 更新 Cargo 配置摘要以包含缺失的键。 #14145
- 更新 Cargo 文档索引。 #14228
- 不再提及不存在的
workspace.badges字段。 #14042 - contrib: 建议使用原子提交,并分开测试提交。 #14014
- contrib: 文档说明如何为 Cargo 编写 RFC。 #14222
- contrib: 改进 triage 指南。 #14052
内部
- cargo-package: 更改打包时的验证顺序。 #14074
- ci: 添加自动发布 Cargo 的工作流程。 #14202
- ci: 更新 CI 工具。 #14062 #14257
- registry: 添加本地注册表覆盖。 #13926
- registry: 将
get_source_id移出 registry。 #14218 - resolver: 简化检查依赖循环。 #14089
- rustfix: 添加
CodeFix::apply_solution并实现Clone。 #14092 - source: 清理
PathSource/RecursivePathSource拆分后的代码。 #14169 #14231 - 移除临时环境变量
__CARGO_GITOXIDE_DISABLE_LIST_FILES。 #14036 - 简化特性语法检查。 #14106
- 在热路径中不创建新的常量
InternedString。 #14211 - 使用
std::fs::absolute而不是重新实现它。 #14075 - 移除 cargo 中不必要的特性激活。 #14122 #14160
- 撤销 #13630,因为 rustc 在 MSVC 上忽略
-C strip。 #14061 - test: 在
user_specific_cfgs测试中允许unexpected_builtin_cfgslint。 #14153 - test: 将 cargo_test 添加到 test-support prelude。 #14243
- test: 将 Cargo 测试套件迁移到
snapbox。完整的迁移 pull request 列表请参阅#14039。 - 更新到
gix0.64.0。 #14431 - 更新依赖项。 #13995 #13998 #14037 #14063 #14067 #14174 #14186 #14254
Cargo 1.80 (2024-07-25)
新增
-
🎉 稳定化
-Zcheck-cfg!这默认启用了 rustc 在编译时检查条件编译的功能,验证 crate 是否正确处理了不同目标平台或特性的条件编译。Cargo 内部会将新的命令行选项--check-cfg传递给所有 rustc 和 rustdoc 调用。随着此次稳定化,新增了一个构建脚本调用
cargo::rustc-check-cfg=CHECK_CFG,作为将自定义 cfg 添加到预期 cfg 名称和值列表的方式。如果您的包无法使用构建脚本,Cargo 提供了一个配置
[lints.rust.unexpected_cfgs.check-cfg]以静态添加已知的自定义 cfg。(RFC 3013) (文档) #13571 #13865 #13869 #13884 #13913 #13937 #13958
-
🎉 cargo-update: 允许
--precise指定包的 yanked 版本,并相应地更新 lockfile。 #13974
变更
- ❗️ manifest: 禁止
[badges]继承自[workspace.package.badges]。这被认为是一个 bug。请注意[badges]实际上已弃用。 #13788 - build-script: 根据 MSRV 建议旧语法。 #13874
- cargo-add: 通过使用字符串字面量避免转义双引号。 #14006
- cargo-clean: 通过
-p标志清理特定包的性能改进。 #13818 - cargo-new: 在库模板中,使用
i32而不是usize作为“默认整数类型”。 #13939 - cargo-package: 如果打包时排除了某个 Cargo target,则发出警告而不是失败。 #13713
- manifest: 对于
[lints]表中不支持的 lint 工具,发出警告而不是报错。 #13833 - perf: 在已知 Cargo targets 时避免推断。 #13849
- 从 Rust 源 tarball 构建 Cargo 时填充 Git 信息。 #13832
- 改进从部分环境变量反序列化 Cargo 配置时的错误消息。 #13956
修复
- resolver: 使同名 path dependencies 保持锁定。 #13572
- cargo-add: 在 Unix 上执行
write_atomic期间保留文件权限。 #13898 - cargo-clean: 在 Windows 上移除符号链接目录。 #13910
- cargo-fix: 不修复到标准库中。 #13792
- cargo-fix: 支持纯 IPv6 网络。 #13907
- cargo-new: 当根目录中存在普通包时,不说正在添加到工作空间。 #13987
- cargo-vendor: 静默关于忘记 vendoring 的警告。 #13886
- cargo-publish/cargo-vendor: 确保生成的 Cargo.toml 中的 targets 具有确定性顺序。 #13989 #14004
- cargo-credential-libsecret: 通过其
SONAMElibsecret-1.so.0加载libsecret。 #13927 - 当 alias 不包含子命令时,不发生 panic。 #13819
- 解决 macOS ZFS 上复制文件返回 EAGAIN 的问题。 #13845
- 即使 GitHub 快路径失败,也 fetch 指定的 commits。 #13946 #13969
- 区分 Cargo config 和共享相同前缀的不同环境变量。 #14000
仅 Nightly 版本
-Zcargo-lints: 不总是继承工作空间 lints。 #13812-Zcargo-lints: 添加一个测试以确保 cap-lints 工作正常。 #13829-Zcargo-lints: 当指定了不稳定 lints 但未启用时报错。 #13805-Zcargo-lints: 将 cargo-lints 添加到不稳定特性文档。 #13881-Zcargo-lints: 重构 cargo lint 测试。 #13880-Zcargo-lints: 移除在 lint 名称中指定-的能力。 #13837-Zscript: 移除 cargo 脚本中不稳定且已拒绝的 frontmatter 语法。现在唯一允许的 frontmatter 语法是---。 #13861 #13893-Zbindeps: 当有多个类型可用时,仅构建指定的 artifact 库。 #13842-Zmsrv-policy: 将未设置的 MSRV 视为兼容。 #13791-Zgit/-Zgitoxide: 默认配置从环境变量和 Cargo 配置中获取。 #13687-Zpublic-dependency: 继承依赖项时,不丢失 ‘public’ 属性。 #13836edition2024: 继承时禁止忽略default-features。 #13839edition2024: 为 bin 目标验证 crate-types/proc-macro,与其他 Cargo targets 类似。 #13841
文档
- cargo-package: 阐明不保证 VCS 来源。 #13984
- cargo-metadata: 阐明 Cargo target 名称中的 dash 替换规则。 #13887
- config: 修复构建脚本 overrides 中
rustc-flags的错误类型。 #13957 - resolver: 为
resolver-tests添加 README。 #13977 - contrib: 更新 contributor guide 中的 UI 示例代码。 #13864
- 修复 libcurl 代理文档链接。 #13990
- 为插件添加缺失的
CARGO_MAKEFLAGS环境变量。 #13872 - 在 Continuous Integration 章节中包含 CircleCI 参考。 #13850
内部
- ci: 不对 beta channel 检查
cargo。 #13827 - test: 为 apache 容器中的 Git 仓库设置 safe.directory。 #13920
- test: 静默运行内嵌 unittests 的警告。 #13929
- test: 由于 nightly rustc 更改,更新测试格式。 #13890 #13901 #13964
- test: 使
git::use_the_cli测试真正独立于区域设置(locale)。 #13935 - cargo-test-support: 将直接断言从 cargo-test-support 迁移到 snapbox。 #13980
- cargo-test-support: 自动编辑已用时间。 #13973
- cargo-test-support: 清理不必要的
match_exact用法。 #13879 - 将
RecursivePathSource从PathSource中拆分出来。 #13993 - 调整由于 libgit2 1.8 更改导致的 cert-check 自定义错误。 #13970
- 将诊断打印移至 Shell。 #13813
- 更新依赖项。#13834 #13840 #13948 #13963 #13976
Cargo 1.79 (2024-06-13)
新增
- 🎉
cargo add在添加新依赖项时会遵循package.rust-version,也称为 MSRV。此行为可以通过指定版本要求或传递--ignore-rust-version标志来覆盖。(RFC 3537) #13608 - 新的
Locking状态消息会在任何命令中显示依赖项变更。对于cargo update,它还会告知您是否有任何依赖项版本已过时。#13561 #13647 #13651 #13657 #13759 #13764
变更
- ❗️
RUSTC_WRAPPER、RUSTC_WORKSPACE_WRAPPER以及来自[env]表的变量现在也适用于 Cargo 用于探测 rustc 信息的初始rustc -vV调用。#13659 - ❗️ 将诸如
foo = { optional = true }这样带有警告的version="*"依赖项变为错误。这种行为从一开始就被视为 bug。#13775 - ❗️ 即使
lib.name是从package.name推断出来的,也会将短划线替换为下划线。此更改与文档中的行为一致。需要注意的是,Cargo 发出的 JSON 消息(例如通过cargo metadata或--message-format=json)将开始报告带有下划线的库名称。#12783 - 切换到
gitoxide来列出文件。这提高了构建脚本和cargo doc在计算缓存新鲜度方面的性能,同时也修复了cargo publish的一些细微 bug。#13592 #13696 #13704 #13777 - 当传递
-Zlints且不再需要时发出警告。#13632 - 对虚拟工作空间中未使用的
workspace.dependencies键发出警告。#13664 - 仅当 MSRV 不兼容时才发出 1.77 构建脚本语法错误。#13808
- 不对
lints.rust.unexpected_cfgs.check-cfg发出警告。#13925 - cargo-init:如果
Cargo.toml中的target.name值可以推断,则不为其赋值。#13606 - cargo-package:规范化
Cargo.toml中的路径,包括将\替换为/。#13729 - cargo-test:将 cargo test 的
--doc标志重新归类到“目标选择”下。#13756
修复
- 确保
--config net.git-fetch-with-cli=true被遵守。#13992 #13997 - 解析空别名时不会发生 panic。#13613
- 使用
--target时,默认的 debuginfo strip 规则也适用。请注意,在 Windows MSVC 上,Cargo 不再默认进行 strip 操作。#13618 - 不会在指向多字节字符的 Cargo.toml 解析错误时崩溃。#13780
- 如果
.cargo/{config,config.toml}中的一个是指向另一个的符号链接,则不发出弃用警告。#13793 - 检查 GitHub 上的仓库是否最新时遵循 HTTP 重定向。#13718
- 在
nounset模式下 Bash 补全的 fallback。#13686 - 当 rustflags 改变且传递了
--target时重新运行构建脚本。#13560 - 修复推断名称中带有短划线的 lib/bin 的文档冲突。#13640
- cargo-add:保持依赖项功能的排序。#13682
- cargo-add:更新简单依赖项时保留注释。#13655
- cargo-fix:不重复应用相同的建议。#13728
- cargo-package:当通过
--package指定的包找不到时报错。#13735 - credential-provider:修剪来自 stdin 的令牌中的换行符。#13770
仅 Nightly 版本
- 🔥 cargo-update:允许
--precise指定包的预发布版本 (RFC 3493) (文档)。#13626 - RFC 3491:清理未使用的依赖项。#13778
-Zcargo-lints:为 Cargo 添加基本的 linting 系统。此功能仍在开发中,尚未普遍可用。#13621 #13635 #13797 #13740 #13801 #13852 #13853- 🔥
edition2024:将 Edition2024 添加到解析器 v3(MSRV 感知解析器)的默认设置中。#13785 edition2024:在 2024 版本中移除下划线字段支持。#13783 #13798 #13800 #13804edition2024:在 Edition 2024 中对[project]报错。#13747-Zmsrv-policy:遵循 ‘–ignore-rust-version’。#13738-Zmsrv-policy:为 update/generate-lockfile 添加--ignore-rust-version标志。#13741 #13742-Zmsrv-policy:将 MSRV 感知解析器置于配置项之后。#13769-Zmsrv-policy:对于 rust-version ‘x’ 报错,而不是 panic。#13771-Zmsrv-policy:对于 MSRV 解析回退到 ‘rustc -V’。#13743-Zmsrv-policy:添加 v3 解析器用于 MSRV 感知解析。#13776-Zmsrv-policy:对于非本地安装不遵循 MSRV。#13790-Zmsrv-policy:跟踪 MSRV 是否被显式设置。#13732- 测试:不压缩测试 registry 中的 crate。#13744
文档
- 阐明
--locked确保 Cargo 使用 lockfile 中的依赖项版本。#13665 - 阐明
RUSTC_WORKSPACE_WRAPPER和RUSTC_WRAPPER的优先级。#13648 - 阐明只有根目录下的 Cargo.toml 才允许存在
[workspace]部分。#13753 - 阐明虚拟清单和实际清单之间的区别。#13794
内部
- 🎉 新增成员 crate
cargo-test-support和cargo-test-macro!它们设计用于测试 Cargo 本身,因此不保证跨版本稳定性。此 crate 在 crates.io 上的发布与其他成员 crate 相同。它们遵循 Rust 的 6 周发布流程。#13418 - 由于 crates.io CDN 变更修复发布脚本。#13614
- 将诊断复杂性推到 annotate-snippets 上。#13619
- cargo-package:简化获取已发布清单。#13666
- ci:将 macOS 镜像更新到 macos-13。#13685
- 清单:拆分出一个明确的步骤来解析
Cargo.toml。#13693 - 清单:将目标发现与目标创建解耦。#13701
- 清单:暴露 VirtualManifests 的源/跨度信息。#13603
- 更新依赖项。#13609 #13674 #13675 #13679 #13680 #13692 #13731 #13760 #13950
Cargo 1.78 (2024-05-02)
新增
- 稳定全局缓存数据跟踪。
-Zgc标志仍然不稳定。这仅用于 Cargo 开始收集数据,以便当自动 gc 稳定后,不太可能出现缓存未命中。#13492 #13467 - 稳定 lockfile 格式 v4。lockfile v3 仍是默认版本。#12852
- 自动检测是否可以使用非 ASCII Unicode 字符渲染输出。添加了一个配置值
term.unicode来手动控制此行为。(文档)#13337 - 在 Cargo 配置中支持
target.<triple>.rustdocflags。(文档)#13197
变更
- cargo-add:创建依赖项功能时打印状态信息。#13434
- cargo-add:改进从替换源添加包时的错误消息。#13281
- cargo-doc:在没有
--verbose时折叠Generated状态信息。#13557 - cargo-new:打印‘正在创建’而不是‘已创建’状态信息。#13367
- cargo-new:打印备注而不是注释以提供更多信息。#13371
- cargo-new:向工作空间添加成员时打印提示。#13411
- cargo-test:建议为 libtest 参数使用
--。#13448 - cargo-update:告知用户某些依赖项仍落后于最新版本。#13372
- 弃用无扩展名的
.cargo/config文件。#13349 - 默认情况下失败时不打印 rustdoc 命令行。#13387
- 生成新 lockfile 时遵循
package.rust-version。#12861 - 与远程 registry 通信时发送
User-Agent: cargo/1.2.3头。之前是cargo 1.2.3,不符合 HTTP 规范。#13548 - 当
Cargo.toml中缺少package.edition字段时发出警告。#13499 #13504 #13505 #13533 - 从解析虚拟清单中发出警告。#13589
- 在收集工作空间成员时的错误消息中提及工作空间根目录的位置。#13480
- 阐明
Finished状态消息中使用的 profile。#13422 - 将更多备注/警告切换为小写。#13410
- 报告所有与
package.rust-version不兼容的包,而不仅仅是随机的一个。#13514
修复
- cargo-add:如果 Cargo.toml 中没有现有的工作空间,则不将新包添加到
workspace.members。#13391 - cargo-add:修复 cargo-add 中的 markdown 换行。#13400
- cargo-run:使用 Package ID Spec 匹配包。#13335
- cargo-doc:doctest 在构建脚本输出中搜索原生库。#13490
- cargo-publish:发布时也从 Cargo.toml 中移除 dev-dependencies 的功能。#13518
- 通过
cargo add/rm/init/new编辑 TOML 时不重复注释。#13402 - 修复稀疏索引替换源的令人困惑的错误消息。#13433
- 在 ‘–list’ 和 ‘-Zhelp’ 中尊重
CARGO_TERM_COLOR。#13479 - 通过
CARGO_TERM_COLOR控制 clap 的错误和帮助文本的颜色。#13463 - 不会在 Cargo.toml 中出现空 spans 时 panic。#13375 #13376
仅 Nightly 版本
- 🔥 cargo-update:允许
--precise指定包的 yanked 版本。#13333 -Zcheck-cfg:将docsrscfg 添加为众所周知的--check-cfg。#13383-Zcheck-cfg:静默忽略cargo::rustc-check-cfg,以避免在稳定-Zcheck-cfg时出现 MSRV 烦恼。#13438-Zmsrv-policy:未设置 MSRV 时回退到rustc -v。#13516-Zscript:改进与 cargo script 相关的错误。#13346-Zpanic-abort-tests:也适用于 doctest。#13388-Zpublic-dependency:支持通过-Zpublic-dependency标志启用。#13340 #13556 #13547-Zpublic-dependency:测试打包公共依赖项。#13536-Zrustdoc-map:为doc.extern-map选项递归添加所有单元的子项。#13481 #13544edition2024:为 2024 版本启用 edition 迁移。#13429open-namespaces:对开放命名空间的基本支持 (RFC 3243) (文档)。#13591
文档
- cargo-fetch:在
--offlineman 页面中隐藏cargo-fetch递归链接。#13364 - cargo-install:
--list选项描述以大写开头。#13344 - cargo-vendor:阐明 vendored 源是只读的以及修改它们的方式。#13512
- 构建脚本:阐明通过
cargo::metadata=KEY=VALUE设置构建脚本元数据。#13436 - 阐明
Cargo.toml中[package]部分的version字段是可选的。#13390 - 改进“Registry Authentication”文档。#13351
- 改进“Specifying Dependencies”文档。#13341
- 从“发布前”列表中移除
package.documentation。#13398
内部
- 🎉 集成 tracing-chrome 作为 Cargo 本身的基本性能分析器。(文档)#13399 #13551
- 更新到
gix0.58.0。#13380 - 更新到
git20.18.2。#13412 - 更新到
jobserver0.1.28。#13419 - 更新到
supports-hyperlinks3.0.0。#13511 - 更新到
rusqlite0.31.0。#13510 - bump-check:比较源代码时使用对称差分。#13581
- bump-check:包含 rustfix 和 cargo-util-schemas。#13421
- ci:启用 m1 runner。#13377
- ci:确保在使用
cargo-hack进行 MSRV 测试期间遵循 lockfile。#13523 - cargo-util-schemas:通过
RustVersion::is_compatible_with一致地比较 MSRV。#13537 - console:使用新的高级
anstyleAPI。#13368 #13562 - fingerprint:移除
Freshness::Dirty中不必要的 Option。#13361 - fingerprint:将
std::fs从磁盘索引缓存中抽象出来。#13515 - mdman:更新到
pulldown-cmark0.10.0。#13517 - 重构:将
Config重命名为GlobalContext。#13409 #13486 #13506 - 重构:移除未使用的
sysroot_host_libdir。#13468 - 重构:向 Manifest 暴露 source/spans 以发出 lints。#13593
- 重构:扁平化清单解析。#13589
- 重构:使 lockfile diffing/printing 更具可重用性。#13564
- 测试:更新到
snapbox0.5.0。#13441 - 测试:通过 snapbox 的
term-svg功能验证终端样式。#13461 #13465 #13520 - 测试:确保
nonzero_exit_code测试不受开发者RUST_BACKTRACE设置的影响。#13385 - 测试:添加使用 worktree 的测试。#13567
- 测试:修复 old_cargos 测试。#13435
- 测试:修复由于 rust-lang/rust 更改导致的测试。#13362 #13382 #13415 #13424 #13444 #13455 #13464 #13466 #13469
- 测试:禁用 lldb 测试,因为它在 macOS 上运行需要权限。#13416
Cargo 1.77.1 (2024-03-28)
修复
- 对于 Windows MSVC 目标,默认不再 strip debuginfo。这导致了 1.77.0 版本中意外的回归,破坏了 backtrace。#13654
Cargo 1.77 (2024-03-21)
新增
- 🎉 将包标识符格式稳定为 Package ID Spec。此格式可用于 Cargo 的大多数命令,包括
--package/-p标志、cargo pkgid、cargo metadata以及来自--message-format=json的 JSON 消息。#12914 #13202 #13311 #13298 #13322 - 为
-Zhelp控制台输出添加颜色。#13269 - 构建脚本:使用
cargo::扩展构建指令语法。#12201 #13212
变更
- 🎉 禁用 debuginfo 现在意味着
strip = "debuginfo"(当未设置strip时),以剥离来自标准库的预先存在的 debuginfo,从而显著减小 release 二进制文件的默认大小(在 Linux x64 上 helloworld 从约 4.5 MiB 减小到约 450 KiB)。#13257 - 为清单解析添加
rustc风格的错误。#13172 - 弃用 Cargo 中的 rustc 插件支持。#13248
- cargo-vendor:在 vendoring 时持有 mutate 独占锁。#12509
- crates-io:仅对带有请求体 payload 的请求设置
Content-Type: application/json。#13264
修复
- jobserver:为所有类型的 runner 从环境中继承 jobserver。#12776
- 构建脚本:为所有带有构建脚本的单元设置
OUT_DIR。#13204 - cargo-add:从包含多个包的 Git 仓库中查找带有指定功能的正确包。#13213
- cargo-fix:始终继承 jobserver。#13225
- cargo-fix:减少调用 rustc 的次数以提高性能。#13243
- cargo-new:仅在新包是成员时继承工作空间 package 表。#13261
- cargo-update:
--precise接受任意 git 修订版本。#13250 - 清单:为 lints 表提供未使用的键警告。#13262
- rustfix:支持插入新行。#13226
仅 Nightly 版本
- 🔥
-Zgit:在一个不稳定的标志后实现浅层 libgit2 fetch。(文档)#13252 - 🔥 为
cargo rustdoc添加不稳定的--output-format选项,为工具提供一种依赖 rustdoc 实验性 JSON 格式的方式。(文档)#12252 #13284 #13325 -Zcheck-cfg:重写--check-cfg生成注释。#13195-Zcheck-cfg:在未声明功能时回退到传递空的values()。#13316-Zprecise-pre-release:标志已添加但尚未实现。#13296 #13320-Zpublic-dependency:支持发布带有public字段的包。#13245-Zpublic-dependency:cargo add的--public/--no-public标志的帮助文本。#13272-Zscript:添加 prefix-char frontmatter 语法支持。#13247-Zscript:添加多种实验性清单语法。#13241-Ztrim-paths:仅重新映射公共前缀。#13210
文档
- 添加了关于在清单中设置 homepage 的指导。#13293
- 阐明了如何查找自定义子命令。#13203
- 阐明了
du函数为何使用 mutex。#13273 - 突出显示了“如何查找依赖项上启用的功能”。#13305
- 删除了关于 license 中不支持括号的句子。#13292
- 解析器:阐明在依赖项解析中如何处理预发布版本。#13286
- cargo-test:阐明测试选项的目标选择。#13236
- cargo-install:阐明
--path是安装源而不是目标。#13205 - 贡献:修复团队 HackMD 链接。#13237
- 贡献:突出显示非阻塞功能门控技术。#13307
内部
- 🎉 新增成员 crate
cargo-util-schemas!此 crate 包含低级 Cargo schema 类型,重点关注用于读取文件和解析命令行的serde和FromStr。任何从这些类型获取最终语义的逻辑可能需要其他工具来处理,例如cargo metadata。此 crate 在 crates.io 上的发布与其他成员 crate 相同。它遵循 Rust 的 6 周发布流程。#13178 #13185 #13186 #13209 #13267 - 更新到
gix0.57.1。#13230 - cargo-fix:移除
cargo fix中的 error-format 特殊情况。#13224 - cargo-credential:版本升级到 0.4.3。#13221
- mdman:更新到
handlebars5.0.0。#13168 #13249 - rustfix:移除无用的 clippy 规则并修复一个拼写错误。#13182
- ci:修复 Dependabot 的 MSRV 自动更新。#13265 #13324 #13268
- ci:添加依赖项仪表板。#13255
- ci:更新 alpine docker 标签到 v3.19。#13228
- ci:改进 GitHub Actions CI 配置。#13317
- 解析器:在对空摘要进行排序时不会 panic。#13287
Cargo 1.76 (2024-02-08)
新增
- 为用于 Windows MSVC 的内置
cargo.exe添加了 Windows 应用程序清单文件。#13131
重要变更- 声明与 Windows 7、8、8.1、10 和 11 版本的兼容性。
- 将代码页设置为 UTF-8。
- 启用长路径支持。
- 为
cargo --list添加了颜色输出。#12992 - cargo-add:
--optional <dep>将创建一个<dep> = "dep:<dep>"功能。#13071 - 扩展 Package ID spec 以支持无歧义的 spec。(文档)#12933
具体来说,- 支持
git+和path+方案。 - 支持 Git ref 查询字符串,例如
?branch=dev或?tag=1.69.0。
- 支持
变更
- ❗️ 禁止在虚拟工作空间中使用
[lints],因为它们会被忽略,并且用户可能指的是[workspace.lints]。这是初始实现中的疏忽(例如,[dependencies]会产生相同的错误)。#13155 - 在 Package ID spec 和
cargo new等多个地方禁止使用空名称。#13152 - 遵循
rust-lang/rust的omit-git-hash选项。#12968 - 即使只有一个错误,也会显示带有数字的错误计数。#12484
all-static功能现在包含vendored-libgit2。#13134- crates-io:与 registry 交互时添加对其他 2xx HTTP 状态码的支持。#13158 #13160
- home:将 SHGetFolderPathW 替换为 SHGetKnownFolderPath。#13173
修复
- 在 wincon 上打印带颜色的 rustc 消息。#13140
- 修复了在包含空格的目录中的 bash 补全问题。#13126
- 修复了在 Windows 上卸载正在运行的二进制文件失败的问题。#13053 #13099
- 修复了重复链接的错误消息。#12973
- 修复了
--quiet与嵌套子命令一起使用的问题。#12959 - 修复了 dev-dependencies 中存在循环时发生的 panic 问题。#12977
- 解析 rustc commit-hash 失败时不会 panic。#12963 #12965
- 更新工作空间成员时不进行 git fetch。#12975
- 如果 CACHEDIR.TAG 已存在,则避免写入。#13132
- 如果
--package标志中的?是有效的 pkgid spec,则接受它。#13315 #13318 - cargo-package:仅当
target目录位于包根目录时才过滤掉它。#12944 - cargo-package:当构建脚本不存在或位于包根目录之外时报错。#12995
- cargo-credential-1password:为
op signin命令添加缺失的--account参数。#12985 #12986
仅 Nightly 版本
- 🔥
-Zgc标志启用垃圾回收,用于删除 Cargo 缓存中旧的、未使用的文件。即CARGO_HOME目录下的下载源文件和 registry 索引。(文档)#12634 #12958 #12981 #13055 - 🔥 添加了一个新的环境变量
CARGO_RUSTC_CURRENT_DIR。这是调用 rustc 的路径。(文档)#12996 -Zcheck-cfg:为-Zcheck-cfg的 fingerprint 中包含已声明的功能列表。#13012-Zcheck-cfg:修复没有功能的--check-cfg调用。#13011-Ztrim-paths:为-Zbuild-std重新排序--remap-path-prefix标志。#13065-Ztrim-paths:使用.显式重新映射当前目录。#13114-Ztrim-paths:使用真实调试器进行测试。#13091 #13118-Zpublic-dependency:将exported-private-dependencieslints 限制在库中。#13135-Zpublic-dependency:禁止工作空间继承依赖项的公共状态。#13125-Zpublic-dependency:为cargo add添加--public。#13046-Zpublic-dependency:移除未使用的公共依赖项错误处理。#13036-Zmsrv-policy:优先考虑 MSRV,而不是忽略不兼容。#12950-Zmsrv-policy:在 MSRV 解析器中降低无 rust-version 的优先级。#13066-Zrustdoc-scrape-examples:抓取文档示例时不对工作空间成员进行过滤。#13077
文档
- 推荐更广泛的选择支持 libsecret 的密码管理器。#12993
- 阐明了不同的 target 具有不同的
CARGO_CFG_*值集合。#13069 - 阐明了
[lints]表仅影响当前包的本地开发。#12976 - 阐明了
cargo search可以在其他 registry 中搜索。#12962 - 添加了用于验证
rust-version(MSRV) 字段的常见 CI 实践。#13056 - 添加了指向 rustc lint 级别文档的链接。#12990
- 从相关工作空间表添加了指向包 lint 表的链接。#13057
- 贡献:向贡献文档添加更多资源。#13008
- 贡献:更新 credential crate 的发布方式。#13006
- 贡献:移除评审能力通知。#13070
内部
- 🎉 将
rustfixcrate 迁移到rust-lang/cargo仓库。#13005 #13042 #13047 #13048 #13050 - 更新到
curl-sys0.4.70,对应 curl 8.4.0。#13147 - 更新到
gix-index0.27.1。#13148 - 更新到
itertools0.12.0。#13086 - 更新到
rusqlite0.30.0。#13087 - 更新到
toml_edit0.21.0。#13088 - 更新到
windows-sys0.52.0。#13089 - 更新到
tracing0.1.37 以兼容 rustc_log。#13239 #13242 - 由于更新到
gix-config,重新启用不稳定的 gitoxide auth 测试。#13117 #13129 #13130 - Cargo 内部使用
-Zlints表功能进行测试。#12178 - 重构了
Cargo.toml解析代码,为提取官方 schema API 做准备。 #12954 #12960 #12961 #12971 #13000 #13021 #13080 #13097 #13123 #13128 #13154 #13166 - 在
query{_vec}函数中使用IndexSummary。 #12970 - CI:迁移 Renovate 配置。 #13106
- CI:始终一起更新 gix 包。 #13093
- CI:尽早捕获对 AtomicU64 的简单使用。 #12988
- xtask-bump-check:不检查
home与 beta/stable 分支的兼容性。 #13167 - cargo-test-support:处理 JSON 诊断中的 $message_type。 #13016
- cargo-test-support:为注册表测试支持添加更多选项。 #13085
- cargo-test-support:在默认的 Cargo.toml 文件中添加特性(features)。 #12997
- cargo-test-support:修复 clippy-wrapper 测试中的竞争条件。 #12999
- test:不依赖 mtime 测试更改。 #13143
- test:移除
optionals测试中不必要的包和版本。 #13108 - test:从测试中移除已删除的特性
test_2018_feature。 #13156 - test:在某些测试中移除 jobserver 环境变量。 #13072
- test:修复一个 rustflags 测试中使用了错误的 buildfile 名称的问题。 #12987
- test:修复某些测试输出验证的问题。 #12982
- test:在 windows-gnu 上忽略 changing_spec_relearns_crate_types 测试。 #12972
Cargo 1.75 (2023-12-28)
新增
Cargo.toml中的package.version字段现在是可选的,默认值为0.0.0。没有package.version字段的包不能发布。 #12786- 在支持的终端上,
--timings和cargo doc输出中的链接可以点击,可通过term.hyperlinks配置值控制。 #12889 - 使用
-vv打印构建脚本执行的环境变量。 #12829 - cargo-new:自动将新包添加到 [workspace.members]。 #12779
- cargo-doc:打印新的
Generated状态,显示完整路径。 #12859
变更
- cargo-new:当 crate 名称不符合 snake_case 或 kebab-case 时发出警告。 #12766
- cargo-install:澄清要安装的参数
<crate>是位置参数。 #12841 - cargo-install:当 MSRV 失败时建议替代版本。 #12798
- cargo-install:报告更详细的 SemVer 错误。 #12924
- cargo-install:如果存在重复的 crate,则只安装一次。 #12868
- cargo-remove:澄清不同依赖类型的 flag 行为。 #12823
- cargo-remove:建议要移除的依赖只存在于另一个 section 中。 #12865
- cargo-update:当差异仅是构建元数据时,不要称之为“降级”。 #12796
- 增强了帮助文本,澄清
--testflag 是针对 Cargo 目标,而不是测试函数。 #12915 - 在构建脚本警告中包含包名/版本。 #12799
- 为错误的 -Z flag 提供下一步操作建议。 #12857
- 当找不到
cargo-<command>时,建议使用cargo search。 #12840 - 不允许空的特性名称。 #12928
- 为
--target和--excludeflag 添加了不支持的短 flag 建议。 #12805 - 为
--out-dirflag 添加了不支持的短 flag 建议。 #12755 - 为
-Zflag 添加了不支持的小写-zflag 建议。 #12788 - 为不支持的
--pathflag 添加了更好的建议。 #12811 - 目标目录路径无效时添加了详细消息。 #12820
修复
- 修复了 Cargo 在写入文件时被杀死导致的损坏问题。 #12744
- cargo-add:保留更多注释。 #12838
- cargo-fix:在 rustc 调用时保留 jobserver 文件描述符。 #12951
- cargo-remove:保留特性注释。 #12837
- 在 timings HTML 报告中发生错误时,移除了不必要的反斜杠。 #12934
- 修复了错误消息,该消息声称无效的特性名称可以包含
-。 #12939 - 当 lockfile 中存在依赖项的版本时,Cargo 会使用该“精确”版本,包括构建元数据。 #12772
仅 Nightly 版本
- 添加了
Edition2024不稳定特性。 文档 #12771 - 🔥
-Ztrim-paths特性添加了一个新的 profile 设置,用于控制最终二进制文件中路径的清理方式。(RFC 3127)(文档) #12625 #12900 #12908 -Zcheck-cfg:适应新的 rustc 语法和行为。 #12845-Zcheck-cfg:移除-Zcheck-cfg警告中过时的选项。 #12884public-dependency:支持工作空间依赖项的public依赖配置。 #12817
文档
- profile:添加缺少的
strip信息。 #12754 - features:关于特性数量新限制的说明。 #12913
- crates-io:为
NewCratestruct 添加文档注释。 #12782 - resolver:高亮显示回答依赖项解析问题的命令。 #12903
- cargo-bench:
--bench无条件传递给 bench harness。 #12850 - cargo-login:在 manpage 中提及
--之后的参数。 #12832 - cargo-vendor:澄清使用 vendored source 的配置会打印到 stdout。 #12893
- manifest:更新到 SPDX 2.3 许可证表达式和 3.20 许可证列表。 #12827
- contrib:清单编辑策略。 #12836
- contrib:在 mdbook 搜索中使用
AND搜索词,并修复了损坏的链接。 #12812 #12813 #12814 - contrib:描述如何添加新包。 #12878
- contrib:移除了审核能力通知。 #12842
内部
- 更新到
itertools0.11.0。 #12759 - 更新到
cargo_metadata0.18.0。 #12758 - 更新到
curl-sys0.4.68,对应 curl 8.4.0。 #12808 - 更新到
toml0.8.2。 #12760 - 更新到
toml_edit0.20.2。 #12761 - 更新到
gix0.55.2。 #12906 - 在 windows-gnu 上禁用了
custom_target::custom_bin_target测试。 #12763 - 重构了
Cargo.toml解析代码,为提取官方 schema API 做准备。 #12768 #12881 #12902 #12911 #12948 - 将 SemVer 逻辑拆分到单独的模块。 #12926 #12940
- source:为新的
PackageIDSpec语法做准备。 #12938 - resolver:整合
VersionPreferences中的逻辑。 #12930 - 将
SourceId::precise字段设为枚举(Enum)。 #12849 - shell:一次性写入,而不是分段写入。 #12880
- 将 index summary 枚举的查找逻辑上移。 #12749 #12923
- 在 CI 中为 Cargo 贡献者指南生成重定向 HTML 页面。 #12846
- 添加新的包缓存锁模式。 #12706
- 为 issue 6915 添加回归测试:特性和传递性开发依赖。 #12907
- 当 PR 审核状态改变时自动打标签。 #12856
- credential:在所有发布的 crate 中包含许可证文件。 #12953
- credential:按 OS 过滤
cargo-credential-*依赖项。 #12949 - CI:将 cargo-semver-checks 提升到 0.24.0。 #12795
- CI:自动设置和验证 Cargo 的 crate 的所有 MSRV。 #12767 #12654
- CI:为发布 Cargo 贡献者手册使用单独的并发组。 #12834 #12835
- CI:更新
actions/checkoutaction 到 v4。 #12762 - cargo-search:改进了输出的边距计算。 #12890
Cargo 1.74 (2023-11-16)
新增
- 🎉
[lints]表已稳定,允许你在Cargo.toml中配置 rustc 和其他工具 lints 的报告级别。(RFC 3389)(文档) #12584 #12648 - 🎉 不稳定特性
credential-process和registry-auth已稳定。这些特性整合了与私有注册表进行身份验证的方式。(RFC 2730)(RFC 3139)(文档) #12590 #12622 #12623 #12626 #12641 #12644 #12649 #12671 #12709
重要变更- 引入了一种新的协议,用于外部和内置提供程序存储和检索注册表身份验证凭据。
- 在注册表索引的
config.json中添加了auth-required字段,启用了认证的 sparse 索引、crate 下载和搜索 API。 - 使用带认证的替代注册表时,必须配置凭据提供程序,以避免在磁盘上无意中存储未加密的凭据。
- 这些设置可以在
[registry]和[registries]表中配置。
- 🎉
--keep-goingflag 已稳定,现在可在每个构建命令中使用(除了bench和test,它们使用--no-fail-fast)。(文档) #12568 - 为
cargo clean添加了--dry-runflag 和结尾的摘要行。 #12638 - 为 CLI 选项
--dry-run添加了短别名-n。 #12660 - 添加了对
target.'cfg(..)'.linker的支持。 #12535 - 允许在诸如
--package等 flag 中使用不完整的版本,只要它们是明确的。 #12591 #12614 #12806
变更
- ❗️ 更改了配置中数组的合并方式。以前的顺序是不明确的,现在为了保持一致性,遵循其他配置类型的工作方式。 摘要 #12515
- ❗️ cargo-clean:如果
--doc与-p混合使用,则报错。 #12637 - ❗ cargo-new / cargo-init 不再从库的 VCS 忽略文件中排除
Cargo.lock。 #12382 - cargo-update:静默弃用
--aggressive,转而使用新的--recursive。 #12544 - cargo-update:
-p/--package可以用作位置参数。 #12545 #12586 - cargo-install:当包名看起来像 URL 时建议使用
--git。 #12575 - cargo-add:当特性列表太长时进行摘要。 #12662 #12702
--target的 shell 补全使用 rustup,但会回退到 rustc。 #12606- 帮助用户了解可能的
--target值。 #12607 - 增强了“registry index not found”错误消息。 #12732
- 增强了
--explain的 CLI 帮助消息。 #12592 - 增强了使用
serde-untagged的 untagged enums 的反序列化错误。 #12574 #12581 - 增强了 prerelease 版本候选不匹配时的错误。 #12659
- 增强了对模糊 Package ID spec 的建议。 #12685
- 增强了 TOML 解析错误以显示上下文。 #12556
- 增强了文件系统错误,通过为
std::fs::metadata添加包装器。 #12636 - 增强了 resolver 版本不匹配警告。 #12573
- 使用 clap 为不支持的参数建议替代参数。 #12529 #12693 #12723
- 移除了 cargo new/init
--help输出中冗余的信息。 #12594 - 控制台输出和样式调整。 #12578 #12655 #12593
修复
- 为
cargo rustc --print --target使用完整的 target spec。 #12743 - 也为 EFI targets 复制 PDB。 #12688
- 修复了 resolver 行为与包顺序无关的问题。 #12602
- 修复了
cargo remove不必要地清理profile.release.package."*"的问题。 #12624
仅 Nightly 版本
-Zasymmetric-token:为非对称 token 支持创建了专门的不稳定 flag。 #12551-Zasymmetric-token:改进了非对称 token 的 logout 消息。 #12587-Zmsrv-policy:**非常**初步的 MSRV resolver 支持。 #12560-Zscript:支持代码块(code fence)。 #12681-Zbindeps:支持来自注册表的依赖项。 #12421
文档
- ❗ 策略变更:将
Cargo.lock签入版本控制现在是默认选项,即使对于库也是如此。Lockfile 和 CI 集成文档也进行了扩展。策略文档、Lockfile 文档、CI 文档、#12382 #12630 - SemVer:更新了关于移除可选依赖的文档。 #12687
- Contrib:增加了安全响应流程。 #12487
- cargo-publish:警告上传超时。 #12733
- mdbook:当有多个搜索词时使用 AND 搜索。 #12548
- 建立了发布最佳实践。 #12745
- 澄清 caret 要求。 #12679
- 澄清
version对于git依赖的工作方式。 #12270 - 澄清并区分 split-debuginfo 的默认值。 #12680
- 在
dev和releaseprofiles 中添加了缺少的strip条目。 #12748
内部
- 更新到
curl-sys0.4.66,对应 curl 8.3.0。 #12718 - 更新到
gitoxide0.54.1。 #12731 - 更新到
git20.18.0,对应 libgit2 1.7.1。 #12580 - 更新到
cargo_metadata0.17.0。 #12758 - 更新了 target-arch-aware 的 crate 以支持 mips r6 targets。 #12720
- publish.py:移除过时的
sleep()调用。 #12686 - 定义
{{command}}用于 src/doc/man/includes。 #12570 - 为网络消息设置 tracing target
network。 #12582 - cargo-test-support:添加
with_stdout_unordered。 #12635 - dep:从
termcolor切换到anstream。 #12751 - 将
Sourcetrait 放到cargo::sources下。 #12527 - SourceId:将
name和alt_registry_key合并到一个枚举中。 #12675 - TomlManifest:当 package_root 不是目录时报错。 #12722
- util:增强了
network::retry的文档。 #12583 - refactor:提取 cargo-add MSRV 代码以供重用。 #12553
- refactor(install):将值解析移动到 clap。 #12547
- 修复了网络测试中虚假错误。 #12726
- 对
CARGO_LOG内部日志记录使用更紧凑的相对时间格式。 #12542 - 使用更新的 std API 实现更清晰的代码。 #12559 #12604 #12615 #12631
- 缓存控制台状态消息。 #12727
- 使用枚举描述 index summaries,以便在 summaries 不可用时提供更丰富的信息进行解析。 #12643
- 使用最短路径解析从给定依赖项到根目录的路径。 #12678
- 在同一位置读/写编码的
cargo update --precise。 #12629 - 为内部包设置 MSRV。 #12381
- CI:更新 Renovate schema。 #12741
- CI:忽略 MSRV 中的 patch 版本。 #12716
Cargo 1.73 (2023-10-05)
新增
- 在 extra verbose mode
-vv中打印cargo run/bench/test的环境变量。 #12498 - 在 Cargo timings graph 上显示包版本。 #12420
变更
- ❗️ Cargo 现在在使用自定义构建脚本中的
cargo::时会中止。这是为即将到来的构建脚本调用变更做准备。 #12332 - ❗️
cargo login不再接受--语法后的任何 token。--之后的参数现在保留用于新的 credential provider 特性。这引入了一个回退,忽略了早期版本中对cargo login -- <token>的支持。 #12499 - 使 Cargo
--help更易于浏览。 #11905 - 如果
cargo test进程被信号终止,则提示使用--nocaptureflag。 #12463 - 在 rustc 调用中保留 jobserver 文件描述符,以获取目标信息。 #12447
- 在
--help中澄清cargo test --all-targets不包含 doctests。 #12422 - 在发布时将
cargo.toml规范化为Cargo.toml,并对其他情况下的Cargo.toml发出警告。 #12399
修复
- 仅在
~/.cargo/{git,registry}上跳过 mtime 检查。 #12369 - 修复了 WSL2 上
cargo doc --open崩溃的问题。 #12373 - 修复了为某些字符串启用
http.debug时发生 panic 的问题。 #12468 - 修复了
cargo remove错误地移除已使用的 patch 的问题。 #12454 - 修复了 crate checksum lookup query 应匹配 semver build metadata 的问题。 #11447
- 修复了为
[registries]表中未使用字段打印多个警告消息的问题。 #12439
仅 Nightly 版本
- 🔥
-Zcredential-process已重新实现,提供了与不同凭据提供程序通信的更清晰方式。Cargo 中也添加了几个内置提供程序。文档 #12334 #12396 #12424 #12440 #12461 #12469 #12483 #12499 #12507 #12512 #12518 #12521 #12526
一些值得注意的变更- 在 Cargo 配置中将
credential-process重命名为credential-provider。 - 通过 stdin/stdout 与外部凭据提供程序通信的新 JSON 协议。
- GNOME Secert 提供程序现在动态加载
libsecert。 - 1password 提供程序不再是内置的。
- 非对称 token 的不稳定键从
registry-auth更改为credential-process。
- 在 Cargo 配置中将
- ❗️ 移除了
cargo test和cargo bench对--keep-goingflag 的支持。 #12478 #12492 - 修复了
-Zscript生成的无效包名问题。 #12349 -Zscript现在在使用不支持的命令(publish和package)时会报错。 #12350- 正确编码 Cargo.lock 中 source ID 的 URL 参数。 #12280
- 将无效的
panic_unwindstd feature 替换为panic-unwind。 #12364 -Zlints:doctest 提取应遵循[lints]。 #12501
文档
- SemVer:添加了一个章节,说明改变良好定义类型的对齐方式、布局或大小。 #12169
- 使用标题属性控制 fragment。 #12339
- 在解释 Cargo 如何使用 semver 时,使用“number”而不是“digit”。 #12340
- contrib:添加关于发布工作方式的更多细节。 #12344
- 澄清
cargo metadata中的“Package ID”和“Source ID”是不透明的字符串。 #12313 - 澄清
rerun-if-env-changed不会监控为 crate 和构建脚本设置的环境变量。 #12482 - 澄清在 crates.io 上不允许仅在元数据 tag 不同的多个版本。 #12335
- 澄清
lto设置会传递-Clinker-plugin-lto。 #12407 - 将
profile.strip添加到配置和环境变量文档中。 #12337 #12408 - 添加了 artifact JSON debuginfo 级别的文档。 #12376
- 添加了关于向后兼容的
.cargo/credential文件存在的注意事项。 #12479 - 提高了对工作空间内部使用
resolver = 2的认识。 #12388 - 在文档中用 default branch 替换了
masterbranch。 #12435
内部
- 更新到
criterion0.5.1。 #12338 - 更新到
curl-sys0.4.65,对应 curl 8.2.1。 #12406 - 更新到
indexmapv2。 #12368 - 更新到
miow0.6.0,它放弃了旧版本的windows-sys。 #12453 - CI:通过使用
--workspace自动测试新包。 #12342 - CI:通过 Renovate 每月自动更新依赖项。 #12341 #12466
- CI:重写
xtask-bump-check,使其通过采用cargo-semver-checks来遵守 semver。 #12395 #12513 #12508 - 重新安排和重命名了测试目录。 #12397 #12398
- 从
log迁移到tracing。 #12458 #12488 - 在测试中跟踪
--help输出。 #11912 - 清理并共享工作空间中的包元数据。 #12352
- crates-io:暴露 HTTP headers 和
Error类型。 #12310 - 对于
cargo update,在 clap 中捕获了--aggressive和--precise之间的 CLI flag 冲突。 #12428 - 若干修复以使 Cargo testsuite 在 nightly 或
rust-lang/rust中通过。 #12413 #12416 #12429 #12450 #12491 #12500
Cargo 1.72 (2023-08-24)
新增
- ❗ 默认启用
-Zdoctest-in-workspace。运行每个文档测试时,工作目录设置为测试所属包的根目录。文档 #12221 #12288 - 添加对“default”关键字的支持,以将先前设置的
build.jobs并行度重置回默认值。 #12222
变更
- 🚨 CVE-2023-40030:恶意依赖项可以将任意 JavaScript 注入到 Cargo 生成的 timing reports 中。为了缓解此问题,特性名称验证检查现在已成为硬错误。该警告已在 Rust 1.49 中添加。这些扩展字符在 crates.io 上是不允许的,因此这应该只会影响其他注册表的用户或不发布到注册表的用户。 #12291
- 当 edition 2021 包位于虚拟工作空间中且未设置
workspace.resolver时,Cargo 现在会发出警告。建议为工作空间明确设置 resolver 版本。 #10910 - 将 IBM AIX 共享库搜索路径设置为
LIBPATH。 #11968 - 不向 rustc 传递
-C debuginfo=0,因为这是默认值。 #12022 #12205 - 在
cargo install失败时,添加了关于重用先前临时路径的消息。 #12231 - 当 rustup override shorthand 放置在错误位置时添加了消息。 #12226
- 在 fetching nested submodules 时尽可能遵循 scp-like URL。 #12359 #12411
修复
cargo clean使用remove_dir_all作为回退来解决竞争条件。 #11442- 减少了 Cargo 重新格式化用户
[features]表格的机会。 #12191 - 修复了 nested Git submodules 无法 fetch 的问题。 #12244
仅 Nightly 版本
- 🔥
-Zscript是一个实验性特性,用于在 Cargo 中添加对单文件包的不稳定支持,以便我们可以探索设计并通过实现来收集反馈。(eRFC 3424)文档 #12245 #12255 #12258 #12262 #12268 #12269 #12281 #12282 #12283 #12284 #12287 #12289 #12303 #12305 #12308 - 运行
cargo new/cargo init时自动继承工作空间 lints。 #12174 - 再次移除了
-Zjobserver-per-rustc。 #12285 - 为
-Zconfig-include添加了.toml文件扩展名限制。 #12298 - 添加了
-Znext-lockfile-bump,为下一次 lockfile bump 做准备。 #12279 #12302
文档
- 在 Cargo FAQ 中添加了关于
Cargo.lock冲突的描述。 #12185 - 添加了一个小注释,说明 indexes 忽略 SemVer build metadata。 #12206
- 为
cargo::sources模块中的类型和相关项添加了文档注释。 #12192 #12239 #12247 - 为
Sourcedownload functions 添加了更多文档。 #12319 - 为 credential helpers 添加了 READMEs。 #12322
- 修复了 Dependency Resolution 中的 version requirement 示例。 #12267
- 澄清了 cargo-install 的默认行为。 #12276
- 澄清了使用“default”分支而不是默认
main的用法。 #12251 - 提供了关于 version requirements 的指导。 #12323
内部
- 更新到
gix0.45,支持多轮 pack negotiations。 #12236 - 更新到
curl-sys0.4.63,对应 curl 8.1.2。 #12218 - 更新到
openssl0.10.55。 #12300 - 更新了几个依赖项。 #12261
- 移除了
windows-sys依赖项中未使用的 features。 #12176 - 重构了 compiler invocations。 #12211
- 重构了 git 和 registry sources,以及 registry data。 #12203 #12197 #12240 #12248
- 按字母顺序排列
-Zflags。 #12182 #12223 #12224 - Cargo 自身测试基础设施的若干改进和加速。 #12184 #12188 #12189 #12194 #12199
- 将 print-ban 从 test 迁移到 clippy。 #12246
- 切换到
OnceLock用于 interning uses。 #12217 - 移除了一处不必要的
.clone。 #12213 - 在非 Linux 平台不尝试编译
cargo-credential-gnome-secret。 #12321 - 使用宏移除工作空间可继承字段 getter 的重复代码。 #12317
- 提取并重新安排 registry API 项目到各自的模块中。 #12290
- 当 container 测试失败时显示更好的错误。 #12264
Cargo 1.71.1 (2023-08-03)
修复
- 🚨 CVE-2023-38497:Cargo 1.71.1 或更高版本在提取 crate archive 时遵循 umask。它还会清除由旧 Cargo 版本生成的缓存。
Cargo 1.71 (2023-07-13)
新增
- 允许在 Cargo.toml 中使用命名的 debuginfo 选项。文档 #11958
- 将
workspace_default_members添加到cargo metadata的输出中。 #11978 - 运行
cargo new/cargo init时自动继承工作空间字段。 #12069
变更
- ❗ 优化了
rustup下的使用。当 Cargo 检测到将要运行指向 rustup proxy 的rustc时,它会尝试绕过 proxy 并直接使用底层二进制文件。这与 rustup 和RUSTUP_TOOLCHAIN的交互存在一些假设,但预计不会影响普通用户。 #11917 - ❗ 在查询包时,Cargo 只尝试原始名称、所有连字符和所有下划线来处理拼写错误。之前,Cargo 会尝试连字符和下划线的每种组合,导致对 crates.io 发出过多请求。 #12083
- ❗ 不允许在
[env]配置表中设置RUSTUP_HOME和RUSTUP_TOOLCHAIN。Cargo 认为这并非其希望支持的使用场景,因为它很可能导致问题或混淆。 #12101 #12107 - 当 Cargo.toml 中依赖表为空时提供更好的错误消息。 #11997
- 当 Cargo.toml 中指定了空依赖项时提供更好的错误消息。 #12001
--help文本现在会根据屏幕宽度进行换行,以便于阅读。 #12013- 调整了
--help文本中参数的顺序,以澄清--bin的作用。 #12157 rust-version被包含在cargo publish请求中发送到注册表。 #12041
修复
- 更正了
cargo clippy --fix的错误报告 URL。 #11882 - Cargo 现在将
[env]应用于 rust invocations 以进行 target info discovery。 #12029 - 修复了在使用 HTTP/2 时 http debug 中 token 未被隐藏的问题。 #12095
- 修复了
-C debuginfo在某些情况下未传递,导致 build cache miss 的问题。 #12165 - 修复了
cargo install找到同名包时的歧义问题。此问题发生在包依赖于自身旧版本的情况下。 #12015 - 修复了
cargo package检查冲突文件时出现的 false positive 问题。 #12135 - 修复了当
dep/feat语法与dep:语法共存且尝试启用可选依赖的特性时不起作用的问题。 #12130 - 修复了
cargo tree未正确处理带-e no-proc-macro输出的问题。 #12044 - 当 Cargo.toml 中的
readme或license-file为空时,在cargo package中发出警告而不是错误。 #12036 - 修复了当使用 HTTP proxy 且 Cargo 可执行文件链接到特定版本的系统 libcurl 时,CURL 连接可能失败的问题。受影响的 libcurl 版本:7.87.0, 7.88.0, 7.88.1。 #12234 #12242
仅 Nightly 版本
- 🔥
-Zgitoxide特性现在支持依赖项和注册表索引的 shallow clones 和 fetches。文档 #11840 - 🔥
-Zlints特性允许在 Cargo.toml 中配置 lints 规则。文档 #12148 #12168 nightly-2023-05-04中缺少 features 导致的-Zbuild-std破坏问题已在nightly-2023-05-05中修复。 #12088- 在 profile rustflags 改变时重新编译。 #11981
- 添加了
-Zmsrv-policyfeature flag 占位符。 #12043 cargo add现在在使用-Zmsrv-policy选择包时会考虑rust-version。 #12078
文档
- 添加了 Cargo team charter。文档 #12010
- SemVer:对现有项添加
#[non_exhaustive]是一个 breaking change。 #10877 - SemVer:将 unsafe 函数变为 safe 不是一个 breaking change。 #12116
- SemVer:更改 MSRV 通常是一个 minor change。 #12122
- 澄清何时以及如何使用
cargo yank。 #11862 - 澄清 crates.io 不会立即链接到 docs.rs。 #12146
- 澄清关于 test target setting 的文档。 #12032
- 在 Index format 中指定
rust_version。 #12040 - 在 owner-remove registry API 响应中指定
msg。 #12068 - 为 artifact-dependencies 添加了更多文档。 #12110
- 为
Source和 cargo-the-library 的 build script 添加了文档注释。 #12133 #12153 #12159 - 若干 typo 和 broken link 的修复。 #12018 #12020 #12049 #12067 #12073 #12143
- home:澄清在每个平台上的行为。 #12047
内部
- 更新到
linux-raw-sys0.3.2。 #11998 - 更新到
git20.17.1,对应 libgit2 1.6.4。 #12096 - 更新到
windows-sys0.48.0。 #12021 - 更新到
libc0.2.144。 #12014 #12098 - 更新到
openssl-src111.25.3+1.1.1t。 #12005 - 更新到
home0.5.5。 #12037 - 启用了
Win32_System_Consolefeature,因为它正在使用。 #12016 - Cargo 现在是一个 Cargo 工作空间了。我们终于开始 dogfood 自己了! #11851 #11994 #11996 #12024 #12025 #12057
- 🔥 为 Cargo 贡献者提供了一个新的、直观的问题标签系统。文档 #11995 #12002 #12003
- 允许 win/mac credential managers 在所有平台上构建。 #11993 #12027
- 仅在非 Windows 平台使用
openssl。 #11979 - 使用受限的 Damerau-Levenshtein 算法提供拼写错误建议。 #11963
- 添加了一个新的 xtask
cargo build-man。 #12048 - 添加了一个新的 xtask
cargo stale-label。 #12051 - 添加了一个新的 xtask
cargo unpublished。 #12039 #12045 #12085 - CI:检查成员 crate 是否需要版本 bump。 #12126
- 修复了一些测试基础设施问题。 #11976 #12026 #12055 #12117
Cargo 1.70 (2023-06-01)
新增
- 🎉 添加了
cargo logout命令,用于从本地注册表中删除 API token。文档 #11919 #11950 - 为
cargo install添加了--ignore-rust-versionflag。 #11859 - 在编译 crate 时,
CARGO_PKG_README环境变量现在被设置为 README 文件的路径。 #11645 - Cargo 现在显示更丰富的 Cargo target 编译失败信息。 #11636
变更
- 🎉
sparse协议现在是 crates.io 的默认协议!(RFC 2789)(文档) #11791 #11783 - ❗
cargo login和cargo logout现在使用registry.default中指定的注册表。这是一个无意的回退。 #11949 cargo update在降级依赖项时准确显示Downgrading状态。 #11839- 为 HTTP 错误添加了更多信息,以帮助调试。 #11878
- 在 Cargo 中添加了网络重试延迟。 #11881
- 优化了
cargo publish在等待发布完成时的消息。 #11713 - 当从 git 仓库安装但找到多个包时,提供更好的错误消息。 #11835
修复
- 移除了
cargo tree的--charset选项中可能的重复值。 #11785 - 修复了同时定义带值和不带值的 config 时
CARGO_CFG_变量的问题。 #11790 - 在
cargo add添加依赖项时,解决了 cyclic features 的无限循环问题。 #11805 - 当
[patch]涉及依赖项解析并导致冲突时,不 panic。 #11770 - 修复了 credential token 格式验证问题。 #11951
- 添加了 publish 时缺少的 token 格式验证。 #11952
- 修复了 Config snapshot 中查找 env vars 时的大小写不匹配问题。 #11824
cargo new生成正确的.hgignore,与其它 VCS ignore files 语义对齐。 #11855- 停止执行不必要的模糊 registry index queries。这显著减少了对 crates.io 等远程注册表为名称中包含
-或_的 crate 发出的 HTTP 请求数量。 #11936 #11937
仅 Nightly 版本
- 添加了
-Zdirect-minimal-versions。它的行为类似于-Zminimal-versions,但仅限于直接依赖项。(文档) #11688 - 添加了
-Zgitoxide,将 Cargo 中的所有git fetch操作切换为使用gitoxidecrate。这仍然是 MVP 版本,但性能可能提升两倍。(文档) #11448 #11800 #11822 #11830 - 移除了
-Zjobserver-per-rustc。其 rustc 对应项从未实现。 #11764
文档
- 清理了不稳定特性文档。 #11793
- 使用图表增强了 timing report 的文档。 #11798
- 澄清了发布后注册表索引状态的要求。 #11926
- 澄清了关于
-C的文档,说明它出现在命令之前。 #11947 - 澄清了
cargo test,cargo bench和cargo run的工作目录行为。 #11901 - 修复了
registries.name.index配置的文档。 #11880 - 关于
cargo-add帮助文本中潜在的意外 shell expansions 的注意事项。 #11826 - 更新了 external-tools JSON 文档。 #11918
- 指出了 index JSON 和 API 或 metadata 之间的差异。 #11927
- 提及 pkgid format 时始终使用
@。 #11956 - 增强了 Cargo Contributor Guide。 #11825 #11842 #11869 #11876
- 将部分 Cargo Contributor Guide 移至 Cargo API 文档。文档 #11809 #11841 #11850 #11870
- Cargo team 现在组织 Office Hours! #11903
内部
- 切换到
sha2crate 进行 SHA256 计算。 #11795 #11807 - 切换 benchsuite 到 index archive。 #11933
- 更新到
base640.21.0。 #11796 - 更新到
curl-sys0.4.61,对应 curl 8.0.1。 #11871 - 更新到
proptest1.1.0。 #11886 - 更新到
git20.17.0,对应 libgit2 1.6.3。 #11928 - 更新到
clap4.2。 #11904 - 将
cargo-deny集成到 Cargo 自己的 CI pipeline 中。 #11761 - 使 non-blocking IO calls 更健壮。 #11624
- 在
cargo-platform中移除了serde的derivefeature。 #11915 - 将
std::fs::canonicalize替换为更健壮的try_canonicalize。 #11866 - 对
std::env::var及相关函数启用了disallowed_methods的 clippy 警告。 #11828
Cargo 1.69 (2023-04-20)
新增
- 当编译警告可以自动修复时,Cargo 现在建议使用
cargo fix或cargo clippy --fix。 #11558 - 当你尝试安装一个库 crate 时,Cargo 现在会建议使用
cargo add。 #11410 - Cargo 现在也会为二进制示例设置
CARGO_BIN_NAME环境变量。 #11705
变更
- ❗ 当工作空间依赖的
default-features设置为 false,而成员的继承依赖的default-features = true时,Cargo 将启用该依赖的默认特性。 #11409 - ❗ 在
[env]配置表中禁止使用CARGO_HOME。Cargo 自身不会获取这个值,但递归调用 Cargo 时会获取,这不是预期的行为。 #11644 - ❗ 如果未明确设置,构建依赖的 Debuginfo 现在默认关闭。这预计会提高整体构建时间。 #11252
- Cargo 现在对注册表 token 中的无效字母数字字符发出错误。 #11600
cargo add现在仅检查[dependencies]的顺序,不考虑[dependencies.*]。 #11612- Cargo 现在通过更新其依赖
jobserver来遵循 GNU Make 4.4 中的新 jobserver IPC 风格。 #11767 - 当没有二进制文件满足要求时,
cargo install现在报告所需的特性。 #11647
修复
- 将
.dwpDWARF package file 提升到可执行文件旁边,以便调试器定位它们。 #11572 - 修复了当
rerun-if-changed指向一个文件系统不保留 mtime 的目录时,构建脚本会触发重新编译的问题。 #11613 - 修复了在使用
[patch]时,从[workspace.dependencies]使用依赖项会导致 panic 的问题。这种用法本不应被支持。 #11565 #11630 - 修复了
cargo report多次保存相同的 future-incompat reports 的问题。 #11648 - 修复了将以
.rs结尾的目录错误推断为文件的问题。 #11678 - 修复了
.cargo-ok文件被错误截断,导致无法使用依赖项的问题。 #11665 #11724
仅 Nightly 版本
-Zrustdoc-scrape-example必须在构建脚本出错时失败。 #11694- 更新了 1password credential manager 集成到 version 2 CLI。 #11692
- 为传递性 artifact dependencies 在目标不直接交互的情况下发出错误消息。 #11643
- 添加了
-Cflag,用于在构建开始前更改当前目录。 #10952
文档
- 澄清了
CARGO_CRATE_NAME和CARGO_PKG_NAME的区别。 #11576 - 为 target triple 的出现添加了指向 Glossary 中 Target section 的链接。 #11603
- 描述了当前的 resolver 有时会重复依赖项。 #11604
- 添加了关于在 crates.io 上验证电子邮件地址的注意事项。 #11620
- 在
publish.timeout文档中提及当前的默认值。 #11652 cargo::core::compiler模块的更多文档注释。 #11669 #11703 #11711 #11758- 添加了关于如何实现不稳定特性的更多指导。 #11675
- 修复了
codegen-backend的不稳定章节布局。 #11676 - 添加了 LTO 文档的链接。 #11701
- 将
cargo install的配置发现文档添加到 man 页面。 #11763 - 文档记录了
-Fflag 是cargo add中--features的别名。 #11774
内部
- 在 Windows 上禁用 network SSH 测试。 #11610
- 将一些 blocking tests 变为 non-blocking。 #11650
- 在 CI 中拒绝 warnings,而不是在本地。 #11699
- 将
cargo_new::NewProjectKind重新导出为 public。 #11700 - 使依赖项按字母顺序排列。 #11719
- 将一些测试从
build切换到check。 #11725 - 整合了 Cargo 内部读取环境变量的方式。 #11727 #11754
- 修复了 nondeterministic ordering 的测试。 #11766
- 添加了一个测试来验证中间 artifacts 是否持久保存在临时目录中。 #11771
- 更新了 aarch64-apple-darwin 的 cross test instructions。 #11663
- 更新到
tomlv0.6 和toml_editv0.18 进行 TOML 操作。 #11618 - 更新到
clapv4.1.3。 #11619 - 用
windows-syscrate 替换了winapi进行 Windows 绑定。 #11656 - 重用
urlcrate 进行 percent encoding,而不是percent-encoding。 #11750 - Cargo 贡献者在编写文档时可以受益于 smart punctuations,例如,
---会自动转换为 en dash。(文档) #11646 #11715 - Cargo 的 CI pipeline 现在覆盖了 nightly 上的 macOS。 #11712
- 在 Cargo 自身中重新启用了部分 clippy lints。 #11722
- 在 Cargo 的 CI 中启用了 sparse protocol。 #11632
- Cargo 中的 Pull requests 现在会为
A-*和Command-*标签自动打标签。 #11664 #11679
Cargo 1.68.2 (2023-03-28)
- 更新了捆绑在 Cargo 中的 GitHub RSA SSH host key。GitHub 在 2023-03-24 泄露旧密钥后更换了密钥。 #11883
- 添加了对 SSH known hosts marker
@revoked的支持。 #11635 - 将旧的 GitHub RSA host key 标记为已吊销。这将阻止 Cargo 接受泄露的密钥,即使系统信任它。 #11889
Cargo 1.68 (2023-03-09)
新增
- 🎉 新的“sparse”协议已稳定。它在访问 crates.io 时应该提供显著的性能改进。(RFC 2789)(文档) #11224 #11480 #11733 #11756
- 🎉
homecrate 现在是rust-lang/cargo仓库中的一个 subcrate。欢迎! #11359 #11481 - 冗长的诊断消息现在可以被截断以提高可读性。 #11494
- 即使启用了
net.git-fetch-with-cli,也会显示 crates.io index update 的进度。 #11579 cargo build --verbose会告诉你更多关于为什么重新编译的信息。 #11407- Cargo 的文件锁定机制现在通过使用
fcntl支持 Solaris。 #11439 #11474 - 添加了一条新的 SemVer 兼容性规则,解释了关于 diagnostic lints 的预期行为。 #11596
cargo vendor为来自同一 git 仓库的每个 revision 生成不同的 source replacement 条目。 #10690- Cargo 贡献者可以通过 triagebot 重新标记 issue。文档 #11498
- Cargo 贡献者可以在 containers 中编写测试。 #11583
变更
- Cargo 现在默认将凭据保存到
.cargo/credentials.toml。如果.cargo/credentials存在,出于向后兼容性原因,也会写入其中。 #11533 - 为了防止敏感数据被记录,Cargo 在内部引入了一个新的 wrapper type。 #11545
- 若干文档改进。 #11475 #11504 #11516 #11517 #11568 #11586 #11592
修复
- ❗
cargo package和cargo publish现在尊重工作空间的Cargo.lock。这是预期的行为,但之前被忽视了。 #11477 - 修复了
cargo vendor在解析从工作空间继承的 git 依赖时失败的问题。 #11414 - 当指定了
workspace.default-members时,cargo install现在可以正确安装 root package。 #11067 - 修复了 target specific dependency errors 导致 panic 的问题。 #11541
- 如果某个子命令没有 man page,则显示
--help。 #11473 - 设置
target.cfg(…).rustflags不应清除build.rustdocflags。 #11323 - 不支持的
profile.split-debuginfo选项现在会被忽略,这在此之前会导致 Cargo 在某些平台上编译失败。 #11347 #11633 - 在 Windows 无头会话中,即使文件名非常长,也不会 panic。 #11759
仅 Nightly 版本
- 实现了对注册表的非对称 token 认证的初步支持。(RFC 3231)(文档) #10771
- 对于
auth-required: true而没有-Z sparse-registry的情况不报错。 #11661 - 支持 config 文件中 profiles 的
codegen-backend和rustflags。 #11562 - 当 warnings/errors 可以用 clippy 修复时,建议使用
cargo clippy --fix。 #11399 - 修复了当 target field 指定与
optional = true共存时 artifact deps 不工作的问题。 #11434 - 让 Cargo 区分带 artifact targets 和不带 artifact targets 的
Unit。 #11478 cargo metadata支持 artifact dependencies。 #11550- 允许某些 crate 在可选的 doc-scraping 期间构建失败。 #11450
- 添加警告,如果由于 dev-dependencies 导致潜在可 scraping 的示例被跳过。 #11503
- 默认情况下,不从 library targets 中 scrape 示例。 #11499
- 修复了 proc-macro crate 的示例被 scrape 的问题。 #11497
Cargo 1.67 (2023-01-26)
新增
cargo remove现在在成功移除依赖项后,会清理 root workspace manifest、profile、patch和replacesection 中引用的依赖项。 #11194 #11242 #11351cargo package和cargo publish现在报告打包后 crate 的总大小和压缩后大小。 #11270
变更
- ❗ 如果环境变量中已设置
$CARGO的值,Cargo 现在会复用该值,并在执行外部子命令和构建脚本时转发该值。 #11285 - ❗ 在不带
-pflag 运行cargo update --precise时,Cargo 现在会发出错误。 #11349 - ❗ 如果配置中有多个注册表具有相同的 index URL,Cargo 现在会发出错误。 #10592
- Cargo 现在在提取 crate 文件时会考虑压缩比。这放宽了 1.64.0 中为缓解 zip bomb 攻击而引入的硬大小限制。 #11337
- 当在 git 仓库中运行
cargo fix且存在未提交的更改时,Cargo 现在会报错。 #11400 - 当
cargo tree -i <spec>找不到任何包时,Cargo 现在会发出警告。 #11377 - 当运行
cargo new/init且项目路径中包含PATH环境变量分隔符时,Cargo 现在会发出警告。 #11318 - 当找到多个包且
cargo add/remove混淆时,提供更好的错误消息。 #11186 #11375 - 当
cargo init时现有忽略文件不是 UTF-8 时提供更好的错误消息。 #11321 - 为
cargo install .提供更好的错误消息。 #11401 - 当在多个构建目标中找到相同文件路径时提供更好的警告。 #11299
- 更新了内部 HTTP 库 libcurl,包含各种修复和更新。 #11307 #11326
修复
- 修复了
cargo clean仅移除请求包的指纹和构建脚本 artifact 的问题。 #10621 - 修复了当 config
registry.default设置时cargo install --index不工作的问题。 #11302 - 修复了在找不到网络配置时意外禁用了 git2 safe-directory 的问题。 #11366
- 从 crate
atty迁移以解决潜在的 soundness issue。 #11420 - 清理 libgit2 索引中断时留下的 stale git temp files。 #11308
仅 Nightly 版本
- 当某些编译警告/错误可以自动修复时,建议使用
cargo fix。 #10989 #11368 - 将
rustdoc-scrape-examples改为 target-level 配置。 #10343 #11425 #11430 #11445 - 将 artifact bin 依赖的更改传播到其 parent fingerprint。 #11353
- 修复了
wait-for-publish与 sparse registry 一起工作的问题。 #11356 #11327 #11388 - 为 sparse registries 在
SourceId中存储sparse+前缀。 #11387 #11403 - 实现了 alternative registry authentication 支持。(RFC 3139)(文档) #10592
- 添加了 config option
registries.crates-io.protocol的文档。 #11350
Cargo 1.66.1 (2023-01-10)
修复
- 🚨 CVE-2022-46176: 为 git URL 添加了 SSH 主机密钥的验证。更多关于如何配置已知主机密钥的信息,请参见文档。
Cargo 1.66 (2022-12-15)
新增
- 🎉 添加了
cargo remove命令,用于从Cargo.toml中移除依赖。 文档 #11059 #11099 #11193 #11204 #11227 - 添加了对包含相对路径 git 子模块的 git 依赖的支持。 #11106
- Cargo 现在向注册表发送请求时会带上
Accept-Encoding请求头。 #11292 - Cargo 现在会将非 UTF8 参数转发给外部子命令。 #11118
变更
- ❗ 从各个角度澄清了源替换的歧义。 RFC-3289 #10907
- 当 crates-io 源被替换时,执行 API 操作时用户需要使用
--registry <NAME>指定要使用的注册表。 - 使用 crates.io token (
registry.token) 不再允许发布到源已替换的 crates.io。 - 在源替换中,
replace-with键可以引用[registries]表中替代注册表的名称。
- 当 crates-io 源被替换时,执行 API 操作时用户需要使用
- ❗
cargo publish现在会阻塞,直到在索引中看到发布的包。 #11062 #11210 #11216 #11255 - Cargo 现在使用 clap v4 库解析命令行参数。 #11116 #11119 #11159 #11190 #11239 #11280
- Cargo 现在仅在用户定义的别名遮蔽了外部命令时发出警告。 #11170
- 一些文档改进。 #10770 #10938 #11082 #11093 #11157 #11185 #11207 #11219 #11240 #11241 #11282
修复
- ❗ 通过
cargo --config <file>加载的配置文件现在优先于环境变量。这是文档中描述的行为,但旧实现不小心搞错了。 #11077 - ❗ Cargo 更正确地在
target.cfg(…).rustflags中收集 rustflags,如果不足以收敛,则会发出警告。 #11114 - 编译开始前应移除链接器未移除的最终构建产物。 #11122
cargo add现在以更容易发现的方式报告未知特性。 #11098- Cargo 现在报告命令别名失败时提供更多错误上下文。 #11087
- 当
cargo login提示收到空输入时,提供了更好的错误消息。 #11145 - 对于支持工作空间继承的字段类型错误时,提供了更好的错误消息。 #11113
- 当混合使用特性语法
dep:和/时,提供了更好的错误消息。 #11172 - 当发布时清单中的
package.publish为false时,提供了更好的错误消息。 #11280
仅 Nightly 版本
- 在
-Zpublish-timeout之后添加了新的配置选项publish.timeout。 文档 #11230 - 为稀疏注册表添加了重试支持。 #11069
- 修复了稀疏注册表 lockfile url 中包含
registry+sparse+的问题。 #11177 - 添加了新的配置选项
registries.crates-io.protocol,用于控制 crates.io 协议。 #11215 - 移除了 index.crates.io 的
sparse+前缀。 #11247 - 修复了依赖稀疏注册表时的发布问题。 #11268
- 修复了使用
-Zsparse-registry时令人困惑的错误消息。 #11283 - 修复了稀疏注册表的 410 Gone 响应处理问题。 #11286
Cargo 1.65 (2022-11-03)
新增
- 外部子命令现在可以继承 Cargo 的 jobserver 文件描述符。 #10511
- 为 cargo-the-library 中的私有项添加了 API 文档。参见 https://doc.rust-lang.net.cn/nightly/nightly-rustc/cargo。 #11019
变更
- 如果 Cargo 的 bin 路径已经存在于
PATH中,Cargo 现在会停止添加它。 #11023 - 通过对待处理的作业队列进行排序,改进了 Cargo 构建调度的性能。 #11032
- 即使在
rev字段中使用部分哈希,也改进了从 GitHub 获取 git 依赖项的性能。 #10807 - Cargo 现在使用 git2 v0.15 和 libgit2-sys v0.14,这带来了与 git 新行为的几项兼容性修复。 #11004
- 注册表索引文件现在根据内容哈希以更细粒度的方式缓存。 #11044
- Cargo 现在使用标准库的
std::thread::scope而不是crossbeamcrate 来生成范围线程。 #10977 - Cargo 现在使用标准库的
available_parallelism而不是num_cpuscrate 来确定默认并行度。 #10969 - Cargo 现在会在看到
rust-version要求不满足的错误消息时引导您如何解决。 #10891 - 当找不到子命令时,Cargo 现在会告诉您更多可能的原因以及如何修复。 #10924
- 当找不到给定的 Cargo 目标时,Cargo 现在会列出可用的目标名称。 #10999
cargo update现在会在没有--package标志的情况下给出--precise时发出警告。经过过渡期后,这将成为硬错误。 #10988 #11011cargo bench和cargo test现在在测试失败后立即报告更精确的测试执行错误。 #11028cargo add现在告诉您为哪个版本添加了特性。 #11075- 指出 Rust 不再支持非 ASCII 包名称。 #11017
- 在清单中预期字段应为数组但使用了字符串时,增强了错误消息。 #10944
修复
- 取消了除 Linux 以外平台上对文件锁定支持的限制。 #10975
- 通过将 os_info 版本升级到 3.5.0,修复了不正确的操作系统检测。 #10943
- 扫描包目录时现在会忽略来自损坏但被排除的符号链接文件的错误。 #11008
- 修复了构建脚本等待 stdin 输入时发生的死锁。 #11257
Nightly
- 稀疏注册表的进度指示器变得更直观。 #11068
Cargo 1.64 (2022-09-22)
新增
- 🎉 包现在可以从工作空间继承设置,以便将设置集中管理。有关如何定义这些常用设置的更多详细信息,请参见
workspace.package和workspace.dependencies。 #10859 - 向
cargo rustc添加了--crate-type标志,用于覆盖 crate 类型。 #10838 - Cargo 命令现在可以接受多个
--target标志,以便一次构建多个目标,并且build.target配置选项现在可以接受一个包含多个目标的数组。 #10766 --jobs参数现在可以接受负数,用于从最大 CPU 数倒数。 #10844
变更
- Bash 补全
cargo install --path现在支持路径补全。 #10798 - 当在
rev字段中使用哈希时,显著提高了从 GitHub 获取 git 依赖项的性能。 #10079 - 发布的包现在将包含来自工作空间的解析器设置,以确保它们在独立使用时使用相同的解析器。 #10911 #10961 #10970
cargo add现在将更新Cargo.lock。 #10902cargo vendor的配置输出中的路径现在将反斜杠转换为正斜杠,以便设置能够在不同平台工作。 #10668workspace.default-members设置现在允许在非虚拟工作空间中将值设置为".",以指代根包。 #10784
修复
- 🚨 CVE-2022-36113: 提取恶意包可能损坏任意文件。 #11089 #11088
- 🚨 CVE-2022-36114: 提取恶意包可能填满文件系统。 #11089 #11088
cargo --version --verbose中的os输出现在支持更多平台。 #10802- 缓存的 git 检出如果损坏现在将重新构建。这在使用
net.git-fetch-with-cli并中断克隆过程时可能发生。 #10829 - 修复了
cargo add --offline中的 panic。 #10817
仅 Nightly 版本
- 修复了
config.toml中不稳定check-cfg的反序列化问题。 #10799
Cargo 1.63 (2022-08-11)
新增
- 🎉 添加了
--configCLI 选项,可以直接在命令行传递配置选项。 #10755 - 如果清单设置了
rust-version字段,现在在编译 crate 时会设置CARGO_PKG_RUST_VERSION环境变量。 #10713
变更
- 当 git 依赖项中遇到多个同名包时,会发出警告。这将忽略
publish=false的包。 #10701 #10767 - 变更跟踪现在使用
.json目标规范文件的内容,而不是其路径。这有助于避免路径更改时重新构建。 #10746 - 现在遵守在
.gitmodules中配置了update=none策略的 git 子模块的 git 依赖项,并且不会获取子模块。 #10717 - 为了确定性行为,crate 文件现在使用更近的日期(2006 年 7 月 23 日而非 1973 年 11 月 29 日)。 #10720
cargo new的初始模板现在包含一个略微更真实的测试结构,在测试模块中包含use super::*;。 #10706- 更新了内部 HTTP 库 libcurl,包含各种小修复和更新。 #10696
修复
- 修复了
cargo add和cargo locate-project的 zsh 补全。 #10810 #10811 - 修复了在虚拟工作空间根目录使用
cargo publish时忽略-p的问题。还添加了一些额外检查,如果选择了多个包(之前会选择第一个)则会生成错误。 #10677 - 使用 JSON 输出时,
cargo test不再显示可执行文件的易读名称。 #10691
仅 Nightly 版本
- 添加了
-Zcheck-cfg=output,以支持构建脚本使用cargo:rustc-check-cfg声明其支持的cfg值集合。 #10539 -Z sparse-registry现在在访问 crates-io 时使用 https://index.crates.io/。 #10725- 修复了工作空间继承中
cargo add的.workspace键格式问题。 #10705 - 稀疏 HTTP 注册表 URL 现在必须以
/结尾。 #10698 - 修复了
cargo add和工作空间继承中default-features键的问题。 #10685
Cargo 1.62 (2022-06-30)
新增
- 🎉 添加了
cargo add命令,用于从命令行向Cargo.toml添加依赖。 文档 #10472 #10577 #10578 - 包 ID 规范现在除了之前的
name:version外,还支持name@version语法,以便与cargo add和其他工具的行为保持一致。cargo install和cargo yank现在也支持这种语法,这样版本就不必作为单独的标志传递。 #10582 #10650 #10597 - 添加了 CLI 选项
-F作为--features的别名。 #10576 - Cargo 主目录(通常是
~/.cargo)中的git和registry目录现在被标记为缓存目录,以便它们不包含在备份或内容索引中(在 Windows 上)。 #10553 - 向
cargo yank添加了--version标志,以替换--vers标志,以便与cargo install保持一致。 #10575 - 添加了自动
@argfile 支持,如果传递给rustc的命令行超过操作系统限制,则会使用“响应文件”。 #10546 cargo clean现在有进度条(如果耗时超过半秒)。 #10236
变更
- 如果找不到要安装的二进制文件(例如缺少所需的特性),
cargo install不再生成错误。 #10508 - 如果指定的目标与主机目标相同,
cargo test现在会将--target传递给rustdoc。 #10594 cargo doc在文档化二进制文件时会自动传递-Arustdoc::private-intra-doc-links(这会自动包含--document-private-items)。private-intra-doc-linkslint 仅在不文档化私有项时才相关,这不适用于二进制文件。 #10142cargo --version输出中短 git 哈希的长度现在固定为 9 个字符。之前不同平台之间的长度不一致。 #10579- 尝试发布带有
Cargo.toml.orig文件的包现在会生成错误。该文件名会与自动生成的文件冲突。 #10551
修复
build.dep-info-basedir配置设置现在正确支持在路径中使用..来引用父目录。 #10281- 修复了使用 cgroups v1 的系统上自动检测默认 CPU 数的回归问题。 #10737 #10739
仅 Nightly 版本
cargo fetch现在可以使用-Zbuild-std来获取标准库的依赖。 #10129- 添加了对工作空间继承的支持。 文档 #10584 #10568 #10565 #10564 #10563 #10606 #10548 #10538
- 添加了
-Zcheck-cfg,用于验证cfg表达式中的未知名称和值。 文档 #10486 #10566 --configCLI 选项不再允许设置注册表 token。 #10580- 修复了 proc-macro 和
-Z rustdoc-scrape-examples的问题。 #10549 #10533
Cargo 1.61 (2022-05-19)
新增
变更
cargo test --no-run现在将显示测试可执行文件的路径。 #10346cargo tree --duplicates不再报告主机和目标之间共享的依赖项为重复项。 #10466- 更新到 libgit2 1.4.2 版本,其中包含几项修复。 #10442 #10479
cargo vendor不再允许--sync有多个值,必须传递多个--sync标志。 #10448- 现在对混合使用了下划线和连字符变体(例如同时指定了
proc_macro和proc-macro)的清单键发出警告。 #10316 - Cargo 现在使用标准库的
available_parallelism而不是num_cpuscrate 来确定默认并行度。 #10427 cargo search搜索词现在会被高亮显示。 #10425
修复
- 传递给 VCS 工具(如
hg)的路径现在会在--之后添加,以避免与 VCS 标志冲突。 #10483 - 修复了
http.timeout配置值无法实际工作的问题。 #10456 - 修复了在某些情况下
cargo rustc --crate-type不起作用的问题。 #10388
仅 Nightly 版本
- 添加了
-Z check-cfg-features以启用编译时特性检查。 #10408 - 添加了
-Z bindeps以支持二进制构建产物依赖项 (RFC-3028)。 #9992 -Z multitarget现在在build.target配置值中支持数组。 #10473- 添加了
--keep-going标志,即使某个 crate 编译失败也会继续编译。 #10383 - 开始在工作空间中继承清单值的工作。 #10497 #10517
- 添加了对稀疏 HTTP 注册表的支持。 #10470 #10064
- 修复了
[target.'cfg(<target>)'.dependencies]使用构建产物目标时的 panic。 #10433 - 修复了传递给构建脚本的主机标志 (
-Z target-applies-to-host)。 #10395 - 添加了对 rustdoc 的
-Z check-cfg-features支持。 #10428
Cargo 1.60 (2022-04-07)
新增
- 🎉 在
[features]表中添加了dep:前缀,用于引用可选依赖。这允许创建与依赖项同名的特性名称,并允许“隐藏”可选依赖项,使其不隐式暴露特性名称。 文档 #10269 - 🎉 在
[features]表中添加了dep-name?/feature-name语法,仅在可选依赖dep-name已被其他特性启用时,才启用特性feature-name。 文档 #10269 - 🎉 添加了
--timings选项,用于生成关于构建时序、并发和 CPU 使用情况的 HTML 报告。 文档 #10245 - 向注册表索引添加了
"v"和"features2"字段。"v"字段提供了与未来索引更改兼容的方法。 文档 #10269 - 为
cargo clippy添加了 bash 补全。 #10347 - 为
cargo report添加了 bash 补全。 #10295 - 构建脚本添加了对
rustc-link-arg-tests、rustc-link-arg-examples和rustc-link-arg-benches的支持。 文档 #10274
变更
- Cargo 现在使用 clap 3 库进行命令行参数解析。 #10265
build.pipelining配置选项现在已弃用,pipelining 将始终启用。 #10258cargo new现在将生成一个.gitignore文件,该文件只忽略仓库根目录的Cargo.lock,而不是任何目录。 #10379- 改进了 bash 补全的启动时间。 #10365
- 现在使用
--all-features标志时,会遵守--features标志,这允许启用来自其他包的特性。 #10337 - Cargo 现在使用不同的 TOML 解析器。这不应引入任何用户可见的更改。这为支持
cargo add和其他未来增强功能,以保持格式的程序化修改 TOML 文件铺平了道路。 #10086 - 将库设置为同时发出
dylib和cdylib现在是一个错误,因为这种组合不受支持。 #10243 cargo --list现在包含help命令。 #10300
修复
- 修复了对 dev-dependency 的示例运行
cargo doc的问题。 #10341 - 修复了
cargo install --path对于相对于当前目录中工作空间之外的目录的路径的问题。 #10335 cargo test TEST_FILTER不再应构建使用test = false显式禁用的二进制文件。 #10305- 修复了在没有
term.quiet的情况下使用term.verbose,反之亦然的回归问题。 #10429 #10436
仅 Nightly 版本
- 为 profile 定义添加了
rustflags选项。 #10217 - 将
--config更改为仅支持点分键。 #10176 - 修复了 profile overrides 中未限制 profile
rustflags的问题。 #10411 #10413
Cargo 1.59 (2022-02-24)
新增
- 🎉 现在可以在 profile 中指定
strip选项,以指定从二进制文件中移除符号和调试信息的行为。 文档 #10088 #10376 - 🎉 添加了未来不兼容报告。这提供了当
rustc的未来更改可能导致包或其任何依赖项停止构建时的报告。 文档 #10165 - Windows 上的 SSH 身份验证现在支持 ssh-agent。 文档 #10248
- 添加了
term.quiet配置选项,以便从配置文件启用--quiet行为。 文档 #10152 - 添加了
-rCLI 选项作为--release的别名。 #10133
变更
- 扫描包目录现在应该对错误具有弹性,例如文件系统循环或访问问题。 #10188 #10214 #10286
cargo help <alias>现在将显示别名的目标。 #10193- 移除了已弃用的
--hostCLI 选项。 #10145 #10327 - Cargo 现在应报告其版本,以始终与
rustc同步。 #10178 - 将 EOPNOTSUPP 添加到忽略的文件锁定错误中,这与 BSD 操作系统相关。 #10157
修复
- macOS: 修复了执行可执行文件时会被内核偶尔终止的问题(可能始于 macOS 12)。 #10196
- 修复了依赖项的
[lib]定义中遵守doc=false设置的问题。 #10201 #10324 - 文档化二进制文件时,JSON 选项中的
"executable"字段错误地包含了index.html的路径。现在为 null。 #10171 - 文档化二进制文件时,现在会等待包库文档化完成后再开始。这修复了如果二进制文件有对库的 intra-doc links 时的一些竞态条件。 #10172
- 修复了向已关闭的管道显示帮助文本时的 panic。 #10164
仅 Nightly 版本
- 向
cargo rustc添加了--crate-type标志。 #10093
Cargo 1.58 (2022-01-13)
新增
变更
修复
- Doctests 现在包含来自构建脚本的 rustc-link-args。 #9916
- 修复了
cargo tree在循环 dev-dependency 时进入无限循环的问题。修复了解析器无法处理包含特性的循环 dev-dependency 的边缘情况。 #10103 - 修复了当目录路径包含 glob 字符时
cargo clean -p的问题。 #10072 - 修复了
cargo的 debug 构建,当服务器有带非空主体的重定向时,下载 crate 会 panic。 #10048
仅 Nightly 版本
- 使 future-incompat-report 输出更友好。 #9953
- 添加了支持从
examples目录抓取代码示例以包含在文档中。 文档 #9525 #10037 #10017 - 修复了
cargo report future-incompatibilities在 stdout 支持颜色时进行检查的问题。 #10024
Cargo 1.57 (2021-12-02)
新增
- 🎉 添加了自定义命名 profile。这也将
test和benchprofile 更改为继承自dev和release的设置,并且 Cargo 现在在给定命令期间只使用一个 profile,而不是为依赖项和 cargo-target 使用不同的 profile。 文档 #9943 - git 依赖项的
rev选项现在支持以refs/开头的 git 引用。一个可以使用此功能的示例是在像 GitHub 这样的服务中依赖于合并前的 pull request。 #9859 - 在
.cargo_vcs_info.json文件中添加了path_in_vcs字段。 文档 #9866
变更
- ❗
RUSTFLAGS不再为构建脚本设置。此更改在 1.55 中进行,但发布说明未突出显示此更改。构建脚本应改用CARGO_ENCODED_RUSTFLAGS。有关更多详细信息,请参阅文档。 cargo version命令现在包含一些额外信息。 #9968- 更新了 libgit2 到 1.3,这带来了一些修复和 git 处理的更改。 #9963 #9988
- Shell 补全现在包含简写 b/r/c/d 子命令。 #9951
cargo update --precise现在允许指定不带 semver metadata(版本号中+后面的部分)的版本。 #9945- zsh 补全现在补全
--example名称。 #9939 - 进度条现在区分构建 unittests 时的情况。 #9934
- 已移除对无效 TOML 语法的一些向后兼容性支持。 #9932
- 恢复了 1.55 中对不包含任何字段的依赖规范触发错误的更改。 #9911
修复
- 移除了一个可能泄露 token 的日志消息(来自
CARGO_LOG)。 #9873 cargo fix现在会避免将修复写入全局注册表缓存。 #9938- 修复了与简写别名 (b/c/r/d) 一起使用
-Z helpCLI 选项时的问题。 #9933
仅 Nightly 版本
Cargo 1.56 (2021-10-21)
新增
- 🎉 Cargo 现在支持 2021 edition。更多信息可在 edition guide 中找到。 #9800
- 🎉 在
Cargo.toml中添加了rust-version字段以指定最低支持的 Rust 版本,并添加了--ignore-rust-version命令行选项来覆盖它。 #9732 - 在配置文件中添加了
[env]表,用于指定要设置的环境变量。 文档 #9411 - 配置文件中现在可以指定
[patch]表。 文档 #9839 cargo doc现在支持--example和--examples标志。 #9808- 🎉 构建脚本现在可以为二进制文件或所有可链接目标传递额外的链接器参数。 文档 #9557
- 向
cargo publish添加了对-p标志的支持,以发布工作空间中的特定包。cargo package现在也支持-p和--workspace。 #9559 - 添加了有关第三方注册表的文档。 #9830
- 在注册表
config.json的 URL 中添加了{sha256-checksum}占位符。 文档 #9801 - 添加了对不包含库的依赖项的警告。 #9771
变更
- Doc tests 现在支持
-q标志以显示简洁的测试输出。 #9730 [replace]表中使用的features现在会发出警告,因为它们会被忽略。 #9681- 更改为仅在构建
wasm32-unknown-emscripten可执行文件时文件名中不包含哈希。之前是所有wasm32目标。此外,所有apple二进制文件现在构建时文件名中都包含哈希。这允许同时缓存多个副本,并且与(除msvc外)其他平台上的行为一致。 #9653 cargo new现在生成一个不会与 clippy 产生警告的示例。 #9796cargo fix --edition现在仅应用 edition 特定的 lint。 #9846- 改进解析器消息以包含依赖项要求。 #9827
- 使用
CARGO_LOG环境变量,cargo fix现在提供更多 debug 日志。 #9831 - 更改
cargo fix --edition在稳定版运行且处于最新稳定 edition 时,不再生成错误而是发出警告。 #9792 cargo install现在将在开始安装之前确定所有要安装的包,这有助于在未完全安装的情况下报告错误。 #9793cargo fix --edition的解析器报告现在包含 dev-dependency 的差异。 #9803cargo fix现在对来自rustc的异常错误显示更好的诊断信息。 #9799cargo --list中的条目现在进行了去重。 #9773- Aliases 现在包含在
cargo --list中。 #9764
修复
- 修复了 build-std 的 proc-macro 的 panic。 #9834
- 修复了在运行
cargo fix时从 proc-macros 递归运行cargo的问题。 #9818 - 对于命令别名循环,返回错误而不是栈溢出。 #9791
- 更新到 curl 7.79.1,有望修复间歇性 http2 错误。 #9937
仅 Nightly 版本
- 添加了
[future-incompat-report]配置部分。 #9774 - 修复了自定义命名 profile 的 value-after-table 错误。 #9789
- 添加了
different-binary-name特性,支持为二进制文件指定非 rust 标识符的名称。 文档 #9627 - 添加了一个 profile 选项来选择 codegen 后端。 文档 #9118
Cargo 1.55 (2021-09-09)
新增
cargo metadata中的包定义现在包含清单中的"default_run"字段。 #9550- ❗ 构建脚本现在被禁止在稳定版上设置
RUSTC_BOOTSTRAP。 #9181 #9385 - 添加了
cargo d作为cargo doc的别名。 #9680 - 向
cargo tree --format选项添加了{lib},用于显示包的库名称。 #9663 - 向
WorkspaceAPI 添加了members_mut方法。 #9547
变更
- 如果构建命令在使用
--all-targets、--bins、--tests、--examples或--benches标志时未匹配任何目标,现在会显示警告,告知您没有匹配的目标。 #9549 cargo init检测现有源文件是否代表二进制或库的方式已更改,以遵守命令行标志,而不是尝试猜测类型。 #9522- 注册表名称现在尽可能显示,而不是注册表 URL。 #9632
- 不再显示重复的编译器诊断信息。这在使用
cargo test时经常发生,它会并行构建同一代码的多个副本。这还更新了警告摘要,提供更多上下文。 #9675 - 警告或错误的输出现在得到了改进,更简洁、更清晰,并显示更多上下文。 #9655
- 网络发送错误现在被视为“假性”错误,这意味着它们将被重试。 #9695
- 非 git 依赖项上的 Git 键(
branch、tag、rev)现在是一个错误。此外,同时指定git和path现在也是一个错误。 #9689 - 指定不带任何键的依赖项现在是一个错误。 #9686
- 解析器现在尽可能优先使用依赖项的
[patch]表条目。 #9639 - 依赖项中的包名称拼写错误现在与原始名称对齐显示,以便更容易看到差异。 #9665
- Windows 平台现在可以对大小写错误的环境变量发出警告。 #9654
[patch]表中使用的features现在会发出警告,因为它们会被忽略。 #9666target目录现在在 Windows 上被排除在内容索引之外。 #9635- 当找不到
Cargo.toml时,错误消息现在会检测是否误拼为小写c,并建议正确的形式。 #9607 - 使用新解析器构建
diesel时会显示兼容性通知。 #9602 - 更新了
opener依赖项,该依赖项负责打开网页浏览器,其中包括几项更改,例如在 WSL 上运行时的新行为,以及在 Linux 上使用系统xdg-open。 #9583 - 更新到 libcurl 7.78。 #9809 #9810
修复
- 修复了 dep-info 文件包含非本地构建脚本路径的问题。 #9596
- 处理 cargo 配置文件中的“jobs = 0”情况。 #9584
- 实现对
--后被忽略的尾随参数的警告。 #9561 - 修复了 rustc/rustdoc 配置值与配置相关的错误。 #9566
cargo fix现在支持 rustc 的多跨度建议。 #9567cargo fix现在串行修复每个目标,而不是并行修复,以避免同时修复同一文件的问题。 #9677- 对目标
linker配置值的更改现在会触发重新构建。 #9647 - 在使用
--allow-dirty标志运行cargo publish或cargo package时,Git 未暂存的删除文件现在会被忽略。 #9645
仅 Nightly 版本
- 启用了对
cargo fix --edition2021 的支持。 #9588 - 对命名 profile 进行了一些更改。 #9685
- 扩展了在 2021 edition 上运行
cargo fix --edition时应做什么的说明。 #9694 - 更新了使用 nightly feature 的错误消息,以更好地解释情况。 #9657
- 调整了 2021 edition 解析器差异报告。 #9649
- 修复了使用
cargo doc --open和doc.extern-map时的错误。 #9531 - 统一了 weak 和 namespaced features。 #9574
- future-incompatible 报告的各种更新。 #9606
[env]环境变量不允许设置由 Cargo 设置的变量。 #9579
Cargo 1.54 (2021-07-29)
新增
- 从 git 仓库(例如 crates.io 索引)抓取时,现在会显示网络传输速率。 #9395
- 向
cargo tree添加了--prune选项,以限制显示内容。 #9520 - 向
cargo tree添加了--depth选项,以限制显示内容。 #9499 - 添加了
cargo tree -e no-proc-macro以隐藏过程宏依赖项。 #9488 - 添加了
doc.browser配置选项,用于设置cargo doc --open打开的浏览器。 #9473 - 为集成测试和 benchmark 设置了
CARGO_TARGET_TMPDIR环境变量。这为测试和 benchmark 在target目录中提供了一个临时或“暂存”目录供使用。 #9375
变更
- 新的特性解析器现在为
--featuresCLI 标志提供拼写建议。 #9420 - Cargo 现在使用新的 SemVer 版本解析器。这应该与之前行为基本相同,除了一些次要例外,即现在拒绝版本要求中的无效语法。 #9508
.crate发布包的 Mtime 处理方式略有改变,以避免 Mtime 值为 0。这导致 lldb 拒绝读取这些文件。 #9517- 提高了
cargo package中 git status 检查的性能。 #9478 - 使用 fossil 运行
cargo new现在将忽略设置放置在新仓库中,而不是使用fossil settings进行全局设置。这还包括一些其他清理工作,使其与其他 VCS 配置更一致。 #9469 - 传递应用
rustc-cdylib-link-arg会显示警告,表明这不是预期行为,将来可能成为错误。 #9563
修复
- 修复了在不在 git 仓库中或 vendoring 依赖项时,
Cargo.toml中的package.exclude使用反转排除 (!somefile) 的问题。 #9186 - Dep-info 文件现在将构建脚本的
rerun-if-changed路径调整为绝对路径。 #9421 - 修复了当 resolver = “1” 时非虚拟包允许未知特性的 bug。 #9437
- 修复了索引缓存处理仅在构建元数据(例如
110.0.0和110.0.0+1.1.0f)不同的版本时出现问题。 #9476 - 修复了使用 semver 元数据版本安装
cargo install的问题。 #9467
仅 Nightly 版本
- 添加了
report子命令,并将cargo describe-future-incompatibilitie更改为cargo report future-incompatibilities。 #9438 - 在配置文件中添加了
[host]表,用于为主机目标设置构建标志。还添加了target-applies-to-host来控制[target]表的行为。 #9322 - 构建脚本的
rustc-link-arg-*指令添加了一些验证,如果目标不存在,则返回错误。 #9523 - 为构建脚本添加了
cargo:rustc-link-arg-bin指令。 #9486
Cargo 1.53 (2021-06-17)
新增
变更
- 🔥 Cargo 现在支持默认
HEAD分支不是“master”的 git 仓库。这还包括切换到版本 3 的Cargo.lock格式,该格式可以正确处理默认分支。 #9133 #9397 #9384 #9392 - 🔥 macOS 目标的 split-debuginfo 默认设置为
unpacked。 #9298 - ❗ 新项目的
Cargo.toml中不再包含authors字段。 #9282 cargo update现在可以使用--offline标志。 #9279- 在切换不同工具链版本时,
cargo doc现在会擦除doc目录。存在共享的、未版本化的文件(例如搜索索引),在使用不同版本时可能会损坏。 #8640 #9404 - 改进了路径依赖项/工作空间成员缺失时的错误消息。 #9368
修复
- 修复了
cargo doc在更改某些设置(如特性)时检测文档是否需要重新构建的问题。 #9419 cargo doc现在在运行 rustdoc 之前删除包的输出目录,以清除任何过期文件。 #9419- 修复了
-C metadata值始终包含所有构建的所有信息的问题。之前,在某些情况下,哈希仅包含包名称和版本。这修复了一些问题,例如 macOS 上带有 split-debuginfo 的增量构建在某些情况下损坏增量缓存。 #9418 - 修复了如果
man在PATH中,man 页面在 Windows 上不起作用的问题。 #9378 rustc缓存现在 aware ofRUSTC_WRAPPERandRUSTC_WORKSPACE_WRAPPER。 #9348- 如果代码使用了
env!("CARGO"),则在重新构建指纹中跟踪CARGO环境变量。 #9363
仅 Nightly 版本
- 修复了 config includes 不起作用的问题。 #9299
- 当
--future-incompat-report没有报告内容时,发出 note。 #9263 - Nightly feature 标志(如
-Z和cargo-features)的错误消息现在提供更多信息。 #9290 - 添加了在
Cargo.toml中为单个包设置目标的能力。 文档 #9030 - 修复了 build-std 在每次构建时都更新索引的问题。 #9393
-Z help现在显示所有-Z选项。 #9369- 添加了
-Zallow-features以指定允许使用哪些 nightly features。 #9283 - 添加了
cargo config子命令。 #9302
Cargo 1.52 (2021-05-06)
新增
变更
- 构建脚本现在被禁止在稳定版上设置
RUSTC_BOOTSTRAP。 #9181 #9385 - crates.io 现在支持 SPDX 3.11 许可证。 #9209
- 如果
CARGO_TARGET_DIR是一个空字符串,现在会报告错误。 #8939 - Doc tests 现在将
--message-format标志传递给测试,以便 doc tests 现在可以使用“short”格式。 #9128 cargo test现在会打印更清晰的指示器,指示当前正在运行哪个目标。 #9195- 如果
CARGO_TARGET_<TRIPLE>环境变量使用小写字母,现在会发出警告。 #9169
修复
- 修复了
Cargo.toml中包含 metadata 和 resolver 字段的包的发布问题。 #9300 #9304 - 修复了 determine prefer-dynamic for a dylib 的逻辑,该逻辑在工作空间和单个包中有所不同。 #9252
- 修复了当独占目标特定依赖项跨越依赖项类型(如 regular 和 build-dependencies)重叠时,错误地将依赖项包含在两者中的问题。 #9255
- 修复了将某些风格的包 ID 传递给
-p标志时发生的 panic。 #9188 - 当 Cargo 的输出没有到 TTY,并且强制启用进度条和颜色时,输出现在会正确清除进度行。 #9231
- 当 JSON 可能包含非 utf8 路径时,返回错误而不是 panic。 #9226
- 修复了在损坏的 stderr 上可能发生的挂起。 #9201
- 修复了设置
lto=off时,thin-local LTO 未正确禁用。 #9182
仅 Nightly 版本
stripprofile 选项现在支持true和false值。 #9153- 如果新解析器更改了特性,
cargo fix --edition现在会在切换到 2021 edition 时显示报告。 #9268 - 在
.cargo/config文件中添加了[patch]表支持。 #9204 - 添加了
cargo describe-future-incompatibilities,用于生成包含未来不兼容警告的依赖项报告。 #8825 - 添加了对测试 2021 edition 的更简单支持。 #9184
- 在 2021 edition 中将默认解析器切换到“2”。 #9184
cargo fix --edition现在支持 2021 edition。 #9184- 向
cargo rustc添加了--print标志,用于传递给rustc以显示来自 rustc 的信息。 #9002 - 添加了
-Zdoctest-in-workspace,用于更改 doctest 运行的目录与它们 编译的目录。 #9105 - 在
.cargo/config.toml中添加了对[env]部分的支持,用于在运行 cargo 时设置环境变量。 #9175 - 向索引添加了 schema 字段和
features2字段。 #9161 - 对 JSON spec targets 的更改现在会触发重新构建。 #9223
Cargo 1.51 (2021-03-25)
新增
- 🔥 添加了
split-debuginfoprofile 选项。 文档 #9112 - 向
cargo metadata添加了path字段,用于包依赖项列表,以显示“path”依赖项的路径。 #8994 - 🔥 添加了新的特性解析器和新的 CLI 特性标志行为。有关
resolver = "2"选项的信息,请参见新的 features 和 resolver 文档。有关新的 CLI 行为,请参见 CLI 和 resolver 2 CLI 选项。最后,有关详细更改,请参阅 RFC 2957。 #8997
变更
- 如果未找到
Cargo.lock,cargo install --locked现在会发出警告。 #9108 - 在命令行传递未知或模糊的包 ID 时,现在会显示正确包 ID 的建议。 #9095
- 稍微优化
cargo vendor。 #8937 #9131 #9132
修复
- 修复了在同一构建会话期间多次运行构建脚本时,构建脚本发出的环境变量和 cfg 设置对
cargo test和cargo run生效的问题。 #9122 - 修复了使用新特性解析器时,
cargo doc引发的 panic。这也引入了一些启发式方法,尝试避免rustdoc路径冲突,对于具有多个变体(如多个版本,或同一包用于主机和目标平台)的包,只生成其中一个变体的文档。 #9077 - 修复了 Cargo 循环依赖图检测中的一个导致栈溢出的 bug。 #9075
- 修复了在某些情况下,测试包的构建脚本
links环境变量 (DEP_*) 不显示的问题。 #9065 - 修复了使用
resolver="2"构建包含 proc-macro 的整个工作空间并在所有目标上选择特性时,在特定场景下特性选择不确定的问题。 #9059 - 修复了使用
~/.gitconfig中的http.proxy设置。 #8986 - 修复了 V1 解析器中,非成员包使用 –feature pkg/feat 时的错误。 #9275 #9277
- 修复了在工作空间中存在冲突的输出文件名时,
cargo doc引发的 panic。 #9276 #9277 - 修复了如果多个包中的一个安装失败,
cargo install仍然以成功退出的问题。 #9185 #9196 - 修复了文档冲突孤立项导致的 panic。 #9142 #9196
仅 Nightly 版本
- 移除了不稳定的
publish-lockfile特性,该特性已在一年半前无需显式标志即可稳定使用。 #9092 - 为 nightly 特性(如通过
-Z标志传递的,或在Cargo.toml中通过cargo-features指定的)添加了更好的诊断信息、帮助消息和文档。 #9092 - 添加了对 Rust 2021 版的支持。 #8922
- 添加了对项目元数据中
rust-version字段的支持。 #8037 - 为索引添加了一个 schema 字段。 #9161 #9196
Cargo 1.50 (2021-02-11)
新增
- 为
cargo metadata添加了doc字段,该字段指示目标是否已生成文档。 #8869 - 添加了
RUSTC_WORKSPACE_WRAPPER,这是一个可选的 RUSTC wrapper,仅对本地工作空间包运行,并独立于非 wrapped 构建缓存其工件。 #8976 - 为
cargo update添加了--workspace标志,仅更新工作空间成员,而不更新其依赖项。这在更新Cargo.toml中的版本并希望更新Cargo.lock而不运行任何其他命令时特别有用。 #8725
变更
- 上传到 registry 的
.crate文件现在使用可重现的设置构建,以便在不同机器上创建的相同.crate文件应该完全一致。 #8864 - 指定了多个
branch、tag或rev的 Git 依赖项现在会被拒绝。 #8984 - 构建脚本的
rerun-if-changed指令现在可以指向一个目录,在这种情况下,Cargo 将检查该目录中的任何文件是否发生更改。 #8973 - 如果 Cargo 无法确定用户名或电子邮件地址,
cargo new将不再失败,而是创建一个空的 authors 列表。 #8912 - 进度条的宽度已减小,为显示当前正在构建的 crates 腾出更多空间。 #8892
cargo new现在将支持.gitconfig中的includeIf指令,以便在确定用户名和电子邮件地址时匹配正确的目录。 #8886
修复
- 修复了
cargo metadata和cargo tree仅下载请求目标的包。 #8987 - 更新了 libgit2,带来了许多修复,特别是修复了在 32 位系统上偶尔出现的 zlib 错误。 #8998
- 修复了使用
links字段的循环开发依赖项导致的栈溢出。 #8969 - 修复了
cargo publish在某些文件系统上失败的问题,特别是在 WSL2 上的 9p 文件系统。 #8950
仅 Nightly 版本
- 允许
resolver="1"指定原始的特性解析行为。 #8857 - 添加了
-Z extra-link-arg,它添加了cargo:rustc-link-arg-bins和cargo:rustc-link-arg构建脚本选项。 文档 #8441 - 实现了外部凭证进程支持,并添加了
cargo logout。(RFC 2730)(文档) #8934 - 修复了使用
-Zbuild-std且没有根节点时的 panic。 #8942 - 将 docs.rs 设置为 crates.io 的默认 extern-map。 #8877
Cargo 1.49 (2020-12-31)
新增
- 为
cargo metadata添加了homepage和documentation字段。 #8744 - 添加了
CARGO_PRIMARY_PACKAGE环境变量,当运行rustc时,如果该包是命令行上选定的“根”包之一,则会设置此变量。 #8758 - 为命令行上的包和目标选择标志(例如
-p 'serde*'或--test '*')添加了对 Unix 风格 glob 模式的支持。 #8752
变更
- 计算出的 LTO 标志现在包含在文件名元数据哈希中,以便 LTO 设置的更改将独立缓存构建工件,而不是覆盖之前的工件。这在某些情况下(例如在某些情况下在
cargo build和cargo test之间切换)可以防止重复构建。 #8755 cargo tree现在在 proc-macro 包旁边显示(proc-macro)。 #8765- 添加了一个警告,特性名称允许的字符已限制为字母、数字、
_、-和+,以适应未来的语法更改。这仍然是 crates.io 允许的语法(仅需 ASCII)的超集。这在未来计划更改为错误。 #8814 - 不带值的
-p现在将打印工作空间包名称列表。 #8808 - 将点添加到允许的特性名称字符中。 #8932 #8943
修复
- 修复了启用 LTO 时构建同时具有“dylib”和“rlib” crate 类型的库的问题。 #8754
- 修复了 Cargo 的 dep-info 文件中的路径问题。 #8819
- 修复了显式指定
branch="master"的 Git 依赖项在cargo metadata中源 ID 不一致的问题。 #8824 - 修复了重新解压包含
.cargo-ok文件的依赖项的问题。 #8835
仅 Nightly 版本
- 修复了在某些情况下,使用
cargo doc -Zfeatures=itarget引发的 panic。 #8777 - 使用语法
dep:serde的命名空间特性新实现。 文档 #8799 - 添加了对“弱”依赖项特性的支持,使用语法
dep_name?/feat_name,这将在启用依赖项的同时启用该依赖项的特性,而不会仅仅因为启用了特性就启用依赖项。 #8818 - 修复了新的特性解析器下载了非严格必需的额外依赖项的问题。 #8823
Cargo 1.48 (2020-11-19)
新增
- 添加了
term.progress配置选项,用于控制何时以及如何显示进度条。 文档 #8165 - 为
cargo locate-project添加了--message-format plain选项,以不带 JSON 格式显示项目位置,使其更易于在脚本中使用。 #8707 - 为
cargo locate-project添加了--workspace选项,以显示工作空间 manifest 的路径。 #8712 - 添加了 Cargo 自身的贡献者指南。该指南发布在 https://rust-lang.github.io/cargo/contrib/。 #8715
- Zsh 的
--target补全现在将与内置的 rustc 目标一起补全。 #8740
变更
修复
- 修复了
cargo new创建 fossil 仓库时无法正确忽略target目录的问题。 #8671 - 安装远程包时,不再显示当前目录中关于工作空间的警告。 #8681
- 在 Git 仓库中遇到“对象未找到”错误时,自动重新初始化索引。 #8735
- 更新了 libgit2,带来了 Git 仓库处理的若干修复。 #8778 #8780
仅 Nightly 版本
- 修复了
cargo install会忽略本地配置文件中的[unstable]表格的问题。 #8656 - 修复了新特性解析器中不确定行为的问题。 #8701
- 修复了在特定组合情况下,使用新特性解析器对 proc-macro 运行
cargo test的问题。 #8742
Cargo 1.47 (2020-10-08)
新增
cargo doc现在将在左侧边栏中包含包的版本。 #8509- 为
cargo metadata目标添加了test字段。 #8478 - Cargo 的 man pages 现在可以通过
cargo help命令显示(例如cargo help build)。 #8456 #8577 - 添加了关于 依赖项解析工作原理 和 SemVer 兼容性 的新文档章节,以及关于如何版本化项目和使用依赖项的建议。 #8609
变更
- 已对修改
.gitignore时添加的注释进行调整,以增加一些间距。 #8476 cargo metadata的输出现在应该排序以具有确定性。 #8489- 默认情况下,即使在 release 模式下,构建脚本和 proc-macros 现在也以
opt-level=0和默认的 codegen units 构建。 #8500 workspace.default-members现在受workspace.exclude过滤。 #8485workspace.membersglobs 现在忽略非目录路径。 #8511- git zlib 错误现在会触发重试。 #8520
- “http”类 git 错误现在会触发重试。 #8553
- Git 依赖项现在会覆盖
core.autocrlfgit 配置值,以确保它们在跨平台上的行为一致,特别是在 Windows 上 vendoring Git 依赖项时。 #8523 - 如果需要更新
Cargo.lock,它将自动转换为新的 V2 格式。此格式删除了[metadata]表格,并且应该更容易在源代码控制系统中合并更改。此格式在 1.38 版本中引入,并在 1.41 版本中成为新项目的默认格式。 #8554 - 添加了对默认分支不是“master”的 Git 仓库的支持准备。实际支持将在未来版本中实现。这引入了一些警告:
- 如果 Git 依赖项未指定分支,并且仓库的默认分支不是“master”,则发出警告。将来,Cargo 将 fetch 默认分支。在这种情况下,应显式指定分支。
- 如果一个工作空间对同一个 Git 仓库有多个依赖项,一个没有
branch而另一个有branch="master",则发出警告。所有依赖项都应使用其中一种形式。 #8522
- 如果
required-features条目列出了不存在的特性,现在会发出警告。 #7950 - 内置别名现在包含在
cargo --list中。 #8542 - 使用已 yank 的特定版本运行
cargo install现在将显示该版本已被 yank 的错误消息,而不是“找不到”。 #8565 - 对于
publish字段设置为单个 registry 且未给定--registry标志的包,cargo publish现在将发布到该 registry,而不是生成错误。 #8571
修复
- 修复了一个问题:如果项目目录被移动,并且其中一个构建脚本没有使用
rerun-if-changed指令,则该构建脚本在不应该被重建时被重建。 #8497 - 控制台颜色现在应该在 Windows 7 和 8 上正常工作。 #8540
CARGO_TARGET_{triplet}_RUNNER环境变量现在将正确覆盖配置文件,而不是尝试合并命令。 #8629- 修复了 LTO 与 doctests 的问题。 #8657 #8658
仅 Nightly 版本
- 添加了对
-Z terminal-width的支持,它告诉rustc终端的宽度,以便更好地格式化诊断信息。 文档 #8427 - 添加了通过
[unstable]表格在配置文件中配置-Z不稳定标志的功能。 文档 #8393 - 添加了
-Z build-std-features标志来设置标准库的特性。 文档 #8490
Cargo 1.46 (2020-08-27)
新增
- registry 索引的
config.json文件中的dl键现在支持替换标记{prefix}和{lowerprefix},允许像索引本身那样将 crates 分散到不同的目录中。 文档 #8267 - 添加了在编译期间设置的新环境变量:
- 如果在
Cargo.toml中未指定readme的值,现在会根据是否存在名为README、README.md或README.txt的文件自动推断。可以通过设置readme = false来抑制此行为。 #8277 cargo install现在支持--index标志,可以直接从索引安装。 #8344- 为
Cargo.toml中的workspace定义添加了metadata表格。这可以用于任意数据,类似于package.metadata表格。 #8323 - 为
cargo install添加了--target-dir标志,用于设置目标目录。 #8391 - 现在会自动检测
env!或option_env!宏使用的环境变量的变化,以触发重新构建。 #8421 target目录现在包含CACHEDIR.TAG文件,某些工具使用此文件将该目录排除在备份之外。 #8378- 添加了关于 rustup 的
+toolchain语法的文档。 #8455
变更
- 如果 Git 依赖项的 URL 中包含
#片段,现在会显示警告。这可能会引起混淆,因为 Cargo 自身会以这种语法显示 Git URL,但在Cargo.lock文件之外它没有任何意义,并且无法正常工作。 #8297 - 针对 bitcode 嵌入和 LTO 进行了各种优化和修复。 #8349
- 减少了 Git 依赖项 fetch 的数据量。如果 Cargo 知道要 fetch 的分支或标签,现在只会 fetch 该分支或标签,而不是所有分支和标签。 #8363
- 增强了 Git fetch 错误消息。 #8409
.crate文件现在以 GNU tar 格式生成,而不是 UStar,后者支持更长的文件名。 #8453
修复
- 修复了一个罕见的情况,即
Cargo.lock更新首次失败,但后续运行却允许其继续进行。 #8274 - 移除了 Windows dylibs 必须具有
.dll扩展名的断言。某些自定义 JSON spec 目标可能会更改扩展名。 #8310 - 更新了 libgit2,其中包含针对某些远程 Git 服务器(如 googlesource.com)的 zlib 错误修复。 #8320
- 修复了非 master 分支上 Git 依赖项的 GitHub 快速路径检查(检查是否最新)的问题。 #8363
- 修复了启用
pkg/feature语法的特性时遇到的问题:如果pkg是一个可选依赖项,同时也是一个开发依赖项,并且在 registry 摘要中开发依赖项出现在可选普通依赖项之前,则可选依赖项不会被激活。 #8395 - 修复了如果包中有一个名为
build的测试,clean -p会删除构建目录的问题。 #8398 - 修复了 Cargo 多行错误消息的缩进问题。 #8409
- 修复了一个问题:为 rustdoc 自动包含
--document-private-items标志会覆盖传递给cargo rustdoc命令的任何标志。 #8449 - Cargo 现在将在指纹目录的哈希中包含版本,以支持对指纹结构的向后不兼容更改。 #8473 #8488
仅 Nightly 版本
- 添加了
-Zrustdoc-map特性,为 rustdoc 提供外部映射(如 https://docs.rs/ 链接)。 文档 #8287 - 修复了在
Cargo.toml中使用下划线(如proc_macro = true)声明 proc-macro 时的特性计算问题。 #8319 - 添加了对使用
-Zdoctest-xcompile设置-Clinker的支持。 #8359 - 修复了在配置文件中设置
stripprofile 字段的问题。 #8454
Cargo 1.45 (2020-07-16)
新增
变更
-
更改了官方文档,推荐使用
.cargo/config.toml文件名(带.toml扩展名)。.toml扩展名支持在 1.39 版本中添加。 #8121 -
registry.index配置值不再允许使用(已弃用 4 年)。 #7973 -
如果同时传递
--index和--registry,将生成错误(之前--index会被静默忽略)。 #7973 -
registry.token配置值不再与--index标志一起使用。这样做是为了避免潜在地将 crates.io token 泄露给其他 registry。 #7973 -
添加了警告,如果
registry.token与源替换一起使用。预计未来版本中这将成为错误。 #7973 -
Windows GNU 目标现在会将 DLL crate 类型的
.dll.a导入库文件复制到输出目录。 #8141 -
现在无条件地将所有依赖项的 Dylibs 复制到输出目录。一些不明确的场景可能会导致在构建之间引用旧的 dylib,这确保了所有最新的副本都被使用。 #8139
-
package.exclude现在可以匹配目录名。如果指定了目录,整个目录将被排除,Cargo 将不再尝试进一步检查。以前 Cargo 会尝试检查目录中的每个文件,如果目录包含不可读文件可能会导致问题。 #8095 -
使用
cargo publish或cargo package打包时,Cargo 可以使用 git 来指导决定包含哪些文件。以前这种基于 git 的逻辑要求仓库根目录存在Cargo.toml文件。现在不再需要,即使仓库根目录没有Cargo.toml,Cargo 也会使用基于 git 的指导。 #8095 -
在 Windows 上解包 crate 时,如果由于文件是 Windows 保留文件名(如“aux.rs”)而无法写入文件,Cargo 将显示额外的消息解释失败原因。 #8136
-
设置文件 mtime 失败现在会被忽略。某些文件系统不支持此功能。 #8185
-
某些类别的 git 错误现在会建议启用
net.git-fetch-with-cli。 #8166 -
进行 LTO 构建时,Cargo 现在会在可能的情况下指示 rustc 不要执行 codegen。这可能会加快构建速度并使用更少的磁盘空间。此外,对于非 LTO 构建,Cargo 会指示 rustc 不要在库中嵌入 LLVM bitcode,这应该会减小库的大小。 #8192 #8226 #8254
-
cargo clean -p的实现已重写,以便更准确地删除特定包的文件。 #8210 -
Cargo 计算构建输出的方式已重写,以使其更完整和准确。新跟踪的文件将显示在 JSON 消息中,并且在某些情况下可能会被提升到输出目录。由此带来的一些变化包括:
- Windows MSVC 动态库上的
.exp导出文件现在被跟踪。 - Windows 上的 Proc-macros 跟踪导入/导出文件。
- 所有生成独立调试文件(pdb/dSYM)的目标(如测试等)都被跟踪。
- 添加了 wasm32-unknown-emscripten 的 .map 文件。
- macOS dSYM 目录被跟踪所有动态库(dylib/cdylib/proc-macro)和构建脚本。
由此带来了一系列其他变化:
- Windows MSVC 上带有连字符的二进制示例现在会在 examples 目录中显示两次(
foo_bar.exe和foo-bar.exe)。以前 Cargo 只是简单地重命名文件,而不是创建硬链接。 - 示例库现在遵循与普通库相同的连字符/下划线转换规则(现在它们将使用下划线)。
- Windows MSVC 动态库上的
-
Cargo 尝试从 HTTP 调试的 debug log 中清除任何秘密信息。 #8222
-
已为 Cargo 的许多文件系统操作添加了上下文,以便错误消息现在提供更多信息,例如导致问题的路径。 #8232
-
现在,如果 stdout 或 stderr 在运行期间关闭,一些命令会忽略此错误。例如,以前
cargo install --list | grep -q cargo-fuzz有时会 panic,因为grep -q可能会在命令完成之前关闭 stdout。如果 stdout 或 stderr 关闭,常规构建会继续失败,这与许多其他构建系统的行为一致。 #8236 -
如果
cargo install给定了精确版本(如--version=1.2.3),现在如果该版本已经安装,它将避免更新索引,并快速退出,指示它已安装。 #8022 -
对
[patch]部分的更改现在将尝试自动更新Cargo.lock到新版本。对于无法自动更新的罕见情况,现在也应该提供更好的错误消息。 #8248
修复
- 修复了文件名包含连字符时,将 Windows
.pdb文件复制到输出目录的问题。 #8123 - 修复了一个错误:当包位于 Git 仓库内部,且其祖先路径中存在符号链接时,Cargo 在扫描时会失败。 #8186
- 修复了使用未使用的
[patch]进行cargo update时,不会卡住并拒绝更新的问题。 #8243 - 修复了 stderr 关闭且编译器生成大量消息时,Cargo 会挂起的问题。 #8247
- 修复了 macOS 上 backtraces 不显示文件名或行号的问题。由此带来的一个结果是,Apple 目标上的二进制可执行文件在 Cargo 的缓存中,文件名不包含哈希值。这意味着 Cargo 只能跟踪一个副本,因此如果您切换特性或 rustc 版本,Cargo 需要重新构建可执行文件。 #8329 #8335
- 修复了在 Windows 上使用 lld 和 dylib 时指纹识别的问题。Cargo 错误地认为 dylib 总是不过期。 #8290 #8335
仅 Nightly 版本
- 修复了使用 JSON spec 目标时,为
--target向rustdoc传递完整路径的问题。 #8094 -Cembed-bitcode=no重命名为-Cbitcode-in-rlib=no。 #8134- 为
Cargo.toml添加了新的resolver字段,以选择使用新的特性解析器。 #8129 -Zbuild-std不再将 std 依赖项视为“本地”。这意味着它不会对这些依赖项使用增量编译,会将它们从 dep-info 文件中移除,并将 lints 的上限设置为“allow”。 #8177- 添加了
-Zmultitarget,允许使用多个--target标志同时为多个目标构建相同的内容。 文档 #8167 - 为 profile 添加了
strip选项,以移除符号和调试信息。 文档 #8246 - 修复了使用
cargo tree --target=all -Zfeatures=all时的 panic。 #8269
Cargo 1.44 (2020-06-04)
新增
- 🔥 添加了
cargo tree命令。 文档 #8062 - 添加了警告,如果包包含 Windows 限制的文件名(如
nul、con、aux、prn等)。 #7959 - 添加了
"build-finished"JSON 消息,表示编译已完成,以便工具可以检测何时停止侦听包含cargo run或cargo test等命令的 JSON 消息。 #8069
变更
- 有效的包名现在仅限于 Unicode XID 标识符。这与之前基本相同,但包名不能以数字或
-开头。 #7959 cargo new和init将警告或拒绝额外的包名(保留的 Windows 名称、保留的 Cargo 目录、非 ASCII 名称、冲突的标准库名称如core等)。 #7959- 测试不再硬链接到输出目录(
target/debug/)。这确保工具可以访问调试符号并以与 Cargo 相同的方式执行测试。工具应使用 JSON 消息来发现可执行文件的路径。 #7965 - 更新 Git 子模块现在会为每个子模块显示“Updating”消息。 #7989
- 提取
.crate文件时,现在保留文件修改时间。这扭转了 1.40 版本中不保留 mtime 的更改。 #7935 - 构建脚本警告在构建脚本失败时现在会单独显示。 #8017
- 移除了
git-checkout子命令。 #8040 - 进度条现在对所有 unix 平台启用。以前仅限于 Linux、macOS 和 FreeBSD。 #8054
- 由 pre-release 版本的
rustc生成的工件现在共享相同的文件名。这意味着更改 nightly 版本不会在构建目录中留下陈旧文件。 #8073 - 使用重命名依赖项时,无效的包名会被拒绝。 #8090
- 将某些类别的 HTTP2 错误添加为“虚假”错误,会进行重试。 #8102
- 允许
cargo package --list成功,即使存在其他验证错误(如Cargo.lock生成问题或缺少依赖项)。 #8175 #8215
修复
- Cargo 不再在内存中缓冲过多的编译器输出。 #7838
- Git 仓库中的符号链接现在在 Windows 上正常工作。 #7996
- 修复了一个问题:当
devprofile 未在Cargo.toml中定义时,使用cargo test时不会从配置文件加载profile.dev。 #8012 - 当二进制文件作为集成测试的隐式依赖项构建时,它现在会正确检查
required-features中的dep_name/feature_name语法。 #8020 - 修复了一个问题:当之前的构建被 Ctrl-C 中断时,Cargo 不会检测到可执行文件(如集成测试)需要重新构建。 #8087
- 防止在系统单调时钟似乎不单调时,Cargo 在某些(未知)情况下 panic。 #8114
- 修复了当包包含构建脚本时,
cargo clean -p引发的 panic。 #8216
仅 Nightly 版本
- 修复了使用新的特性解析器和 required-features 时引发的 panic。 #7962
- 添加了
RUSTC_WORKSPACE_WRAPPER环境变量,它提供了一种仅为工作空间成员封装rustc的方法,并影响文件名哈希,以便由 wrapper 生成的工件被单独缓存。可以在 nightly clippy 中使用cargo clippy -Zunstable-options看到这种用法。 #7533 - 添加了
--unit-graphCLI 选项,以 JSON 格式显示 Cargo 的内部依赖图。 #7977 - 将
-Zbuild_dep改名为-Zhost_dep,并将 proc-macros 添加到特性解耦逻辑中。 #8003 #8028 - 修复了当
RUSTDOCFLAGS中找到--crate-version标志时,不会自动传递该标志的问题。 #8014 - 修复了使用
-Zfeatures=dev_dep和check --profile=test时引发的 panic。 #8027 - 修复了使用
-Zfeatures=itarget和某些主机依赖项时引发的 panic。 #8048 - 添加了对
-Cembed-bitcode=no的支持,这为非 LTO 构建提供了性能提升并减少了磁盘空间使用。 #8066 -Zpackage-features已扩展,并添加了多项更改,旨在使其更容易在工作空间中的命令行上选择特性。 #8074
Cargo 1.43 (2020-04-23)
新增
- 🔥 Profile 现在可以在配置文件(和环境变量)中指定。 文档 #7823
- ❗ 在构建集成测试时,添加了
CARGO_BIN_EXE_<name>环境变量。此变量包含包中任何[[bin]]目标的路径。集成测试应使用env!宏来确定要执行的二进制文件的路径。 文档 #7697
变更
cargo install --git现在会尊重 Git 仓库中的工作空间。这允许使用工作空间设置,例如[patch]、[replace]或[profile]。 #7768cargo new现在将对新文件运行rustfmt,以应用 rustfmt 设置,例如tab_spaces,使新文件与用户首选的缩进设置一致。 #7827- 使用“非常详细”输出(
-vv)打印的环境变量现在排序一致。 #7877 - 指纹重建检测的调试日志现在包含更多信息。 #7888 #7890 #7952
- 如果 license-file 不存在,在 publish 期间添加警告。 #7905
- 即使 license-file 未在
include列表中明确列出,或者位于包根目录之外的位置,它也会在 publish 期间自动包含。 #7905 - 运行构建脚本时,
CARGO_CFG_DEBUG_ASSERTIONS和CARGO_CFG_PROC_MACRO不再设置。这些在过去曾被无意中设置,但没有任何意义,因为它们始终为 true。此外,cfg(proc-macro)在target表达式中不再受支持。 #7943 #7970
修复
- 全局命令行标志现在与别名一起使用(例如
cargo -v b)。 #7837 - 使用依赖项语法(如
renamed_dep/feat_name)的 Required-features 现在可以正确处理重命名的依赖项。 #7855 - 修复了一个罕见的情况:如果在同一构建期间多次运行构建脚本,Cargo 现在将单独保留结果,而不是丢失第一次执行的输出。 #7857
- 修复了对环境变量
CARGO_TARGET_*_RUNNER=true的错误解释,将其解释为布尔值。同时改进了相关的环境变量错误消息。 #7891 - 更新了内部 libgit2 库,带来了 Git 支持的各种修复。 #7939
cargo package/cargo publish不再在内存中缓冲每个文件的全部内容。 #7946- 忽略 Git 依赖项中更多无效的
Cargo.toml文件。Cargo 当前会遍历整个仓库以查找请求的包。某些无效的 manifests 已经被跳过,现在它应该跳过所有这些无效文件。 #7947
仅 Nightly 版本
- 添加了
build.out-dir配置变量来设置输出目录。 #7810 - 添加了
-Zjobserver-per-rustc特性,以支持改进并行 rustc 的性能。 #7731 - 修复了
build-std与cc等 crate 之间的文件名冲突问题。 #7860 -Ztimings现在即使发生错误也会保存其报告。 #7872- 更新了
--config命令行标志,以支持接受配置文件路径进行加载。 #7901 - 添加了新的特性解析器。 #7820
- Rustdoc 文档现在会自动在侧边栏中包含包的版本(需要
-Z crate-versions标志)。 #7903
Cargo 1.42 (2020-03-12)
新增
- 添加了关于 Git 身份验证的文档。 #7658
- crates.io 现在支持 Bitbucket Pipeline badge。 #7663
cargo vendor现在接受--versioned-dirs选项,强制它始终在每个包的目录名中包含版本号。 #7631proc_macrocrate 现在自动添加到 proc-macro 包的 extern prelude 中。这意味着对于 proc-macros 来说,extern crate proc_macro;不再是必需的。 #7700
变更
- 如果
debug_assertions、test、proc_macro或feature=在cfg()表达式中使用,则会发出警告。 #7660 - 大幅更新了 Cargo 文档,添加了关于 Cargo 目标、工作空间和特性的新章节。 #7733
- Windows:现在所有 Windows MSVC 目标都会将
.libDLL 导入库文件复制到 dll 旁边。以前仅支持pc-windows-msvc。这增加了对uwp-windows-msvc目标的 DLL 支持。 #7758 [target]配置中的ar字段不再读取。它已经被忽略了 4 年多。 #7763- Bash 补全文件简化并更新以适应最新更改。 #7789
- 凭证仅在需要时加载,而不是每个 Cargo 命令都加载。 #7774
修复
- 移除了
--offline空索引检查,这在某些情况下是误报。 #7655 - 可以通过将其添加到
include列表中,将以.开头的文件和目录包含在包中。 #7680 - 修复了当凭证文件中存在以前的条目时,
cargo login会删除备用 registry token 的问题。 #7708 - 修复了与备用 registry 一起使用时,
cargo vendor会 panic 的问题。 #7718 - 修复了指纹调试日志消息中不正确的解释。 #7749
- 多次定义的
[source]现在将导致错误。以前是随机选择一个 source,这可能导致不确定行为。 #7751 cargo metadata中的dep_kinds现在已去重。 #7756- 修复了打包时,
Cargo.lock列在 Git 仓库内的子目录中的.gitignore文件中的问题。以前它假设Cargo.lock位于仓库的根目录。 #7779 - 部分文件传输错误现在将触发自动重试。 #7788
- Linux: 修复了 CPU iowait stat 下降时引发的 panic。 #7803
- 修复了通过
RUSTFLAGS传递--sysroot时,使用错误的 sysroot 检测主机编译器设置的问题。 #7798
仅 Nightly 版本
build-std现在使用--extern而不是--sysroot来查找 sysroot 包。 #7699- 添加了
--config命令行选项来设置配置项。 #7649 - 添加了
include配置设置,允许包含另一个配置文件。 #7649 - 配置文件中的 profile 现在支持任何命名 profile。以前仅限于 dev/release。 #7750
Cargo 1.41 (2020-01-30)
新增
- 🔥 Cargo 现在使用新的
Cargo.lock文件格式。这种新格式应该更容易在源代码控制系统中进行合并,并通常使合并更改更安全。目前此新格式未启用,但 Cargo 如果看到它就会使用它。将来某个时候,计划将其设为默认格式。 #7579 - 🔥
cargo install现在会升级已安装的包,而不是失败。 #7560 - 🔥 已添加 profile 覆盖功能。这允许覆盖单个依赖项或构建脚本的 profile。更多信息请参阅文档。 #7591
- 添加了构建脚本的新文档。 #7565
- 添加了 Cargo JSON 输出的文档。 #7595
- 大量扩展了配置和环境变量文档。 #7650
- 重新添加了对
cargo doc --open的BROWSER环境变量支持。 #7576 - 为
cargo metadata中的依赖项添加了kind和platform。 #7132 OUT_DIR值现在包含在build-script-executedJSON 消息中。 #7622
变更
cargo doc现在默认会为二进制文件中的私有项生成文档。 #7593- 子命令拼写错误建议现在包含别名。 #7486
- 调整了在
.gitignore中添加“already existing…”注释的方式。 #7570 - 忽略 token 中来自复制/粘贴的
cargo login文本。 #7588 - Windows:如果文件系统不支持文件锁定,则忽略锁定文件的错误。 #7602
- 从
.gitignore中移除**/*.rs.bk。 #7647
修复
仅 Nightly 版本
Cargo 1.40 (2019-12-19)
新增
- 添加了
http.ssl-version配置选项来控制 TLS 版本,以及最小/最大版本。 #7308 - 🔥 编译器警告现在缓存在磁盘上。如果构建生成了警告,重新运行构建现在将重新显示警告。 #7450
- 为
cargo metadata添加了--filter-platform选项,以将解析器图中显示的节点限制为仅包含给定目标 triplet 的包。 #7376
变更
- Cargo 的“platform”
cfg解析已被提取到名为cargo-platform的单独 crate 中。 #7375 - 提取到 Cargo 缓存中的依赖项不再保留 mtimes,以减少系统调用开销。 #7465
- Windows:EXE 文件不再在文件名中包含元数据哈希。这有助于调试器将文件名与 PDB 文件关联。 #7400
- Wasm32:
.wasm文件不再被视为“可执行文件”,允许cargo test和cargo run与生成的.js文件正常工作。 #7476 - crates.io 现在支持 SPDX 3.6 许可证。 #7481
- 改进了循环依赖错误消息。 #7470
- 裸执行
cargo clean不再锁定包缓存。 #7502 cargo publish现在允许发布没有版本 key 的 dev-dependencies。git 或 path-only 的 dev-dependency 将在上传前从包 manifest 中移除。 #7333- 虚拟工作空间的根目录中的
--features和--no-default-features现在会生成错误,而不是被忽略。 #7507 - 包存档中生成的文件(如
Cargo.toml和Cargo.lock)的时间戳现在设置为当前时间,而不是 epoch 时间。 #7523 -Z标志解析器现在更加严格,拒绝更多无效语法。 #7531
修复
- 修复了一个问题:如果一个包有
include字段,并且.gitignore中有Cargo.lock,并且有一个二进制或示例目标,并且Cargo.lock在当前项目中存在,则会因为Cargo.lock是脏的而无法发布。 #7448 - 修复了特定组合的
[patch]条目导致的 panic。 #7452 - Windows:当
cargo test或rustc以非正常方式(如信号或 seg fault)崩溃时,会提供更好的错误消息。 #7535
仅 Nightly 版本
mtime-on-use特性现在可以通过unstable.mtime_on_use配置选项启用。 #7411- 添加了对命名 profile 的支持。 #6989
- 添加了
-Zpanic-abort-tests,允许使用“abort” panic 策略构建和运行测试。 #7460 - 将
build-std更改为使用--sysroot。 #7421 - 对
-Ztimings进行了各种修复和增强。 #7395 #7398 #7397 #7403 #7428 #7429 - Profile 覆盖功能已将语法重命名为
[profile.dev.package.NAME]。 #7504 - 修复了工作空间中未使用 profile 覆盖的警告。 #7536
Cargo 1.39 (2019-11-07)
新增
- 配置文件现在可以使用
.toml文件名扩展名。 #7295 - 已添加
--workspace标志作为--all的别名,以帮助避免关于“all”含义的混淆。 #7241 publish字段已添加到cargo metadata中。 #7354
变更
- 如果解析
rustc输出失败,显示更多信息。 #7236 - TOML 错误现在显示列号。 #7248
cargo vendor不再删除vendor目录中以.开头的文件。 #7242cargo fetch现在将显示 manifest 警告。 #7243cargo publish现在将检查 git 子模块是否包含任何未提交的更改。 #7245- 在构建脚本中,
cargo:rustc-flags现在允许没有空格的-l和-L标志。 #7257 - 当
cargo install替换旧版本的包时,现在会删除新安装版本中不再存在的任何已安装二进制文件。 #7246 - Git 依赖项现在在发布时也可以指定
versionkey。git值将从上传的 crate 中剥离,这与path依赖项的行为一致。 #7237 - 工作空间 default-members 的行为已更改。default-members 现在仅在工作空间根目录中运行 Cargo 时应用。以前无论 Cargo 在哪个目录运行都会始终应用。 #7270
- libgit2 已更新,包含了上游的所有更改。 #7275
- 更新
home依赖项以定位 home 目录。 #7277 - zsh 补全已更新。 #7296
- SSL 连接错误现在会重试。 #7318
- jobserver 已更改为获取 N 个 token(而不是 N-1),然后立即获取额外的 token。此更改是为了适应 Windows 上的
cccrate,允许它释放其隐式 token。 #7344 - 已更改用于选择下一个构建 crate 的调度算法。现在选择等待其完成的传递性 crate 数量最多的 crate。以前使用最大拓扑深度。 #7390
- RUSTFLAGS 不再包含在元数据和文件名哈希中,这撤销了 1.33 版本中添加此更改的决定。这意味着 RUSTFLAGS 的任何更改都会导致重新编译,并且不会影响符号 mangling。 #7459
修复
- 带有子模块且使用简写 SSH URL(如
git@github.com/user/repo.git)的 Git 依赖项现在应该可以正常工作。 #7238 - 在 macOS 上创建
.dSYM符号链接时处理损坏的符号链接。 #7268 - 修复了
[patch]表中同一 crate 多个版本的问题。 #7303 - 修复了自定义目标
.json文件的问题,其中名称的子字符串与不受支持的 crate 类型(如“bin”)匹配。 #7363 - 修复了生成 proc-macro crate 类型文档的问题。 #7159
- 修复了 Cargo 在构建线程内 panic 时会挂起的问题。 #7366
- 修复了如果
build.rs脚本在构建之间发出不同的rerun-if指令时,重建检测的问题。Cargo 在更改后错误地导致了重新构建。 #7373 - 正确处理
[patch]表条目的规范 URL,防止 patch 在首次使用后失效。 #7368 - 修复了一个问题:集成测试在开始自己的构建之前,会等待包二进制文件构建完成。它们现在可以并发构建。 #7394
- 修复了上一版本中关于
--features a b标志解释的意外更改,恢复了原始行为,即将其解释为--features a以及传递给命令的参数b。要传递多个特性,请在特性周围使用引号,例如--features "a b",或使用逗号分隔,或使用多个--features标志。 #7419
仅 Nightly 版本
- 添加了直接从 Cargo 构建标准库的基本支持。(文档) #7216
- 添加了
-Ztimings特性,用于生成关于单个编译步骤耗时的 HTML 报告。这也可以在控制台输出完成步骤和 JSON 数据。(文档) #7311 - 添加了交叉编译 doctests 的能力。(文档) #6892
Cargo 1.38 (2019-09-26)
新增
- 🔥 Cargo 构建流水线已默认启用,以在构建期间利用更多空闲 CPU 并行性。 #7143
- Cargo 的
--message-format选项现在可以指定多次,并接受逗号分隔的值列表。除了之前的值,它现在还接受json-diagnostic-short和json-diagnostic-rendered-ansi,用于配置来自 rustc 在json消息模式下的输出。 #7214 - crates.io 现在支持 Cirrus CI badge。 #7119
- 引入了新的
Cargo.lock文件格式。这种新格式旨在更频繁地避免源代码控制合并冲突,并通常使合并更改更安全。此新格式目前未启用,但 Cargo 如果看到它就会使用它。将来某个时候,计划将其设为默认格式。 #7070 - 为 FreeBSD 添加了进度条支持。 #7222
变更
-q标志不再抑制 Cargo 自身错误的根错误消息。 #7116- Cargo Book 现在使用 mdbook 0.3 发布,提供了多项格式修复和改进。 #7140
--features命令行标志现在可以指定多次。来自所有标志的特性列表将合并在一起。 #7084- 包 include/exclude glob-vs-gitignore 警告已移除。包现在可以使用 gitignore 风格的匹配,而不会产生任何警告。 #7170
- 当查询
rustc获取信息(如cfg值)时,如果解析rustc输出失败,Cargo 现在会显示命令和输出。 #7185 cargo package/cargo publish现在允许符号链接指向 git 子模块,以包含该子模块。 #6817- 改进了当版本要求不匹配任何版本但有 pre-release 版本可用时的错误消息。 #7191
修复
- 修复了当使用
git-fetch-with-cli配置选项且设置了GIT_DIR环境变量时,更新 Git 仓库时使用错误目录的问题。这可能发生在从 Git 回调运行 Cargo 时。 #7082 - 修复了具有独立调试输出的目标的 dep-info 文件被覆盖的问题。例如,带有
.dSYM目录的-apple-目标上的二进制文件会覆盖.d文件。 #7057 - 修复了
[patch]表未保留“每个 source 一个 major 版本”规则的问题。 #7118 - 忽略
cargo rustc命令中--remap-path-prefix标志的元数据哈希。这导致 remap 设置无意中影响符号名称。 #7134 - 修复了
[patch]依赖项中的循环检测问题。 #7174 - 修复了在 Windows 上当
core.symlinksgit 配置为 true 时,cargo new会留下符号链接的问题。同时添加了上游 libgit2 的多项修复和更新。 #7176 - macOS:修复了设置标志以标记
target目录应排除在备份之外的问题。 #7192 - 修复了在某些涉及多字节字符的情况下,
cargo fix会 panic 的问题。 #7221
仅 Nightly 版本
- 添加了
cargo fix --clippy,它将应用 Clippy 的机器可应用修复。 #7069 - 添加了
-Z binary-dep-depinfo标志,用于添加对二进制依赖项(如标准库)的更改跟踪。 #7137 #7219 cargo clippy-preview将始终运行,即使没有进行任何更改。 #7157- 修复了使用
CARGO_BUILD_PIPELINING时出现的指数级增长问题。 #7062 - 修复了在
cargo clippy-preview中向 clippy 传递 args 的问题。 #7162
Cargo 1.37 (2019-08-15)
新增
- 添加了
doctest字段到cargo metadata中,用于确定目标的文档是否已测试。 #6953 #6965 - 🔥
cargo vendor命令现在内置在 Cargo 中。此命令可用于在本地创建所有依赖项的源副本。 #6869 - 🔥 “publish lockfile” 特性现在稳定。如果包包含二进制可执行目标,此特性将自动包含
Cargo.lock文件在发布时。默认情况下,Cargo 在安装包时会忽略Cargo.lock。要强制 Cargo 使用发布包中包含的Cargo.lock文件,请使用cargo install --locked。这有助于确保cargo install一致地重现相同结果。当依赖项意外发布了 semver 不兼容的更改时,这可能也很有用,提供了一种回退到已知可工作的版本的方法。 #7026 - 🔥
default-run特性已稳定。当包包含多个二进制文件时,此特性允许您指定cargo run默认运行哪个二进制可执行文件。将Cargo.toml中[package]表的default-runkey 设置为要默认使用的二进制文件的名称。 #7056
变更
cargo package现在验证构建脚本不会创建空目录。 #6973- 如果
cargo doc生成重复的输出,现在会发出警告,这会导致文件被随机覆盖。这可能是由于多种原因(重命名的依赖项、同一包的多个版本、具有重命名库的包等)引起的。这是一个已知 bug,需要更多工作来正确处理。 #6998 - 使用
--features foo/bar启用依赖项特性将不再使用foo特性编译当前 crate,即使foo不是可选依赖项。 #7010 - 如果通过 RUSTFLAGS 传递
--remap-path-prefix,它将不再影响文件名元数据哈希。 #6966 - libgit2 已更新到 0.28.2,Cargo 使用它来访问 Git 仓库。自上次在 11 月更新以来,这带来了数百项更改和修复。 #7018
- Cargo 现在支持 rustc 生成的 dep-info 文件中的绝对路径。这为跟踪二进制文件(如 libstd)以便进行重建检测奠定了基础。(注意:这包含一个已知 bug。) #7030
修复
- 修复了 zsh 补全获取命令列表的方式。#6956
- 当
debug设置为 0 时,构建摘要中不再打印“+ debuginfo”。#6971 - 修复了当示例配置了
doc = true时,cargo doc可以正确生成文档的问题。#7023 - 如果在 CARGO_HOME 中无法获取只读锁,则不会失败。这在 CARGO_HOME 不存在,但使用了
--locked标志(表示不需要 CARGO_HOME)时很有帮助。#7149 - 撤销了 1.35 版本中 Cargo 阻塞在锁文件时释放 jobserver token 的更改。该更改在某些情况下导致了死锁。#7204
仅 Nightly 版本
- 添加了 编译器消息缓存。
-Z cache-messages标志使 Cargo 缓存编译器输出,以便后续运行可以重新显示之前的警告。#6933 -Z mtime-on-use不再触碰中间产物。#7050
Cargo 1.36 (2019-07-04)
新增
变更
- 可以在清单中添加
publish = ["crates-io"]以限制只能发布到 crates.io。#6838 - macOS: 仅在
DYLD_FALLBACK_LIBRARY_PATH未设置时包含默认路径。此外,从默认集合中移除了/lib。#6856 - 如果登录 token 不可用,
cargo publish现在会提前退出。#6854 - HTTP/2 流错误现在被视为“虚假”错误,并将触发重试。#6861
- 在一个依赖项上设置一个指向“required”依赖项的 feature 现在是一个错误。以前只是一个警告。#6860
registry.index配置值现在支持相对的file:URL。#6873- macOS:
.dSYM目录现在符号链接到示例二进制文件旁边,且不包含元数据哈希,以便调试器能够找到它。#6891 - 新项目的默认
Cargo.toml模板现在包含一个指向文档链接的注释。#6881 - crate 下载摘要的措辞有所改进。#6916 #6920
- ✨ 将
RUST_LOG环境变量更改为CARGO_LOG,以便使用logcrate 的用户代码不会显示 Cargo 的调试输出。#6918 - 打包时,
Cargo.toml现在总是包含在内,即使它未列在package.include中。#6925 - Package include/exclude 值现在使用 gitignore 模式而不是 glob 模式。#6924
- 当 crates.io 超时时提供更好的错误消息。还改进了其他 HTTP 响应代码的错误消息。#6936
性能
修复
- 更仔细地跟踪依赖项的磁盘指纹信息。这在构建中断并重新启动的罕见情况下有所帮助。#6832
cargo run现在可以正确地将非 UTF8 参数传递给子进程。#6849- 修复了 bash 补全,使其能在 macOS 的默认版本 bash 3.2 上运行。#6905
- zsh 补全的各种修复和改进。#6926 #6929
- 修复了如果
Cargo.lock文件丢失,cargo update会忽略-p参数的问题。#6904
仅 Nightly 版本
- 添加了
-Z install-upgradefeature,用于跟踪已安装 crates 的详细信息,并在它们过时时进行更新。#6798 - 添加了
public-dependencyfeature,该 feature 允许跟踪公共依赖项和私有依赖项。#6772 - 通过
build.pipelining配置选项(CARGO_BUILD_PIPELINING环境变量)添加了构建流水线。#6883 publish-lockfilefeature 有了一些重要变化。默认值现在为true,二进制 crate 的Cargo.lock文件总是会被发布。Cargo.lock文件现在在发布期间重新生成。cargo install现在默认忽略Cargo.lock文件,并且需要--locked才能使用该锁文件。如果检测到 yanked 依赖项,则会添加警告。#6840
Cargo 1.35 (2019-05-23)
新增
- 添加了
rustc-cdylib-link-arg键,用于构建脚本指定 cdylib crate 的链接器参数。#6298
变更
- 传递测试过滤器时,例如
cargo test foo,不再构建示例(除非它们设置了test = true)。#6683 - 将
--quiet标志从cargo test转发到 libtest harness,以便测试真正安静。#6358 cargo package中检查文件是否被修改的验证步骤现在更加严格。它使用内容的哈希而不是检查文件系统 mtime。它还会检查包中的“所有”文件。#6740- Jobserver token 现在在 Cargo 阻塞在文件锁上时释放。#6748
- 对之前 TOML 解析器中的一个 bug(允许具有相同名称的多个表头)发出警告。#6761
- 将
CARGO_PKG_*环境变量从元数据哈希中移除,并添加到指纹中。这意味着当这些值发生变化时,不会留下陈旧的产物。还将“repository”值添加到指纹中。#6785 cargo metadata不再显示resolve.nodes.deps中没有库的依赖项的null字段。该依赖项不再显示。#6534- 如果
cargo new中的authors字段设置为空字符串,则不再包含电子邮件地址。#6802 - 当为多个包生成文档时,
cargo doc --open现在可以正常工作。#6803 cargo install --path P现在从目录 P 加载.cargo/config文件。#6805- 在版本要求中使用 semver 元数据(例如
1.0.0+1234)现在会发出警告,表明它将被忽略。#6806 cargo install现在拒绝某些标志组合,这些组合会导致某些标志被忽略。#6801- 在某些情况下,解析器性能得到改进。#6776
修复
- 修复了运行分开的命令(例如先
cargo build再cargo test)时,第二个命令可能使用了构建脚本的陈旧结果的问题。#6720 - 修复了如果存在与根包目录匹配的
.gitignore文件时,cargo fix无法正常工作的问题。#6767 - 修复了如果在 profile 中设置了
panic=unwind时意外多次编译同一个库的问题。#6781 build.target配置值中 JSON 文件的路径现在被规范化,以修复构建依赖项的问题。#6778- 修复了如果在编译中断(例如被杀死)时重新运行构建脚本的问题。#6782
- 修复了
cargo new初始化 Fossil 仓库的问题。#6792 - 修复了在使用
git-fetch-with-clifeature 时支持更新被 force push 的 git 仓库的问题。当git-fetch-with-cli失败时,现在也会显示更多错误信息。#6800 - 针对 WASM 目标构建的
--example二进制文件已修复,不再在文件名中包含元数据哈希,并且在compiler-artifactJSON 消息中正确发出。#6812
仅 Nightly 版本
cargo clippy-preview现在是 Cargo 的内置命令。#6759build-overrideprofile 设置现在包含 proc-macro 及其依赖项。#6811- 可选依赖项和目标依赖项现在与
-Z offline配合得更好。#6814
Cargo 1.34 (2019-04-11)
新增
- 🔥 稳定了 备用 registry 的支持。#6654
- 添加了关于将 builds.sr.ht 持续集成与 Cargo 一起使用的文档。#6565
Cargo.lock现在顶部包含一个注释,表明它是@generated。#6548- 现在支持 Azure DevOps 徽章。#6264
- 如果
--exclude标志指定了未知包,则会添加警告。#6679
变更
cargo test --doc --no-run不执行任何操作,因此现在显示相应的错误。#6628- bash 补全的各种更新:添加缺失的选项和命令,支持 libtest 补全,使用 rustup 进行
--target补全,回退到文件名补全,修复命令行编辑。#6644 - 发布带有
[patch]段落的 crate 不再生成错误。[patch]段落在发布前从清单中移除。#6535 build.incremental = true配置值现在与CARGO_INCREMENTAL=1视为相同,以前它被忽略了。#6688- 来自 registry 的错误现在总是显示,无论 HTTP 响应代码如何。#6771
修复
- 修复了
cargo run --example的 bash 补全问题。#6578 - 修复了使用“本地”registry 并同时运行多个构建同一个 crate 的 Cargo 命令时的竞态条件。#6591
- 修复了进度条的一些闪烁和过度更新问题。#6615
- 修复了使用返回不正确凭据的 git 凭据助手时发生的挂起问题。#6681
- 修复了本地 registry 处理 yanked crate 的问题。#6750
仅 Nightly 版本
- 添加了
-Z mtime-on-use标志,以便在使用 crate 时更新文件系统上的 mtime。这旨在将来能够跟踪陈旧的产物,以便清理未使用的文件。#6477 #6573 - 添加了实验性的
-Z dual-proc-macros,用于为 host 和 target 构建 proc-macros。#6547
Cargo 1.33 (2019-02-28)
新增
compiler-artifactJSON 消息现在包含一个"executable"键,其中包含构建的执行文件的路径。#6363- man 手册页已重写,现在与 Web 文档一起发布。#6405
cargo login现在保存 token 后会显示确认信息。#6466- 如果
[patch]条目不匹配任何包,现在会发出警告。#6470 cargo metadata现在包含包的links键。#6480- 使用
-vv的“非常详细”输出现在显示 Cargo 运行进程时设置的环境变量。#6492 - 不带参数的
--example,--bin,--bench, 或--test现在列出这些选项可用的目标。#6505 - Windows: 如果进程以扩展状态退出代码失败,现在会显示代码的可读名称。#6532
- 为
cargo package和cargo publish命令添加了--features,--no-default-features, 和--all-features标志,以便在验证包时使用给定的 features。#6453
变更
- 如果
cargo fix在应用修复后编译失败,rustc 错误现在会显示在控制台上。#6419 - 隐藏
cargo login的--host标志,它未使用。#6466 - 构建脚本指纹现在包含 rustc 版本。#6473
- macOS: 切换到设置
DYLD_FALLBACK_LIBRARY_PATH而不是DYLD_LIBRARY_PATH。#6355 RUSTFLAGS现在包含在元数据哈希中,这意味着更改标志不会覆盖之前构建的文件。#6503- 更新 crate graph 时,不相关的 yanked crate 被错误地移除。如果可能,它们现在会保留在其原始版本。这导致在使用
cargo update -p somecrate时,不相关的包被降级。#5702 - TOML 文件现在支持 0.5 TOML 语法。
修复
cargo fix现在会忽略修改多个文件的建议。#6402cargo fix现在每次只修复一个目标,以处理共享相同源文件的目标。#6434- 修复了 bash 补全显示 Cargo 命令列表的问题。#6461
cargo init现在会避免在.gitignore文件中创建重复条目。#6521- 构建现在会尝试检测编译过程中文件是否被修改,以便您可以再次构建并获取新的更改。这是通过跟踪编译“开始”的时间(而不是结束的时间)来实现的。此外,撤销了 #5919,这意味着 Cargo 不再将相同的文件系统 mtime 视为需要重新构建。 #6484
仅 Nightly 版本
- 允许在
[patch]表中使用 registry“名称”而不是仅使用 URL。#6456 cargo metadata为依赖项添加了registry键。#6500- Registry 名称现在受限,与包名称采用相同的风格(字母数字,
-和_字符)。#6469 cargo login现在显示来自 registry 配置的/meURL。#6466cargo login --registry=NAME现在支持 token 的交互式输入。#6466- Registry 现在可以省略
config.json中的api键,以表明它们不支持 API 访问。#6466 - 修复了使用 metabuild 时,结合
--message-format=json导致 panic 的问题。#6432 - 修复了使用备用 registry 时,检测发布到 crates.io 的问题。#6525
Cargo 1.32 (2019-01-17)
新增
变更
- 🔥 HTTP/2 多路复用现在默认启用。可以使用
http.multiplexing配置值禁用它。#6271 - 使用 ANSI 转义序列清除行而不是空格。#6233
- 签出 git 依赖项时禁用 git 模板,这可能会导致问题。#6252
- 使用
net.git-fetch-with-cli选项时包含--update-head-okgit 标志。这有助于防止在 fetch 某些仓库时失败。#6250 - 在
cargo package的验证步骤中提取 crate 时,不再设置文件系统 mtime,这在某些罕见的文件系统上会导致失败。#6257 Cargo.toml中的crate-type = ["proc-macro"]现在与proc-macro = true视为相同。#6256- 如果在虚拟工作区中设置了
dependencies,features,target, 或badges,则会引发错误。如果在工作区成员中使用了replace或patch,则会显示警告。#6276 - 在某些情况下改进了解析器的性能。#6283 #6366
.rmeta文件不再硬链接到基本目标目录(target/debug)。#6292- 如果使用相同输出文件名构建多个目标,则会发出警告。#6308
- 使用
cargo build(不带--release)时,benchmark 现在使用“test”profile 构建,而不是“bench”。这使得调试 benchmark 更容易,并避免了令人困惑的行为。#6309 - 用户别名现在可以覆盖内置别名(
b,r,t, 和c)。#6259 - 设置
autobins=false现在会禁用推断目标的自动发现。#6329 - 如果项目使用了不稳定功能,
cargo verify-project现在会在 stable 版本上失败。#6326 - 现在允许名称中包含内部
.的平台目标。#6255 cargo clean --release现在仅删除 release 目录。#6349
修复
- 避免在
cargo new中为电子邮件地址添加额外的尖括号。#6243 - 如果设置了 CI 环境变量,进度条将被禁用。#6281
- 避免将所有 rustc 输出保留在内存中。#6289
- 如果 JSON 解析失败且 rustc 非零退出,不要丢失解析失败的消息。#6290
- 修复了重命名包含构建脚本的项目目录的问题。#6328
- 修复了如果示例设置了
crate_type = ["bin"]时,cargo run --example NAME无法正常工作的问题。#6330 - 修复了
cargo packagegit 发现过于激进的问题。--allow-dirty现在完全禁用 git 仓库检查。#6280 - 修复了
[patch]依赖项的构建变更跟踪问题,该问题导致cargo build在不应该重新构建时重新构建。#6493
仅 Nightly 版本
- 允许在 registry URL 中使用用户名。#6242
- 为 build-plan JSON 结构添加了
"compile_mode"键,以便能够区分运行自定义构建脚本和编译构建脚本。#6331 --out-dir不再复制构建脚本。#6300
Cargo 1.31 (2018-12-06)
新增
- 🔥 稳定了 2018 edition 的支持。#5984 #5989
- 🔥 添加了在 Cargo.toml 中重命名依赖项的功能。#6319
- 🔥 添加了对 HTTP/2 流水线和多路复用的支持。设置
http.multiplexing配置值以启用。#6005 - 添加了
http.debug配置值来调试 HTTP 连接。使用CARGO_HTTP_DEBUG=true RUST_LOG=cargo::ops::registry cargo build来显示调试信息。#6166 - 构建时会设置
CARGO_PKG_REPOSITORY环境变量,其值为Cargo.toml中的 repository 值。#6096
变更
cargo test --doc现在会拒绝其他标志,而不是忽略它们。#6037cargo install忽略~/.cargo/config。#6026cargo version --verbose现在与cargo -vV相同。#6076Cargo.lock顶部的注释现在得以保留。#6181- 在“非常详细”模式下构建时(
cargo build -vv),构建脚本输出会带有包名称和版本前缀,例如[foo 0.0.1]。#6164 - 如果
cargo fix --broken-code在应用修复后编译失败,文件不再恢复到原状,而是保留在其损坏状态。#6316
修复
- Windows: 使用
cargo run将 Ctrl-C 传递给进程。#6004 - macOS: 修复 bash 补全。#6038
- 在 bash 补全中支持补全
+toolchain时使用任意 toolchain 名称。#6038 - 修复了解析器在回溯失败的依赖项时的边缘情况。#5988
- 修复了
cargo test --all-targets导致 lib test 运行三次的问题。#6039 - 修复了向 crates.io 发布重命名依赖项的问题。#5993
- 修复了在包含多个二进制文件的 git 仓库上使用
cargo install的问题。#6060 - 修复了 rustc 发出的深度嵌套 JSON 丢失的问题。#6081
- Windows: 修复 msys 终端锁定宽度为 60 字符的问题。#6122
- 修复了带有破折号的重命名依赖项问题。#6140
- 修复了当 dylib 同时存在于
target/debug和target/debug/deps时,链接到错误的 dylib 的问题。#6167 - 修复了使用
panic=abort时的一些不必要的重新编译问题。#6170
仅 Nightly 版本
- 为
cargo install添加了--registry标志。#6128 - 添加了
registry.default配置值,用于指定如果未传递--registry标志时使用的默认 registry。#6135 - 为
cargo new和cargo init添加了--registry标志。#6135
Cargo 1.30 (2018-10-25)
新增
- 🔥 添加了动画进度条,显示构建过程中的进度。#5995
- 为
cargo metadata添加了resolve.nodes.deps键,它包含有关已解析依赖项的更多信息,并正确处理了重命名依赖项。#5871 - 创建包时,当未能发现 git 仓库中文件是否修改时,使用
-v提供更详细的信息。还修复了 Windows 上发现问题。#5858 - 在工作区中可以使用
--bin,--test,--example,--bench, 或--lib等过滤器,而无需选择特定的包。#5873 - 在工作区中可以使用
cargo run,而无需选择特定的包。#5877 cargo doc --message-format=json现在输出 rustdoc 的 JSON 消息。#5878- 添加了
--message-format=short以显示单行消息。#5879 - 在
.crate包中添加了.cargo_vcs_info.json文件,用于捕获当前的 git hash。#5886 - 添加了
net.git-fetch-with-cli配置选项,用于使用git可执行文件而不是内置的 libgit2 库来 fetch 仓库。#5914 - 添加了
required-features到cargo metadata。#5902 - 在包内使用
cargo uninstall现在会卸载该包。#5927 - 为
cargo fix添加了--allow-staged标志,允许在 git 中文件已暂存时运行。#5943 - 添加了
net.low-speed-limit配置值,并对 http 操作遵循net.timeout。#5957 - 为
cargo new添加了--edition标志。#5984 - 在 beta 期间临时稳定了 2018 edition 支持。#5984 #5989
- 添加了对
target.'cfg(…)'.runner配置值的支持,用于指定使用 config 表达式的目标的 run/test/bench runner。#5959
变更
- Windows:
cargo run在主进程退出时不会杀死子进程。#5887 - 切换到
openercrate 以使用cargo doc --open打开 Web 浏览器。这应该在所有平台更可靠地选择系统首选的浏览器。#5888 - 相同的文件 mtime 现在会导致目标被重新构建。以前只有当文件严格“新于”上次构建时才会导致重新构建。#5919
- 运行
cargo install时忽略build.target配置值。#5874 - 对
cargo fix忽略RUSTC_WRAPPER。#5983 - 忽略空的
RUSTC_WRAPPER。#5985
修复
- 修复了创建包含 edition 字段的
Cargo.toml包时出现的错误。#5908 - 在工作区中更一致地使用路径依赖项的相对路径。#5935
cargo fix现在总是运行,即使之前已经运行过。#5944- Windows: 尝试更可靠地检测终端宽度。基于 msys 的终端被强制宽度为 60 字符。#6010
- 允许
cargo doc --document-private-items使用多个 target 标志。6022