• 亮色
  • 深色
  • 自动
  • RSS 订阅

    uv 学习记录

    2024-04-02

    真香定律?

    不知道是 pdm 和 micromamba 搭配有问题,还是和 conda 系搭配有问题,有时候安装依赖会莫名其妙报错,网上搜索也没有相关资料,甚至 pyprojcet.toml 里给 ruff 指定 pylint 规则也会报错。

    看 uv 介绍未来路线还打算支持类似 pyenv 和 poetry 之类的工具,所以还是决定试试 uv:

    Think: a single binary that bootstraps your Python installation and gives you everything you need to be productive with Python, bundling not only pip, pip-tools, and virtualenv, but also pipx, tox, poetry, pyenv, ruff, and more.

    然后我决定来试试这个。

    默认 uv 使用系统内已有的 Python 版本,因为系统版本一般都比较老,且 uv 使用 conda 中的 python 环境(通过当前激活的 conda 环境设置的 CONDA_PREFIX 读取),所以我还是继续使用 micromamba,或许后面会换成 miniconda。

    安装

    下面是 Linux/Mac 的安装命令,使用 pip 也能装,但这里就不演示了。

    curl -LsSf https://astral.sh/uv/install.sh | sh
    

    别名设置

    感觉 uv pip 还是太长了,而且总给我一种它内置了 pip 的感觉,所以我给这个命令设置了别名:

    alias up='uv pip'
    

    这样就舒服多了。

    依赖

    安装依赖

    小贴士

    命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用 --index-url 参数。或是在环境变量中设置 UV_INDEX_URL 使得可以自动使用镜像战点。

    uv pip install fastapi
    

    生成依赖

    小贴士

    命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用 --index-url 参数。或是在环境变量中设置 UV_INDEX_URL 使得可以自动使用镜像战点。

    下面列出从各个来源生成依赖的方式:

    1. 从当前环境生成:

      uv pip freeze | uv pip compile - -o requirements.txt
      
    2. 从 requirements.in:

      uv pip compile requirements.in -o requirements.txt
      
    3. 从 pyproject.toml:

      uv pip compile pyproject.toml -o requirements.txt
      
    4. 从 setup.py:

      uv pip compile setup.py -o requirements.txt
      
    5. 传递依赖名称:

      echo flask | uv pip compile - -o requirements.txt
      

    依赖同步

    小贴士

    命令可能会访问网络,如果当前网络不好,需要访问 pypi 镜像站点的话,可以使用 --index-url 参数。或是在环境变量中设置 UV_INDEX_URL 使得可以自动使用镜像战点。

    如果要让当前环境与依赖文件中的同步,则使用如下命令:

    uv pip sync requirements.txt
    

    如果要同步多个文件中的依赖,可以直接在后面加:

    uv pip sync requirements.txt requirements.prod.txt
    

    环境变量

    小贴士

    至目前版本(0.1.27),环境变量的值都可以在使用命令时指定参数进行替代。

    • UV_INDEX_URL: 相当于 --index-url 命令行参数。如果设置,uv 将使用此 URL 作为搜索包的基本索引。
    • UV_EXTRA_INDEX_URL: 相当于 --extra-index-url 命令行参数。如果设置,uv 将在搜索包时使用此空格分隔的 URL 列表作为附加索引。
    • UV_CACHE_DIR: 相当于 --cache-dir 命令行参数。如果设置,uv 将使用此目录进行缓存,而不是默认的缓存目录。
    • UV_NO_CACHE: 相当于 --no-cache 命令行参数。如果设置,uv 将不会使用缓存进行任何操作。在 Dockerfile 可以用的上。
    • UV_RESOLUTION: 相当于 --resolution 命令行参数。例如,如果设置为 lowest-direct,uv 将安装所有直接依赖项的最低兼容版本。
    • UV_PRERELEASE: 相当于 --prerelease 命令行参数。例如,如果设置为 allow,uv 将允许所有依赖项的预发布版本。
    • UV_SYSTEM_PYTHON: 相当于 --system 命令行参数。如果设置为 true,uv 将使用系统中找到的第一个 Python 解释器 PATH
    • UV_NATIVE_TLS: 相当于 --native-tls 命令行参数。如果设置为 true,uv 将使用系统的信任存储而不是捆绑的 webpki-rootscrate。

    警告

    UV_SYSTEM_PYTHON=true 适用于持续集成 (CI) 环境,应谨慎使用,因为它可能会修改系统 Python 安装。感觉可能也可以用在 Dockerfile 里。

    还有一些其他的环境变量就不介绍了。

    上手

    我是先创建一个 conda 环境,然后再激活这个 conda 环境,然后使用 uv:

    mkdir myprojcet
    cd myprojcet
    
    conda create -p ./.venv -yq python=3.11
    conda activate ./.venv
    
    uv pip install fastapi
    

    感觉目前这个项目还是太早期了,依赖还有环境管理虽然都有计划但目前都还没实现,就在个人项目里玩玩吧。