<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>3.4 项目 on 编程那些事儿</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/</link><description>Recent content in 3.4 项目 on 编程那些事儿</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 25 Sep 2026 21:01:20 +0800</lastBuildDate><atom:link href="https://before80.github.io/prgms/tools/uv/concepts/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>3.4.1 项目结构与文件</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.1-layout/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.1-layout/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/layout/"&gt;https://docs.astral.sh/uv/concepts/projects/layout/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="341-项目结构与文件"&gt;3.4.1 项目结构与文件&lt;/h1&gt;
&lt;h2 id="pyprojecttoml"&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Python 项目元数据定义在 &lt;a href="https://packaging.python.org/en/latest/guides/writing-pyproject-toml/"&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt; 文件中。uv 需要该文件来识别项目的根目录。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以用 &lt;code&gt;uv init&lt;/code&gt; 创建新项目。细节请参阅&lt;a href="./3.4.2-init/"&gt;创建项目&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最小的项目定义包含名称和版本：&lt;/p&gt;</description></item><item><title>3.4.2 创建项目</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.2-init/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.2-init/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/init/"&gt;https://docs.astral.sh/uv/concepts/projects/init/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="342-创建项目"&gt;3.4.2 创建项目&lt;/h1&gt;
&lt;p&gt;uv 支持用 &lt;code&gt;uv init&lt;/code&gt; 创建项目。&lt;/p&gt;
&lt;p&gt;创建项目时，uv 支持两种基本模板：&lt;a href="#applications"&gt;&lt;strong&gt;应用&lt;/strong&gt;&lt;/a&gt;和&lt;a href="#libraries"&gt;&lt;strong&gt;库&lt;/strong&gt;&lt;/a&gt;。默认情况下 uv 会创建应用项目。使用 &lt;code&gt;--lib&lt;/code&gt; 标志可以改为创建库项目。&lt;/p&gt;
&lt;p&gt;在两种情况下，uv 都倾向于定义&lt;a href="./3.4.6-config/#build-systems"&gt;构建系统&lt;/a&gt;，并把源文件放在专用的 &lt;code&gt;src/&amp;lt;project_name&amp;gt;/&lt;/code&gt; 目录中。定义构建系统可以使用各种 Python 打包特性，例如添加命令行入口点，并避免 Python 导入系统中常见的困惑。可以通过 &lt;a href="#creating-a-project-without-a-build-system"&gt;&lt;code&gt;--no-package&lt;/code&gt;&lt;/a&gt; 或 &lt;a href="#creating-a-minimal-project"&gt;&lt;code&gt;--bare&lt;/code&gt;&lt;/a&gt; 选项禁用构建系统。&lt;/p&gt;</description></item><item><title>3.4.3 管理依赖</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.3-dependencies/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.3-dependencies/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/dependencies/"&gt;https://docs.astral.sh/uv/concepts/projects/dependencies/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="343-管理依赖"&gt;3.4.3 管理依赖&lt;/h1&gt;
&lt;h2 id="依赖字段"&gt;依赖字段&lt;/h2&gt;
&lt;p&gt;项目的依赖在几个字段中定义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#project-dependencies"&gt;&lt;code&gt;project.dependencies&lt;/code&gt;&lt;/a&gt;：发布出去的依赖。&lt;/li&gt;
&lt;li&gt;&lt;a href="#optional-dependencies"&gt;&lt;code&gt;project.optional-dependencies&lt;/code&gt;&lt;/a&gt;：发布出去的可选依赖，即 “extras”。&lt;/li&gt;
&lt;li&gt;&lt;a href="#dependency-groups"&gt;&lt;code&gt;dependency-groups&lt;/code&gt;&lt;/a&gt;：仅本地的开发依赖。&lt;/li&gt;
&lt;li&gt;&lt;a href="#dependency-sources"&gt;&lt;code&gt;tool.uv.sources&lt;/code&gt;&lt;/a&gt;：开发期间依赖的替代来源。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;即使项目不打算发布，也可以使用 &lt;code&gt;project.dependencies&lt;/code&gt; 和 &lt;code&gt;project.optional-dependencies&lt;/code&gt; 字段。&lt;code&gt;dependency-groups&lt;/code&gt; 是最近才标准化的特性，可能尚未被所有工具支持。&lt;/p&gt;</description></item><item><title>3.4.4 运行命令</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.4-run/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.4-run/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/run/"&gt;https://docs.astral.sh/uv/concepts/projects/run/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="344-运行命令"&gt;3.4.4 运行命令&lt;/h1&gt;
&lt;p&gt;处理项目时，项目会被安装到 &lt;code&gt;.venv&lt;/code&gt; 中的虚拟环境里。默认情况下该环境与当前 shell 隔离，因此需要该项目的调用（例如 &lt;code&gt;python -c &amp;quot;import example&amp;quot;&lt;/code&gt;）会失败。请改用 &lt;code&gt;uv run&lt;/code&gt; 在项目环境中运行命令：&lt;/p&gt;</description></item><item><title>3.4.5 锁定与同步</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.5-sync/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.5-sync/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/sync/"&gt;https://docs.astral.sh/uv/concepts/projects/sync/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="345-锁定与同步"&gt;3.4.5 锁定与同步&lt;/h1&gt;
&lt;p&gt;锁定是指把项目依赖&lt;a href="../3.7-resolution/"&gt;解析&lt;/a&gt;为&lt;a href="./3.4.1-layout/#the-lockfile"&gt;锁文件&lt;/a&gt;的过程。同步是指把锁文件中的一部分包安装到&lt;a href="./3.4.1-layout/#the-project-environment"&gt;项目环境&lt;/a&gt;的过程。&lt;/p&gt;
&lt;h2 id="自动锁定与同步"&gt;自动锁定与同步&lt;/h2&gt;
&lt;p&gt;在 uv 中，锁定和同步是&lt;em&gt;自动&lt;/em&gt;的。例如使用 &lt;code&gt;uv run&lt;/code&gt; 时，会在调用所请求的命令之前先锁定并同步项目。这确保项目环境始终是最新的。同样，读取锁文件的命令（例如 &lt;code&gt;uv tree&lt;/code&gt;）也会在运行前自动更新锁文件。&lt;/p&gt;</description></item><item><title>3.4.6 配置项目</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.6-config/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.6-config/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/config/"&gt;https://docs.astral.sh/uv/concepts/projects/config/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="346-配置项目"&gt;3.4.6 配置项目&lt;/h1&gt;
&lt;h2 id="python-版本要求"&gt;Python 版本要求&lt;/h2&gt;
&lt;p&gt;项目可以在 &lt;code&gt;pyproject.toml&lt;/code&gt; 的 &lt;code&gt;project.requires-python&lt;/code&gt; 字段中声明它所支持的 Python 版本。&lt;/p&gt;
&lt;p&gt;建议设置 &lt;code&gt;requires-python&lt;/code&gt; 值：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#58626f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#58626f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#58626f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#58626f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#58626f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8a93a5;font-style:italic"&gt;# pyproject.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#abb2bf"&gt;[&lt;/span&gt;&lt;span style="color:#aa89ea"&gt;project&lt;/span&gt;&lt;span style="color:#abb2bf"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;name&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;version&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#aa89ea"&gt;requires-python&lt;/span&gt; &lt;span style="color:#abb2bf"&gt;=&lt;/span&gt; &lt;span style="color:#63c381"&gt;&amp;#34;&amp;gt;=3.12&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Python 版本要求决定项目允许使用的 Python 语法，并影响依赖版本的选择（它们必须支持相同的 Python 版本范围）。&lt;/p&gt;</description></item><item><title>3.4.7 构建分发包</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.7-build/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.7-build/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/build/"&gt;https://docs.astral.sh/uv/concepts/projects/build/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="347-构建分发包"&gt;3.4.7 构建分发包&lt;/h1&gt;
&lt;p&gt;要把项目分发给他人（例如上传到 PyPI 之类的索引），你需要把它构建成可分发的格式。&lt;/p&gt;
&lt;p&gt;Python 项目通常同时以源码分发（sdist）和二进制分发（wheel）形式分发。前者通常是包含项目源代码及一些附加元数据的 &lt;code&gt;.tar.gz&lt;/code&gt; 或 &lt;code&gt;.zip&lt;/code&gt; 文件，后者是包含可直接安装的预构建产物的 &lt;code&gt;.whl&lt;/code&gt; 文件。&lt;/p&gt;</description></item><item><title>3.4.8 导出锁文件</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.8-export/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.8-export/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/export/"&gt;https://docs.astral.sh/uv/concepts/projects/export/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="348-导出锁文件"&gt;3.4.8 导出锁文件&lt;/h1&gt;
&lt;p&gt;uv 可以把锁文件导出为不同格式，以便与其他工具和工作流集成。&lt;code&gt;uv export&lt;/code&gt; 命令支持多种输出格式，各自适用于不同场景。&lt;/p&gt;
&lt;p&gt;关于锁文件及其创建方式的更多细节，请参阅&lt;a href="./3.4.1-layout/"&gt;项目结构&lt;/a&gt;和&lt;a href="./3.4.5-sync/"&gt;锁定与同步&lt;/a&gt;文档。&lt;/p&gt;</description></item><item><title>3.4.9 使用工作区</title><link>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.9-workspaces/</link><pubDate>Fri, 25 Sep 2026 19:02:24 +0800</pubDate><guid>https://before80.github.io/prgms/tools/uv/concepts/projects/3.4.9-workspaces/</guid><description>&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a href="https://docs.astral.sh/uv/concepts/projects/workspaces/"&gt;https://docs.astral.sh/uv/concepts/projects/workspaces/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="349-使用工作区"&gt;3.4.9 使用工作区&lt;/h1&gt;
&lt;p&gt;工作区（workspace）的概念受 &lt;a href="https://doc.rust-lang.org/cargo/reference/workspaces.html"&gt;Cargo&lt;/a&gt; 同名概念启发，指“一个或多个称为&lt;em&gt;工作区成员&lt;/em&gt;的包的集合，它们被一起管理”。&lt;/p&gt;
&lt;p&gt;工作区通过把庞大的代码库拆分为多个具有公共依赖的包来组织它们。可以想象：一个基于 FastAPI 的 Web 应用，连同若干作为独立 Python 包进行版本管理和维护的库，全部位于同一个 Git 仓库中。&lt;/p&gt;</description></item></channel></rss>