mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-01 06:21:13 +00:00
Unset target when creating virtual environments (#3362)
## Summary We were writing the build dependencies into the `--target` directory, which both made builds fail and led to them leaking into the user's directory. Closes https://github.com/astral-sh/uv/issues/3349.
This commit is contained in:
parent
4f87edbe66
commit
a63018591e
2 changed files with 118 additions and 2 deletions
|
@ -103,6 +103,7 @@ impl Interpreter {
|
||||||
scheme: virtualenv.scheme,
|
scheme: virtualenv.scheme,
|
||||||
sys_executable: virtualenv.executable,
|
sys_executable: virtualenv.executable,
|
||||||
prefix: virtualenv.root,
|
prefix: virtualenv.root,
|
||||||
|
target: None,
|
||||||
..self
|
..self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4809,9 +4809,9 @@ fn require_hashes_registry_invalid_hash() -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sync to a `--target` directory.
|
/// Sync to a `--target` directory with a built distribution.
|
||||||
#[test]
|
#[test]
|
||||||
fn target() -> Result<()> {
|
fn target_built_distribution() -> Result<()> {
|
||||||
let context = TestContext::new("3.12");
|
let context = TestContext::new("3.12");
|
||||||
|
|
||||||
// Install `iniconfig` to the target directory.
|
// Install `iniconfig` to the target directory.
|
||||||
|
@ -4900,3 +4900,118 @@ fn target() -> Result<()> {
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sync to a `--target` directory with a package that requires building from source.
|
||||||
|
#[test]
|
||||||
|
fn target_source_distribution() -> Result<()> {
|
||||||
|
let context = TestContext::new("3.12");
|
||||||
|
|
||||||
|
// Install `iniconfig` to the target directory.
|
||||||
|
let requirements_in = context.temp_dir.child("requirements.in");
|
||||||
|
requirements_in.write_str("iniconfig==2.0.0")?;
|
||||||
|
|
||||||
|
uv_snapshot!(command(&context)
|
||||||
|
.arg("requirements.in")
|
||||||
|
.arg("--no-binary")
|
||||||
|
.arg("iniconfig")
|
||||||
|
.arg("--target")
|
||||||
|
.arg("target"), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 1 package in [TIME]
|
||||||
|
Downloaded 1 package in [TIME]
|
||||||
|
Installed 1 package in [TIME]
|
||||||
|
+ iniconfig==2.0.0
|
||||||
|
"###);
|
||||||
|
|
||||||
|
// Ensure that the build requirements are not present in the target directory.
|
||||||
|
assert!(!context.temp_dir.child("target").child("hatchling").is_dir());
|
||||||
|
|
||||||
|
// Ensure that the package is present in the target directory.
|
||||||
|
assert!(context.temp_dir.child("target").child("iniconfig").is_dir());
|
||||||
|
|
||||||
|
// Ensure that we can't import the package.
|
||||||
|
context.assert_command("import iniconfig").failure();
|
||||||
|
|
||||||
|
// Ensure that we can import the package by augmenting the `PYTHONPATH`.
|
||||||
|
Command::new(venv_to_interpreter(&context.venv))
|
||||||
|
.arg("-B")
|
||||||
|
.arg("-c")
|
||||||
|
.arg("import iniconfig")
|
||||||
|
.env("PYTHONPATH", context.temp_dir.child("target").path())
|
||||||
|
.current_dir(&context.temp_dir)
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sync to a `--target` directory with a package that requires building from source, along with
|
||||||
|
/// `--no-build-isolation`.
|
||||||
|
#[test]
|
||||||
|
fn target_no_build_isolation() -> Result<()> {
|
||||||
|
let context = TestContext::new("3.12");
|
||||||
|
|
||||||
|
// Install `hatchling` into the current environment.
|
||||||
|
let requirements_in = context.temp_dir.child("requirements.in");
|
||||||
|
requirements_in.write_str("flit_core")?;
|
||||||
|
|
||||||
|
uv_snapshot!(command(&context)
|
||||||
|
.arg("requirements.in"), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 1 package in [TIME]
|
||||||
|
Downloaded 1 package in [TIME]
|
||||||
|
Installed 1 package in [TIME]
|
||||||
|
+ flit-core==3.9.0
|
||||||
|
"###);
|
||||||
|
|
||||||
|
// Install `iniconfig` to the target directory.
|
||||||
|
let requirements_in = context.temp_dir.child("requirements.in");
|
||||||
|
requirements_in.write_str("wheel")?;
|
||||||
|
|
||||||
|
uv_snapshot!(command(&context)
|
||||||
|
.arg("requirements.in")
|
||||||
|
.arg("--no-build-isolation")
|
||||||
|
.arg("--no-binary")
|
||||||
|
.arg("wheel")
|
||||||
|
.arg("--target")
|
||||||
|
.arg("target"), @r###"
|
||||||
|
success: true
|
||||||
|
exit_code: 0
|
||||||
|
----- stdout -----
|
||||||
|
|
||||||
|
----- stderr -----
|
||||||
|
Resolved 1 package in [TIME]
|
||||||
|
Downloaded 1 package in [TIME]
|
||||||
|
Installed 1 package in [TIME]
|
||||||
|
+ wheel==0.43.0
|
||||||
|
"###);
|
||||||
|
|
||||||
|
// Ensure that the build requirements are not present in the target directory.
|
||||||
|
assert!(!context.temp_dir.child("target").child("flit_core").is_dir());
|
||||||
|
|
||||||
|
// Ensure that the package is present in the target directory.
|
||||||
|
assert!(context.temp_dir.child("target").child("wheel").is_dir());
|
||||||
|
|
||||||
|
// Ensure that we can't import the package.
|
||||||
|
context.assert_command("import wheel").failure();
|
||||||
|
|
||||||
|
// Ensure that we can import the package by augmenting the `PYTHONPATH`.
|
||||||
|
Command::new(venv_to_interpreter(&context.venv))
|
||||||
|
.arg("-B")
|
||||||
|
.arg("-c")
|
||||||
|
.arg("import wheel")
|
||||||
|
.env("PYTHONPATH", context.temp_dir.child("target").path())
|
||||||
|
.current_dir(&context.temp_dir)
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue