-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Description
Problem
Given the following Cargo.toml file:
[package]
name = "rocket_web_server"
version = "0.1.0"
edition = "2021"
[dependencies]
diesel = { version = "=2.2.2", features = ["postgres"] }
[build-dependencies]
diesel_cli = { version = "=2.2.1", features = ["postgres"] }Cargo emits the following output:
$ cargo check
warning: rocket_web_server v0.1.0 (/tmp/test_diesel) ignoring invalid dependency `diesel_cli` which is missing a lib target
Compiling proc-macro2 v1.0.86
Compiling unicode-ident v1.0.12
Compiling ident_case v1.0.1
Compiling strsim v0.11.1
Compiling fnv v1.0.7
Compiling either v1.13.0
Compiling heck v0.5.0
Compiling pq-sys v0.6.1
Checking byteorder v1.5.0
Checking bitflags v2.6.0
Checking itoa v1.0.11
Compiling quote v1.0.36
Compiling syn v2.0.74
Compiling darling_core v0.20.10
Compiling diesel_table_macro_syntax v0.2.0
Compiling darling_macro v0.20.10
Compiling darling v0.20.10
Compiling dsl_auto_type v0.1.2
Compiling diesel_derives v2.2.2
Checking diesel v2.2.2
error[E0432]: unresolved import `diesel`
--> /home/weiznich/.cargo/registry/src/index.crates.io-6f17d22bba15001f/diesel-2.2.2/src/expression/functions/date_and_time.rs:30:1
|
30 | / define_sql_function! {
31 | | /// Represents the SQL `DATE` function. The argument should be a Timestamp
32 | | /// expression, and the return value will be an expression of type Date.
33 | | ///
... |
50 | | fn date(expr: Timestamp) -> Date;
51 | | }
| |_^ could not find `sqlite` in the crate root
// many more errors indicating that the sqlite feature was somewhat enabled by the `diesel_cli` build dependency
Relevant default features at the time of writing:
Diesel: no backends enabled
Diesel-CLI: postgres sqlite mysql
Steps
- Create a new crate
- Past the
Cargo.tomlcontent from above - Run
cargo check
Possible Solution(s)
Cargo should ignore features coming from invalid dependencies or it shouldn't claim that it ignored these dependencies.
Notes
As additional note: There is also some problematic behavior how features are unified here. The proc macro crate diesel-derives is build once for both the backend dependency and the build-dependency. Given that this must be a separate crate and we must generate feature dependent code there and cargo chooses to compile the crate once for both sets of features there is no way for us as diesel authors to generate the correct set of code. As far as I remember that is expected behavior but it is incredibility frustrating to not being able to fix that correctly on our side. It's also something our users sometimes running into and getting confusing error messages. Funnily it's something that worked with the old resolver. I remember that I raised this concern already back then while choosing to go with the v2 resolver by default for the 2021 edition but that concern was dismissed back then.
Version
cargo version --verbose
cargo 1.80.0 (376290515 2024-07-16)
release: 1.80.0
commit-hash: 37629051518c3df9ac2c1744589362a02ecafa99
commit-date: 2024-07-16
host: x86_64-unknown-linux-gnu
libgit2: 1.7.2 (sys:0.18.3 vendored)
libcurl: 8.6.0-DEV (sys:0.4.72+curl-8.6.0 vendored ssl:OpenSSL/1.1.1w)
ssl: OpenSSL 1.1.1w 11 Sep 2023
os: Fedora 40.0.0 [64-bit]
(The same happens with a recent nightly)