sqlx
sqlx copied to clipboard
[sqlx-cli] prepare unable to find queries if cargo target-dir is set in config.toml
I generally use the following ~/.cargo/config.toml
[build]
target-dir = "/home/sedrik/.cargo/target"
But having this setup and a lib crate with binaries in it caused cargo sqlx prepare -- --lib --all-features to fail to find any new queries even if I did a cargo clean and removed the target directory. I also noted that sqlx's outputs files into the projects target directory but removing those as well did not help.
Removing the config for target-dir made prepare work again.
I've previously run into this as well. This would require a call to cargo metadata to be able to find the actual location (output contains a target_dir field), but requiring that for non-workspaces would be a breaking change for non-cargo build systems (unless they set CARGO_TARGET_DIR), see #1415.
Hmm, it would be nice to handle it if cargo is available though, or at least give a better error indicating what is wrong.
Hm yeah, doing it when cargo is available sounds like a good idea. Then the repeated cargo metadata calls that #1415 introduced can be removed again too. I don't think I have time to work on it myself, but I can write up some instructions if you're interested in writing the PR.
I can't say when/if I will have time to pick it up but if you write some instructions I will try to find some time for it :+1:
Okay so what I would do:
- Revert #1415
- Change
let cargo = env("CARGO").expect("CARGOmust be set");to anif let Ok(cargo) = env("CARGO") {}or similar and make theworkspace_rootfield optional for this to work - Add
target_dirnext toworkspace_rootand initialize it the same way - Make use of
target_dirwhereever{workspace_root}/targetis being used right now (maybe the workspace root doesn't even need to be queried then?)
I did an attempt at fixing this but it seems to me that it boils down to an issue in the rustc cli (I can't set out-dir in our specific case).
I did ask about it on zulip but haven't received a response yet.
Created a draft PR here with a, in my opinion, quite ugly workaround. Namely moving the files. I did verify that on Linux it works with and without a custom target directory.
https://github.com/launchbadge/sqlx/pull/1910
Here is an example of the error from my debugging session.
[sqlx-cli/src/prepare.rs:154] Command::new(&cargo).arg("rustc").args(cargo_args).arg("--").arg("--out-dir").arg(format!("{}",
metadata.target_directory.join("sqlx").display())).arg("--emit").arg("dep-info,metadata").arg("--cfg").arg(format!("__sqlx_recompile_trigger=\"{}\"",
SystemTime :: UNIX_EPOCH.elapsed()
?.as_millis())).env("SQLX_OFFLINE",
"false").env("DATABASE_URL", url) = "/home/sedrik/.cargo/bin/cargo" "rustc" "--lib" "--all-features" "--" "--out-dir" "/home/sedrik/.cargo/target/sqlx" "--emit" "dep-info,metadata" "--cfg" "__sqlx_recompile_trigger=\"1655408768682\""
Compiling data_collection_backend v2.6.1 (/home/sedrik/thefit/data-collection-backend)
error: Option 'out-dir' given more than once