mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00
Add uv tool install
(#4492)
This is the minimal "working" implementation. In summary, we: - Resolve the requested requirements - Create an environment at `$UV_STATE_DIR/tools/$name` - Inspect the `dist-info` for the main requirement to determine its entry points scripts - Link the entry points from a user-executable directory (`$XDG_BIN_HOME`) to the environment bin - Create an entry at `$UV_STATE_DIR/tools/tools.toml` tracking the user's request The idea with `tools.toml` is that it allows us to perform upgrades and syncs, retaining the original user request (similar to declarations in a `pyproject.toml`). I imagine using a similar schema in the `pyproject.toml` in the future if/when we add project-levle tools. I'm also considering exposing `tools.toml` in the standard uv configuration directory instead of the state directory, but it seems nice to tuck it away for now while we iterate on it. Installing a tool won't perform a sync of other tool environments, we'll probably have an explicit `uv tool sync` command for that? I've split out todos into follow-up pull requests: - #4509 (failing on Windows) - #4501 - #4504 Closes #4485
This commit is contained in:
parent
b677a06aba
commit
c9657b0015
18 changed files with 744 additions and 26 deletions
|
@ -1838,6 +1838,8 @@ pub struct ToolNamespace {
|
|||
pub enum ToolCommand {
|
||||
/// Run a tool
|
||||
Run(ToolRunArgs),
|
||||
/// Install a tool
|
||||
Install(ToolInstallArgs),
|
||||
}
|
||||
|
||||
#[derive(Args)]
|
||||
|
@ -1881,6 +1883,46 @@ pub struct ToolRunArgs {
|
|||
pub python: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Args)]
|
||||
#[allow(clippy::struct_excessive_bools)]
|
||||
pub struct ToolInstallArgs {
|
||||
/// The command to install.
|
||||
pub name: String,
|
||||
|
||||
/// Use the given package to provide the command.
|
||||
///
|
||||
/// By default, the package name is assumed to match the command name.
|
||||
#[arg(long)]
|
||||
pub from: Option<String>,
|
||||
|
||||
/// Include the following extra requirements.
|
||||
#[arg(long)]
|
||||
pub with: Vec<String>,
|
||||
|
||||
#[command(flatten)]
|
||||
pub installer: ResolverInstallerArgs,
|
||||
|
||||
#[command(flatten)]
|
||||
pub build: BuildArgs,
|
||||
|
||||
#[command(flatten)]
|
||||
pub refresh: RefreshArgs,
|
||||
|
||||
/// The Python interpreter to use to build the tool environment.
|
||||
///
|
||||
/// By default, uv will search for a Python executable in the `PATH`. uv ignores virtual
|
||||
/// environments while looking for interpreter for tools. The `--python` option allows
|
||||
/// you to specify a different interpreter.
|
||||
///
|
||||
/// Supported formats:
|
||||
/// - `3.10` looks for an installed Python 3.10 using `py --list-paths` on Windows, or
|
||||
/// `python3.10` on Linux and macOS.
|
||||
/// - `python3.10` or `python.exe` looks for a binary with the given name in `PATH`.
|
||||
/// - `/home/ferris/.local/bin/python3.10` uses the exact Python at the given path.
|
||||
#[arg(long, short, env = "UV_PYTHON", verbatim_doc_comment)]
|
||||
pub python: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Args)]
|
||||
#[allow(clippy::struct_excessive_bools)]
|
||||
pub struct ToolchainNamespace {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue