uv icon indicating copy to clipboard operation
uv copied to clipboard

Store Python toolchains under XDG directory on macOS

Open baggiponte opened this issue 1 year ago • 17 comments
trafficstars

Hey there! Thanks for the amazing work. Using uv preview features and love it.

I noticed uv toolchain installs under $HOME/Library/Application Support. How does uv feel about following XDG spec? I saw ruff is doing it. For example, rye installs under $HOME/.local/share.

Also when I do uv toolchain list I get this result:

warning: `uv toolchain list` is experimental and may change without warning.
cpython-3.12.4-macos-aarch64-none       /opt/homebrew/opt/[email protected]/bin/python3.12
cpython-3.12.3-macos-aarch64-none       /Users/luca/Library/Application Support/uv/toolchains/cpython-3.12.3-macos-aarch64-none/install/bin/python3
cpython-3.11.9-macos-aarch64-none       /Users/luca/Library/Application Support/uv/toolchains/cpython-3.11.9-macos-aarch64-none/install/bin/python3
cpython-3.10.14-macos-aarch64-none      /Users/luca/Library/Application Support/uv/toolchains/cpython-3.10.14-macos-aarch64-none/install/bin/python3
cpython-3.9.19-macos-aarch64-none       /Users/luca/Library/Application Support/uv/toolchains/cpython-3.9.19-macos-aarch64-none/install/bin/python3
cpython-3.9.6-macos-aarch64-none        /Library/Developer/CommandLineTools/usr/bin/python3
cpython-3.8.19-macos-aarch64-none       /Users/luca/Library/Application Support/uv/toolchains/cpython-3.8.19-macos-aarch64-none/install/bin/python3

i.e. also Homebrew Python.

(I guess a uv pin or uv local command is coming soon, looking forward to it.)

baggiponte avatar Jun 19 '24 13:06 baggiponte

We're talking about it e.g. https://github.com/astral-sh/uv/pull/2236 and https://github.com/astral-sh/uv/pull/3049 and https://github.com/astral-sh/ruff/issues/10739

I think it's fairly clear that people prefer the XDG directory for configuration on macOS but I'm not sure what to think of application "state" like this.

zanieb avatar Jun 19 '24 14:06 zanieb

Personally I'm pretty interested it's just weird to go against the platform standard and notably our cache is also not using the XDG directory on macOS.

zanieb avatar Jun 19 '24 14:06 zanieb

Thanks for the prompt reply! As far as Python interpreter discovery, what do you plan to support? Anyway, feel free to close this 😊

baggiponte avatar Jun 19 '24 14:06 baggiponte

I'm happy to leave it open to gauge interest. Maybe we need a special toggle.

Python interpreter discovery is a whole thing :) I don't think we should chat about it in the issue, but you could take a look at the supported sources. https://github.com/astral-sh/uv/issues/4198 will address your question about the system interpreters being listed.

zanieb avatar Jun 19 '24 14:06 zanieb

+1 for ~/.local, etc. Effectively treating macOS like Linux in this regard.

dsully avatar Jun 20 '24 01:06 dsully

Just chiming in here to say that I'd rather keep the current behavior. XDG is not relevant for macOS and I'd like uv to follow the platform's standards, not those of a Linux system. That said, I have not yet read any of the referenced issues / discussions.

hoechenberger avatar Jun 20 '24 05:06 hoechenberger

Just chiming in here to say that I'd rather keep the current behavior. XDG is not relevant for macOS and I'd like uv to follow the platform's standards, not those of a Linux system. That said, I have not yet read any of the referenced issues / discussions.

I see your point, but there are already plenty of programs that, if XDG_* vars are set on macos, will comply with that. It's handy because as a developer it improves the way I manage things (dotfiles, knowing where to go when I need to free up ram...). I don't remember how it ended up there, but there are a bunch of jetbrains stuff under my ~/.local/share too.

It's also fair to say there are plenty of programs that don't care. VSCode, for example, slams everything under $HOME, IIRC plugins included.

EDIT: My point is: it feels it's more of a standard for GUIs/Applications than programs.

baggiponte avatar Jun 20 '24 09:06 baggiponte

@baggiponte I absolutely agree that many programs don't respect the OS conventions 😃 When developing Python packages, for example, I therefore make use of platformdirs, which automatically does "the right thing" when it comes to figuring out where to store config files, temporary data etc. I'd argue it's good practice to follow this approach ... I'm not looking to start a fight over this :) just wanted to share my opinion.

best wishes! Richard

hoechenberger avatar Jun 20 '24 10:06 hoechenberger

To be clear - as long as the $XDG_* variables are respected as @baggiponte says, I'm good with that approach.

dsully avatar Jun 20 '24 11:06 dsully

Ah! Got you! Yes this does make sense.

hoechenberger avatar Jun 20 '24 11:06 hoechenberger

For context, we do use XDG for configuration file discovery so there's some precedent there.

charliermarsh avatar Jun 23 '24 15:06 charliermarsh

Another datapoint is that pipx uses the XDG spec for storing installed tools.

zanieb avatar Jun 24 '24 21:06 zanieb

Another datapoint is that pipx uses the XDG spec for storing installed tools.

Speaking of, tools that are installed with uv tool install will have to be added to $PATH somehow. I don't think I ever saw adding $HOME/Library/Application Support/uv/ to $PATH. IIRC, rye prompts you to use shims.

baggiponte avatar Jun 29 '24 21:06 baggiponte

Tool installation places binaries entry points according to the XDG specification on all platforms https://github.com/astral-sh/uv/blob/13b0beb56fdc607c1f38d820dbf8c95c8fd0ce84/crates/uv-tool/src/lib.rs#L264-L275

But that doesn't mean we need to place the virtual environment there.

Regardless, I'm leaning towards switching to XDG entirely on macOS.

zanieb avatar Jun 29 '24 22:06 zanieb

@zanieb - We still may need something like pipx ensurepath for all this stuff though -- it's not guaranteed that they're on the user PATH IIUC.

charliermarsh avatar Jun 30 '24 17:06 charliermarsh

Yeah of course — that's described in #3560 but I'll create a specific issue.

edit: We should at least do #4671

zanieb avatar Jun 30 '24 22:06 zanieb

I've opened a pull request to support the variable if set https://github.com/astral-sh/uv/pull/4769

zanieb avatar Jul 03 '24 13:07 zanieb