`cargo-add` syncs up all the dependencies

While doing cargo add <package>, it pulls up all the dependencies which package relies on irrespective of feature flags and targets.

Steps to reproduce:

  1. Create an empty project.
  2. Do cargo add eframe
  3. You will see the output containing dependencies like wasi, ndk-*, wgpu, etc which are behind other feature flags but still synced up.
(main) ~\playground\sass took 0.1s ❯ cargo add eframe
    Updating crates.io index
      Adding eframe v0.29.1 to dependencies
             Features:
             + accesskit
             + default_fonts
             + glow
             + wayland
             + web_screen_reader
             + x11
             - __screenshot
             - android-game-activity
             - android-native-activity
             - persistence
             - puffin
             - ron
             - serde
             - wgpu
    Updating crates.io index
     Locking 336 packages to latest compatible versions
      Adding ab_glyph v0.2.29
      Adding ab_glyph_rasterizer v0.1.8
      Adding accesskit v0.16.3
      Adding accesskit_atspi_common v0.9.3
      Adding accesskit_consumer v0.24.3
      Adding accesskit_macos v0.17.4
      Adding accesskit_unix v0.12.3
      Adding accesskit_windows v0.23.2
      Adding accesskit_winit v0.22.4
      Adding adler2 v2.0.0
      Adding allocator-api2 v0.2.18
      Adding android-activity v0.6.0
      Adding android-properties v0.2.2
      Adding android_system_properties v0.1.5
      Adding arboard v3.4.1
      Adding arrayref v0.3.9
      Adding arrayvec v0.7.6
      Adding as-raw-xcb-connection v1.0.1
      Adding ash v0.38.0+1.3.281
      Adding async-broadcast v0.7.1
      Adding async-channel v2.3.1
      Adding async-executor v1.13.1
      Adding async-fs v2.1.2
      Adding async-io v2.3.4
      Adding async-lock v3.4.0
      Adding async-process v2.3.0
      Adding async-recursion v1.1.1
      Adding async-signal v0.2.10
      Adding async-task v4.7.1
      Adding async-trait v0.1.83
      Adding atomic-waker v1.1.2
      Adding atspi v0.22.0 (latest: v0.24.0)
      Adding atspi-common v0.6.0 (latest: v0.8.0)
      Adding atspi-connection v0.6.0 (latest: v0.8.0)
      Adding atspi-proxies v0.6.0 (latest: v0.8.0)
      Adding bit-set v0.6.0 (latest: v0.8.0)
      Adding bit-vec v0.7.0 (latest: v0.8.0)
      Adding bitflags v1.3.2 (latest: v2.6.0)
      Adding block v0.1.6
      Adding block-buffer v0.10.4
      Adding block2 v0.5.1
      Adding blocking v1.6.1
      Adding bumpalo v3.16.0
      Adding bytemuck v1.19.0
      Adding bytemuck_derive v1.8.0
      Adding byteorder v1.5.0
      Adding byteorder-lite v0.1.0
      Adding bytes v1.8.0
      Adding calloop v0.13.0 (latest: v0.14.1)
      Adding calloop-wayland-source v0.3.0 (latest: v0.4.0)
      Adding cc v1.1.31
      Adding cesu8 v1.1.0
      Adding cfg_aliases v0.1.1 (latest: v0.2.1)
      Adding cfg_aliases v0.2.1
      Adding cgl v0.3.2
      Adding clipboard-win v5.4.0
      Adding codespan-reporting v0.11.1
      Adding com v0.6.0
      Adding com_macros v0.6.0
      Adding com_macros_support v0.6.0
      Adding combine v4.6.7
      Adding concurrent-queue v2.5.0
      Adding core-foundation v0.9.4 (latest: v0.10.0)
      Adding core-foundation v0.10.0
      Adding core-foundation-sys v0.8.7
      Adding core-graphics v0.23.2 (latest: v0.24.0)
      Adding core-graphics-types v0.1.3 (latest: v0.2.0)
      Adding cpufeatures v0.2.14
      Adding crc32fast v1.4.2
      Adding crossbeam-utils v0.8.20
      Adding crypto-common v0.1.6
      Adding cursor-icon v1.1.0
      Adding digest v0.10.7
      Adding dispatch v0.2.0
      Adding dlib v0.5.2
      Adding document-features v0.2.10
      Adding downcast-rs v1.2.1
      Adding dpi v0.1.1
      Adding ecolor v0.29.1
      Adding eframe v0.29.1
      Adding egui v0.29.1
      Adding egui-wgpu v0.29.1
      Adding egui-winit v0.29.1
      Adding egui_glow v0.29.1
      Adding emath v0.29.1
      Adding endi v1.1.0
      Adding enumflags2 v0.7.10
      Adding enumflags2_derive v0.7.10
      Adding epaint v0.29.1
      Adding epaint_default_fonts v0.29.1
      Adding equivalent v1.0.1
      Adding errno v0.3.9
      Adding error-code v3.3.1
      Adding event-listener v5.3.1
      Adding event-listener-strategy v0.5.2
      Adding fastrand v2.1.1
      Adding fdeflate v0.3.6
      Adding flate2 v1.0.34
      Adding foreign-types v0.5.0
      Adding foreign-types-macros v0.2.3
      Adding foreign-types-shared v0.3.1
      Adding form_urlencoded v1.2.1
      Adding futures-core v0.3.31
      Adding futures-io v0.3.31
      Adding futures-lite v2.3.0
      Adding futures-macro v0.3.31
      Adding futures-sink v0.3.31
      Adding futures-task v0.3.31
      Adding futures-util v0.3.31
      Adding generic-array v0.14.7 (latest: v1.1.0)
      Adding gethostname v0.4.3 (latest: v0.5.0)
      Adding gl_generator v0.14.0
      Adding glow v0.13.1 (latest: v0.15.0)
      Adding glow v0.14.2 (latest: v0.15.0)
      Adding glutin v0.32.1
      Adding glutin-winit v0.5.0
      Adding glutin_egl_sys v0.7.0
      Adding glutin_glx_sys v0.6.0
      Adding glutin_wgl_sys v0.6.0
      Adding gpu-alloc v0.6.0
      Adding gpu-alloc-types v0.3.0
      Adding gpu-allocator v0.26.0 (latest: v0.27.0)
      Adding gpu-descriptor v0.3.0
      Adding gpu-descriptor-types v0.2.0
      Adding hashbrown v0.14.5 (latest: v0.15.0)
      Adding hashbrown v0.15.0
      Adding hassle-rs v0.11.0
      Adding hermit-abi v0.4.0
      Adding hex v0.4.3
      Adding hexf-parse v0.2.1
      Adding home v0.5.9
      Adding idna v0.5.0 (latest: v1.0.2)
      Adding image v0.25.4
      Adding immutable-chunkmap v2.0.6
      Adding indexmap v2.6.0
      Adding jni v0.21.1
      Adding jni-sys v0.3.0 (latest: v0.4.0)
      Adding jobserver v0.1.32
      Adding js-sys v0.3.72
      Adding khronos-egl v6.0.0
      Adding khronos_api v3.1.0
      Adding libloading v0.8.5
      Adding libredox v0.1.3
      Adding linux-raw-sys v0.4.14 (latest: v0.6.5)
      Adding litrs v0.4.1
      Adding lock_api v0.4.12
      Adding log v0.4.22
      Adding malloc_buf v0.0.6 (latest: v1.0.0)
      Adding memchr v2.7.4
      Adding memmap2 v0.9.5
      Adding memoffset v0.9.1
      Adding metal v0.29.0 (latest: v0.30.0)
      Adding miniz_oxide v0.8.0
      Adding naga v22.1.0
      Adding ndk v0.9.0
      Adding ndk-context v0.1.1
      Adding ndk-sys v0.5.0+25.2.9519653 (latest: v0.6.0+11769913)
      Adding ndk-sys v0.6.0+11769913
      Adding nix v0.29.0
      Adding nohash-hasher v0.2.0
      Adding num_enum v0.7.3
      Adding num_enum_derive v0.7.3
      Adding objc v0.2.7
      Adding objc-sys v0.3.5
      Adding objc2 v0.5.2
      Adding objc2-app-kit v0.2.2
      Adding objc2-cloud-kit v0.2.2
      Adding objc2-contacts v0.2.2
      Adding objc2-core-data v0.2.2
      Adding objc2-core-image v0.2.2
      Adding objc2-core-location v0.2.2
      Adding objc2-encode v4.0.3
      Adding objc2-foundation v0.2.2
      Adding objc2-link-presentation v0.2.2
      Adding objc2-metal v0.2.2
      Adding objc2-quartz-core v0.2.2
      Adding objc2-symbols v0.2.2
      Adding objc2-ui-kit v0.2.2
      Adding objc2-uniform-type-identifiers v0.2.2
      Adding objc2-user-notifications v0.2.2
      Adding orbclient v0.3.48
      Adding ordered-stream v0.2.0
      Adding owned_ttf_parser v0.25.0
      Adding parking v2.2.1
      Adding parking_lot v0.12.3
      Adding parking_lot_core v0.9.10
      Adding paste v1.0.15
      Adding percent-encoding v2.3.1
      Adding pin-project v1.1.7
      Adding pin-project-internal v1.1.7
      Adding pin-project-lite v0.2.15
      Adding pin-utils v0.1.0
      Adding piper v0.2.4
      Adding pkg-config v0.3.31
      Adding png v0.17.14
      Adding polling v3.7.3
      Adding ppv-lite86 v0.2.20
      Adding presser v0.3.1
      Adding proc-macro-crate v3.2.0
      Adding profiling v1.0.16
      Adding quick-xml v0.30.0 (latest: v0.37.0)
      Adding quick-xml v0.36.2 (latest: v0.37.0)
      Adding rand v0.8.5
      Adding rand_chacha v0.3.1
      Adding rand_core v0.6.4
      Adding raw-window-handle v0.6.2
      Adding redox_syscall v0.4.1 (latest: v0.5.7)
      Adding redox_syscall v0.5.7
      Adding renderdoc-sys v1.1.0
      Adding rustc-hash v1.1.0 (latest: v2.0.0)
      Adding rustix v0.38.38
      Adding same-file v1.0.6
      Adding scoped-tls v1.0.1
      Adding scopeguard v1.2.0
      Adding sctk-adwaita v0.10.1
      Adding serde v1.0.214
      Adding serde_derive v1.0.214
      Adding serde_repr v0.1.19
      Adding sha1 v0.10.6
      Adding shlex v1.3.0
      Adding signal-hook-registry v1.4.2
      Adding simd-adler32 v0.3.7
      Adding slab v0.4.9
      Adding slotmap v1.0.7
      Adding smithay-client-toolkit v0.19.2
      Adding smithay-clipboard v0.7.2
      Adding smol_str v0.2.2 (latest: v0.3.2)
      Adding spirv v0.3.0+sdk-1.3.268.0
      Adding strict-num v0.1.1 (latest: v0.2.0)
      Adding syn v1.0.109 (latest: v2.0.85)
      Adding tempfile v3.13.0
      Adding termcolor v1.4.1
      Adding thiserror v1.0.65
      Adding thiserror-impl v1.0.65
      Adding tiny-skia v0.11.4
      Adding tiny-skia-path v0.11.4
      Adding tinyvec v1.8.0
      Adding tinyvec_macros v0.1.1
      Adding toml_datetime v0.6.8
      Adding toml_edit v0.22.22
      Adding tracing v0.1.40
      Adding tracing-attributes v0.1.27
      Adding tracing-core v0.1.32
      Adding ttf-parser v0.25.0
      Adding type-map v0.5.0
      Adding typenum v1.17.0
      Adding uds_windows v1.1.0
      Adding unicode-bidi v0.3.17
      Adding unicode-normalization v0.1.24
      Adding unicode-segmentation v1.12.0
      Adding unicode-width v0.1.14 (latest: v0.2.0)
      Adding unicode-xid v0.2.6
      Adding url v2.5.2
      Adding walkdir v2.5.0
      Adding wasm-bindgen v0.2.95
      Adding wasm-bindgen-backend v0.2.95
      Adding wasm-bindgen-futures v0.4.45
      Adding wasm-bindgen-macro v0.2.95
      Adding wasm-bindgen-macro-support v0.2.95
      Adding wasm-bindgen-shared v0.2.95
      Adding wayland-backend v0.3.7
      Adding wayland-client v0.31.7
      Adding wayland-csd-frame v0.3.0
      Adding wayland-cursor v0.31.7
      Adding wayland-protocols v0.32.5
      Adding wayland-protocols-plasma v0.3.5
      Adding wayland-protocols-wlr v0.3.5
      Adding wayland-scanner v0.31.5
      Adding wayland-sys v0.31.5
      Adding web-sys v0.3.72
      Adding web-time v1.1.0
      Adding webbrowser v1.0.2
      Adding wgpu v22.1.0
      Adding wgpu-core v22.1.0
      Adding wgpu-hal v22.0.0
      Adding wgpu-types v22.0.0
      Adding widestring v1.1.0
      Adding winapi v0.3.9
      Adding winapi-i686-pc-windows-gnu v0.4.0
      Adding winapi-util v0.1.9
      Adding winapi-x86_64-pc-windows-gnu v0.4.0
      Adding windows v0.52.0 (latest: v0.58.0)
      Adding windows v0.58.0
      Adding windows-core v0.52.0 (latest: v0.58.0)
      Adding windows-core v0.58.0
      Adding windows-implement v0.58.0
      Adding windows-interface v0.58.0
      Adding windows-result v0.2.0
      Adding windows-strings v0.1.0 (latest: v0.2.0)
      Adding windows-sys v0.45.0 (latest: v0.59.0)
      Adding windows-sys v0.52.0 (latest: v0.59.0)
      Adding windows-sys v0.59.0
      Adding windows-targets v0.42.2 (latest: v0.52.6)
      Adding windows-targets v0.48.5 (latest: v0.52.6)
      Adding windows-targets v0.52.6
      Adding windows_aarch64_gnullvm v0.42.2 (latest: v0.52.6)
      Adding windows_aarch64_gnullvm v0.48.5 (latest: v0.52.6)
      Adding windows_aarch64_gnullvm v0.52.6
      Adding windows_aarch64_msvc v0.42.2 (latest: v0.52.6)
      Adding windows_aarch64_msvc v0.48.5 (latest: v0.52.6)
      Adding windows_aarch64_msvc v0.52.6
      Adding windows_i686_gnu v0.42.2 (latest: v0.52.6)
      Adding windows_i686_gnu v0.48.5 (latest: v0.52.6)
      Adding windows_i686_gnu v0.52.6
      Adding windows_i686_gnullvm v0.52.6
      Adding windows_i686_msvc v0.42.2 (latest: v0.52.6)
      Adding windows_i686_msvc v0.48.5 (latest: v0.52.6)
      Adding windows_i686_msvc v0.52.6
      Adding windows_x86_64_gnu v0.42.2 (latest: v0.52.6)
      Adding windows_x86_64_gnu v0.48.5 (latest: v0.52.6)
      Adding windows_x86_64_gnu v0.52.6
      Adding windows_x86_64_gnullvm v0.42.2 (latest: v0.52.6)
      Adding windows_x86_64_gnullvm v0.48.5 (latest: v0.52.6)
      Adding windows_x86_64_gnullvm v0.52.6
      Adding windows_x86_64_msvc v0.42.2 (latest: v0.52.6)
      Adding windows_x86_64_msvc v0.48.5 (latest: v0.52.6)
      Adding windows_x86_64_msvc v0.52.6
      Adding winit v0.30.5
      Adding winnow v0.6.20
      Adding x11-dl v2.21.0
      Adding x11rb v0.13.1
      Adding x11rb-protocol v0.13.1
      Adding xcursor v0.3.8
      Adding xdg-home v1.3.0
      Adding xkbcommon-dl v0.4.2
      Adding xkeysym v0.2.1
      Adding xml-rs v0.8.22
      Adding zbus v4.4.0 (latest: v5.0.1)
      Adding zbus-lockstep v0.4.4
      Adding zbus-lockstep-macros v0.4.4
      Adding zbus_macros v4.4.0 (latest: v5.0.1)
      Adding zbus_names v3.0.0 (latest: v4.0.0)
      Adding zbus_xml v4.0.0 (latest: v5.0.0)
      Adding zvariant v4.2.0 (latest: v5.0.1)
      Adding zvariant_derive v4.2.0 (latest: v5.0.1)
      Adding zvariant_utils v2.1.0 (latest: v3.0.1)

