uv 0.12.0 改变项目脚手架

Simon Willison··作者 Simon Willison

关键信息

旧版在项目根目录生成的 `main.py` 被替换为 `src/uv_init/__init__.py`,其中包含一个 `main()` 函数;生成的 `pyproject.toml` 现在还会包含作者列表和 `project.scripts` 配置。该版本同时切换到 `uv_build`,用于通过 `uv build` 生成 wheel 和 `.tar.gz` 源码分发包。

资讯摘要

Simon Willison 介绍了 `uv 0.12.0` 的发布,并指出这次版本包含一些破坏性变更,尤其体现在 `uv init` 默认生成的项目结构上。 在 `uv 0.11.x` 中,执行 `uv init uv-init` 会生成一个扁平结构的项目,根目录下会有一个 `main.py` 文件。 到了 `uv 0.12.0`,同样的命令现在默认生成 `src/` 风格的包布局。 生成的项目还会配置 `uv_build` 作为构建后端,这样在运行 `uv build` 时可以生成 wheel 和 `.tar.gz` 分发包。

此外,`pyproject.toml` 中会新增 `project.scripts` 条目,把 `uv-init` 映射到 `uv_init:main`,因此可以通过 `uv run uv-init` 来执行项目。 原本位于根目录 `main.py` 中的代码,现在被移动到 `src/uv_init/__init__.py`,并定义了一个带类型注解的 `main()` 函数,用于打印问候语。 Willison 还提到,他过去只是出于习惯而避免使用 `src` 布局,但这次变化可能会促使他改用这种结构。 他最后还提出疑问:`uv` 什么时候才会被认为足够成熟,进入 1.0 版本。

uv 0.12.0 改变项目脚手架

资讯正文

<strong><a href="https://github.com/astral-sh/uv/releases/tag/0.12.0">uv 0.12.0</a></strong>

这次发布的 <code>uv</code> 有一些有趣的破坏性变更,尤其是 <code>uv init</code> 命令生成的默认项目结构。

<a href="https://docs.astral.sh/uv/concepts/projects/init/">uv init</a> 是 <code>uv</code> 用于创建新项目的快捷命令。<code>uv</code> 的上一版本 0.11.x,在你运行 <code>uv init uv-init</code> 时,会生成 <a href="https://github.com/simonw/uv-init-demos/tree/29656a55ec733a632005abfd7b89dea5c04fa10b/uv-init">这个目录</a>。

这是在 <a href="https://github.com/simonw/uv-init-demos/tree/9111a2bb85741f034eee2fd63efe13ef98b37a14/uv-init">uv 0.12 下你会得到的内容</a>。我有一个 GitHub 仓库会<a href="https://simonwillison.net/2025/Dec/24/uv-init-demos/">自动快照</a> <code>uv init</code> 的输出,因此你也可以<a href="https://github.com/simonw/uv-init-demos/commit/9111a2bb85741f034eee2fd63efe13ef98b37a14#diff-e036881d034aedd813010ffa96464995ae5b0339213d6f4ab492f97442c5bdd4">查看完整 diff</a>:

<img alt="GitHub diff view. uv-init/main.py is an old __name__==&quot;__main__&quot; file that has been entirely deleted. The pyproject.toml now has an authors list and a new project.scripts block defining uv-init as uv_init:main - and a new build-system block that uses uv_build as the build-backend. A new src/uv_init/__init__.py file contains a main() method with a -&gt; None type annotation that prints Hello from uv-init." src="https://static.simonwillison.net/static/2026/uv-diff.webp" />

现在,<code>uv init</code> 默认会创建一个 <code>src/</code> 结构的包,而不是把 <code>main.py</code> 直接放在项目根目录。它还会在你运行 <code>uv build</code> 时,配置用于构建 wheels 和 <code>.tar.gz</code> 分发文件的 <a href="https://docs.astral.sh/uv/concepts/build-backend/">uv_build 后端</a>。最后,它会设置一个 <code>uv-init</code> 作为脚本别名,这样在运行 <code>uv run uv-init</code> 时,会执行 <code>src/uv_init/__init__.py</code> 中一个新的 <code>main()</code> 函数。

到目前为止,我一直只是出于惯性,避免在自己的项目中使用 <a href="https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/">src 布局</a>。我想现在是时候改用了。

我想知道,<code>uv</code> 什么时候才会被认为已经准备好发布 1.0 版?

来源与参考

  1. 原始链接
  2. uv 0.12.0

收录于 2026-07-29