sqlx icon indicating copy to clipboard operation
sqlx copied to clipboard

[sqlx-cli] prepare unable to find queries if cargo target-dir is set in config.toml

Open sedrik opened this issue 3 years ago • 7 comments

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.

sedrik avatar Feb 15 '22 13:02 sedrik

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.

jplatte avatar Feb 15 '22 13:02 jplatte

Hmm, it would be nice to handle it if cargo is available though, or at least give a better error indicating what is wrong.

sedrik avatar Feb 15 '22 14:02 sedrik

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.

jplatte avatar Feb 15 '22 14:02 jplatte

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:

sedrik avatar Feb 15 '22 14:02 sedrik

Okay so what I would do:

  • Revert #1415
  • Change let cargo = env("CARGO").expect("CARGO must be set"); to an if let Ok(cargo) = env("CARGO") {} or similar and make the workspace_root field optional for this to work
  • Add target_dir next to workspace_root and initialize it the same way
  • Make use of target_dir whereever {workspace_root}/target is being used right now (maybe the workspace root doesn't even need to be queried then?)

jplatte avatar Mar 01 '22 16:03 jplatte

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

sedrik avatar Jun 16 '22 20:06 sedrik

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

sedrik avatar Jun 16 '22 20:06 sedrik