Same thing happens with other packages like rhai.

Is this default behaviour, if yes is it correct?

That's because the Cargo.lock file needs to contain the entire state of the dependency tree regardless of target platform or feature flags. There is more information here: Cargo.toml vs Cargo.lock - The Cargo Book. And more specifically: Dependency Resolution - The Cargo Book.

Yes, it's the default behavior, and it is the correct thing to do.

2 Likes

Keep in mind that dependencies added to the lockfile can stay unused. When building, Cargo selects only the necessary dependencies to build, relevant to your platform and feature flags.

1 Like

Whether feature flags in your workspace are selected does not affect the lock file, but if no package in your workspace has any optional dependency on an external package's feature, that feature's dependencies on packages should be excluded from the lock file. From your second link:

For the purpose of generating Cargo.lock, the resolver builds the dependency graph as-if all features of all workspace members are enabled.

1 Like

Cool, thanks. I now have a clear understanding of the situation.

Ok, I'm unaware of the lock file excluding any part of the dependency tree. And I read the quoted section from the book as agreeing with my statement that all features are disregarded when generating the lock file. The word "exclude" doesn't even appear on that page.

edit: I see what you are saying. Optional dependencies are not included in the lock file if they are not enabled anywhere in the tree. Makes sense and it's a nice distinction.

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.