python 包管理一站式解决方案: rye, 相对于其他包管理工具如pyenv, poetry等,它的优势就是能够更快地帮助开发者开发和构建项目。
从创建一个新项目开始
初始化项目
rye init rye-demo
项目的布局如下,可以看到rye很贴心的做了至少2件事
- 初始化了git
- 生成了核心管理文件
pyproject.toml
和.python-version
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
└── rye_demo
pyproject.toml
[project]
name = "rye-demo"
version = "0.1.0"
description = "Add your description here"
authors = [
{ name = "xxxx", email = "xxxx" }
]
dependencies = []
readme = "README.md"
requires-python = ">= 3.11, <3.12"
[build-system]
# 可选的构建工具有hatchling, setuptools, flit, pdm, maturin
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.rye]
managed = true
# 排除了一些间接但是一直都没有用的依赖
excluded-dependencies = []
# rye add --dev xxx
dev-dependencies = []
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["src/rye_demo"]
这里解释一下什么是virtual project
?对rye来说,Python包大致可以分为二类
real package
:目的是为了共享,这也是最常见的包比如fastapi, mkdoc等等,它们作为依赖添加到其他的应用中,提供功能性的作用virtual project
:可以看作是聚合了一堆的依赖包,比如基于fastapi构建的应用,你的目的是为了提供服务而不是依赖,你并不想发布出去当做依赖。从理解角度而言叫"应用"似乎更合适一点
rye的一个特色就是便捷的脚本构建,现在看一下简单的脚本
[tool.rye.scripts]
echo_hello = { cmd = ["echo", "rye"] }
现在运行rye run echo_hello
就会打印rye
支持指定env文件,在开发中,不管是脚本还是应用中通过指定环境变量的方式来配置项目是非常的需要。
[tool.rye.scripts]
echo_env = { cmd = ["python", "src/rye_demo/main.py"], env-file = "my.env" }
main.py
内容如下
import os
if __name__ == '__main__':
print(f"Get KEY = {os.environ.get('KEY')}")
my.env
文件如下
KEY=secret...
运行rye run echo_env
就会打印Get KEY = secret...
,如果直接运行的话就是Get KEY = None
,可以看出rye对开发者天然地友好。
便捷切换不同地Python版本
一定遇到过这样的问题,因为尝试新特性或者由于依赖问题不得不切换不同的Python版本。
现在假设我们要切换到3.11的Python,只需要按照下面的命令就能快速切换。
# 改变.python_version和pyproject.toml文件中的python版本
rye pin --relaxed cpython@3.11
# 下载cpython@3.11,实际上rye fetch是rye toolchain fetch的快捷缩写
rye fetch
# 或者直接用下面的命令
rye fetch cpython@3.9.1
# 验证版本:Python 3.11.9
python --version
#移除
rye toolchain remove 3.8.16
依赖管理
- 添加依赖:
rye add fastapi
- 下载依赖:
rye sync
下载依赖后会生成requirements-dev.lock
和requirements.lock
二个文件用来锁定版本,当需要进行升级时执行rye sync --update-all
就会将所有的依赖更新到最新。
以一个实际的例子开始, 添加fastapi
rye add fastapi
rye sync
新建web_server.py
,内容如下
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
在pyproject.toml中添加启动脚本
[tool.rye.scripts]
server_starter = "fastapi dev src/rye_demo/web_server.py"
执行rye run server_starter
就会看到类似如下输出
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
从已有的项目迁移
未完成...
总结
rye目前的官方定位是一个具有实验性质的Python项目管理工具,但是从使用体验来说,具有明显的构建优势和提高开发效率的特点。
新项目的工作流
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。