如何排查Rust中proc_macro_span_shrink未知特性依赖问题?
编译错误排查:
proc_macro_span_shrink未知特性问题 错误信息
error[E0635]: unknown feature `proc_macro_span_shrink` --> ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/proc-macro2-1.0.50/src/lib.rs:92:30 | 92 | feature(proc_macro_span, proc_macro_span_shrink) | ^^^^^^^^^^^^^^^^^^^^^^ For more information about this error, try `rustc --explain E0635`. error: could not compile `proc-macro2` (lib) due to previous error
背景与需求
之前通过切换到特定旧版nightly编译版本解决过该问题,但该方案不适用于当前项目,希望找到更通用的解决方法。推测是依赖版本过时或存在可移除的依赖,但错误信息未指明具体对象。
已执行cargo tree -e features -i proc-macro2命令,输出如下,但未找到与proc_macro_span_shrink直接相关的项:
proc-macro2 v1.0.50 ├── quote v1.0.17 │ └── syn v1.0.90 │ └── proc-macro-error v1.0.4 │ ├── proc-macro-error feature "default" │ │ ├── clap_derive v4.1.8 (proc-macro) │ │ │ └── clap_derive feature "default" │ │ │ └── clap v4.1.8 │ │ │ ├── clap feature "color" │ │ │ │ └── clap feature "default" │ │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) │ │ │ │ └── petersburg feature "default" (command-line) │ │ │ ├── clap feature "default" (*) │ │ │ ├── clap feature "derive" │ │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) (*) │ │ │ ├── clap feature "error-context" │ │ │ │ ├── clap feature "default" (*) │ │ │ │ └── clap feature "suggestions" │ │ │ │ └── clap feature "default" (*) │ │ │ ├── clap feature "help" │ │ │ │ └── clap feature "default" (*) │ │ │ ├── clap feature "std" │ │ │ │ └── clap feature "default" (*) │ │ │ ├── clap feature "suggestions" (*) │ │ │ └── clap feature "usage" │ │ │ └── clap feature "default" (*) │ │ ├── glib-macros v0.15.10 (proc-macro) │ │ │ └── glib-macros feature "default" │ │ │ └── glib v0.15.10 │ │ │ └── glib feature "default" │ │ │ ├── atk v0.15.1 │ │ │ │ └── atk feature "default" │ │ │ │ └── gtk v0.15.4 │ │ │ │ └── gtk feature "default" │ │ │ │ └── petersburg v0.0.1 ~/Github/petersburg) (*) │ │ │ ├── cairo-rs v0.15.10 │ │ │ │ ├── cairo-rs feature "default" │ │ │ │ │ ├── gdk v0.15.4 │ │ │ │ │ │ └── gdk feature "default" │ │ │ │ │ │ ├── gtk v0.15.4 (*) │ │ │ │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) (*) │ │ │ │ │ ├── gtk v0.15.4 (*) │ │ │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) (*) │ │ │ │ ├── cairo-rs feature "glib" │ │ │ │ │ └── cairo-rs feature "use_glib" │ │ │ │ │ └── cairo-rs feature "default" (*) │ │ │ │ ├── cairo-rs feature "png" │ │ │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) (*) │ │ │ │ └── cairo-rs feature "use_glib" (*) │ │ │ ├── gdk v0.15.4 (*) │ │ │ ├── gdk-pixbuf v0.15.10 │ │ │ │ └── gdk-pixbuf feature "default" │ │ │ │ ├── gdk v0.15.4 (*) │ │ │ │ └── gtk v0.15.4 (*) │ │ │ ├── gio v0.15.10 │ │ │ │ └── gio feature "default" │ │ │ │ ├── gdk v0.15.4 (*) │ │ │ │ ├── gdk-pixbuf v0.15.10 (*) │ │ │ │ └── gtk v0.15.4 (*) │ │ │ ├── gtk v0.15.4 (*) │ │ │ ├── pango v0.15.10 │ │ │ │ └── pango feature "default" │ │ │ │ ├── gdk v0.15.4 (*) │ │ │ │ └── gtk v0.15.4 (*) │ │ │ └── petersburg v0.0.1 (~/Github/petersburg) (*) │ │ └── gtk3-macros v0.15.4 (proc-macro) │ │ └── gtk3-macros feature "default" │ │ └── gtk v0.15.4 (*) │ ├── proc-macro-error feature "syn" │ │ └── proc-macro-error feature "syn-error" │ │ └── proc-macro-error feature "default" (*) │ └── proc-macro-error feature "syn-error" (*) │ ├── syn feature "clone-impls" │ │ └── syn feature "default" │ │ ├── clap_derive v4.1.8 (proc-macro) (*) │ │ └── thiserror-impl v1.0.30 (proc-macro) │ │ └── thiserror-impl feature "default" │ │ └── thiserror v1.0.30 │ │ └── thiserror feature "default" │ │ ├── cairo-rs v0.15.10 (*) │ │ ├── gio v0.15.10 (*) │ │ ├── glib v0.15.10 (*) │ │ └── proc-macro-crate v1.1.3 │ │ └── proc-macro-crate feature "default" │ │ ├── glib-macros v0.15.10 (proc-macro) (*) │ │ └── gtk3-macros v0.15.4 (proc-macro) (*) │ ├── syn feature "default" (*) │ ├── syn feature "derive" │ │ └── syn feature "default" (*) │ ├── syn feature "full" │ │ ├── clap_derive v4.1.8 (proc-macro) (*) │ │ ├── glib-macros v0.15.10 (proc-macro) (*) │ │ └── gtk3-macros v0.15.4 (proc-macro) (*) │ ├── syn feature "parsing" │ │ └── syn feature "default" (*) │ ├── syn feature "printing" │ │ └── syn feature "default" (*) │ ├── syn feature "proc-macro" │ │ └── syn feature "default" (*) │ └── syn feature "quote" │ ├── syn feature "printing" (*) │ └── syn feature "proc-macro" (*) │ ├── quote feature "default" │ │ ├── clap_derive v4.1.8 (proc-macro) (*) │ │ ├── glib-macros v0.15.10 (proc-macro) (*) │ │ ├── gtk3-macros v0.15.4 (proc-macro) (*) │ │ ├── proc-macro-error v1.0.4 (*) │ │ ├── proc-macro-error-attr v1.0.4 (proc-macro) │ │ │ └── proc-macro-error-attr feature "default" │ │ │ └── proc-macro-error v1.0.4 (*) │ │ └── thiserror-impl v1.0.30 (proc-macro) (*) │ └── quote feature "proc-macro" │ ├── quote feature "default" (*) │ └── syn feature "proc-macro" (*) └── syn v1.0.90 (*) ├── proc-macro2 feature "default" │ ├── clap_derive v4.1.8 (proc-macro) (*) │ ├── glib-macros v0.15.10 (proc-macro) (*) │ ├── gtk3-macros v0.15.4 (proc-macro) (*) │ ├── proc-macro-error v1.0.4 (*) │ ├── proc-macro-error-attr v1.0.4 (proc-macro) (*) │ └── thiserror-impl v1.0.30 (proc-macro) (*) └── proc-macro2 feature "proc-macro" ├── proc-macro2 feature "default" (*) ├── quote feature "proc-macro" (*) └── syn feature "proc-macro" (*)
排查方法与解决方案
1. 定位proc-macro2特性触发原因
- 打开本地proc-macro2 1.0.50的源码文件(路径见错误信息),查看第92行
feature宏的前置cfg条件,确认该特性是在什么场景下启用的(比如是否依赖proc-macro特性或特定rustc版本)。 - 查看该版本proc-macro2的
Cargo.toml,确认proc_macro_span_shrink是否关联到某个feature flag,或是根据rustc版本自动启用。
2. 强制升级proc-macro2到兼容版本
proc_macro_span_shrink是旧版nightly特性,proc-macro2 1.0.60+已移除对该特性的依赖,改用稳定API。在项目Cargo.toml中添加补丁强制升级:
[patch.crates-io] proc-macro2 = { version = "1.0.60" }
运行cargo update -p proc-macro2更新后重新编译。
3. 检查rustc版本与特性兼容性
- 执行
rustc --version确认当前编译器版本:proc_macro_span_shrink在rustc 1.64左右被移除,稳定版或较新nightly会识别不到该特性。 - 若使用稳定版rustc,确保proc-macro2未被启用
unstable特性(该特性会强制启用nightly-only API)。
4. 查找启用unstable特性的依赖
执行以下命令查看哪些依赖启用了proc-macro2的unstable特性:
cargo tree --features proc-macro2/unstable
找到对应依赖后,升级该依赖到不依赖unstable特性的版本,或在Cargo.toml中禁用该依赖的相关特性。
5. 逐步排查依赖
暂时移除项目中的非核心依赖,逐个添加并编译,定位引入问题的依赖包,再针对性处理该依赖的版本或特性。
内容的提问来源于stack exchange,提问作者Edward Peters
相关产品推荐
相关产品推荐

