From f7988a2d36c3bf446fbd14c9a8a5a380e4eef61a Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 2 Jan 2026 18:22:39 +0100 Subject: [PATCH 1/8] replacing poetry up until build step --- docs/tutorial/package.md | 127 +++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 66 deletions(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 617c93cd0b..08008aef7e 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -20,9 +20,9 @@ If you already have a favorite way of creating Python packages, feel free to ski ## Prerequisites -For this guide we'll use Poetry. +For this guide we'll use uv. -Poetry's docs are great, so go ahead, check them and install it. +uv's docs are great, so go ahead, check them and install it. ## Create a project @@ -32,14 +32,14 @@ To make sure your package doesn't collide with the package created by someone el So, if your name is Rick, we'll call it `rick-portal-gun`. -Create a project with Poetry: +Create a project with uv:
```console -$ poetry new rick-portal-gun +$ uv init --package rick-portal-gun -Created package rick_portal_gun in rick-portal-gun +Initialized project `rick-portal-gun` at `/git/rick-portal-gun` // Enter the new project directory cd ./rick-portal-gun @@ -54,34 +54,30 @@ Add `typer` to your dependencies:
```console -$ poetry add typer +$ uv add typer // It creates a virtual environment for your project -Creating virtualenv rick-portal-gun-w31dJa0b-py3.10 in /home/rick/.cache/pypoetry/virtualenvs -Using version ^0.12.0 for typer +Using CPython 3.14.0 interpreter at: /location/of/python/ +Creating virtual environment at: .venv + +Resolved 10 packages in 21ms + Built rick-portal-gun @ file:/git/rick-portal-gun +Prepared 1 package in 19ms +Installed 10 packages in 34ms + + click==8.3.1 + + colorama==0.4.6 + + markdown-it-py==4.0.0 + + mdurl==0.1.2 + + pygments==2.19.2 + + rich==14.2.0 + + rick-portal-gun==0.1.0 (from file:/git/rick-portal-gun) + + shellingham==1.5.4 + + typer==0.21.0 + + typing-extensions==4.15.0 -Updating dependencies -Resolving dependencies... (1.2s) - ----> 100% - -Package operations: 8 installs, 0 updates, 0 removals - - - Installing mdurl (0.1.2) - - Installing markdown-it-py (3.0.0) - - Installing pygments (2.17.2) - - Installing click (8.1.7) - - Installing rich (13.7.1) - - Installing shellingham (1.5.4) - - Installing typing-extensions (4.11.0) - - Installing typer (0.12.3) - -Writing lock file // Activate that new virtual environment -$ poetry shell - -Spawning shell within /home/rick/.cache/pypoetry/virtualenvs/rick-portal-gun-w31dJa0b-py3.10 +$ source .venv/bin/activate // Open an editor using this new environment, for example VS Code $ code ./ @@ -93,20 +89,19 @@ You can see that you have a generated project structure that looks like: ``` . -├── poetry.lock ├── pyproject.toml ├── README.md -├── rick_portal_gun -│   └── __init__.py -└── tests - └── __init__.py +├── src +│   └── rick_portal_gun +│     └── __init__.py +└── uv.lock ``` ## Create your app Now let's create an extremely simple **Typer** app. -Create a file `rick_portal_gun/main.py` with: +Create a file `src/rick_portal_gun/main.py` with: ```Python import typer @@ -160,26 +155,26 @@ We are creating a Python package that can be installed with `pip install`. But we want it to provide a CLI program that can be executed in the shell. -To do that, we add a configuration to the `pyproject.toml` in the section `[tool.poetry.scripts]`: +To do that, we add a configuration to the `pyproject.toml` in the section `[project.scripts]`: -```TOML hl_lines="8 9" -[tool.poetry] +```TOML hl_lines="11 12" +[project] name = "rick-portal-gun" version = "0.1.0" -description = "" -authors = ["Rick Sanchez "] +description = "Add your description here" readme = "README.md" +authors = ["Rick Sanchez "] +requires-python = ">=3.14" +dependencies = [ + "typer>=0.21.0", +] -[tool.poetry.scripts] +[project.scripts] rick-portal-gun = "rick_portal_gun.main:app" -[tool.poetry.dependencies] -python = "^3.10" -typer = "^0.12.0" - [build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +requires = ["uv_build>=0.8.14,<0.9.0"] +build-backend = "uv_build" ``` Here's what that line means: @@ -222,20 +217,22 @@ You can now install it:
```console -$ poetry install +$ uv sync -Installing dependencies from lock file +Resolved 10 packages in 1ms + Built rick-portal-gun @ file:/git/rick-portal-gun +Prepared 1 package in 18ms +Uninstalled 1 package in 1ms +Installed 1 package in 13ms + ~ rick-portal-gun==0.1.0 (from file:/git/rick-portal-gun) -No dependencies to install or update - - - Installing the current project: rick-portal-gun (0.1.0) ```
## Try your CLI program -Your package is installed in the environment created by Poetry, but you can already use it. +Your package is installed in the environment created by uv, but you can already use it.
@@ -244,7 +241,7 @@ Your package is installed in the environment created by Poetry, but you can alre $ which rick-portal-gun // You get the one from your environment -/home/rick/.cache/pypoetry/virtualenvs/rick-portal-gun-w31dJa0b-py3.10/bin/rick-portal-gun +/git/rick-portal-gun/.venv/bin/rick-portal-gun // Try it $ rick-portal-gun --help @@ -261,8 +258,8 @@ Options: --help Show this message and exit. Commands: - load Load the portal gun shoot Shoot the portal gun + load Load the portal gun ```
@@ -271,18 +268,17 @@ Commands: Python packages have a standard format called a "wheel". It's a file that ends in `.whl`. -You can create a wheel with Poetry: +You can create a wheel with uv:
```console -$ poetry build +$ uv build -Building rick-portal-gun (0.1.0) - - Building sdist - - Built rick-portal-gun-0.1.0.tar.gz - - Building wheel - - Built rick_portal_gun-0.1.0-py3-none-any.whl +Building source distribution (uv build backend)... +Building wheel from source distribution (uv build backend)... +Successfully built dist\rick_portal_gun-0.1.0.tar.gz +Successfully built dist\rick_portal_gun-0.1.0-py3-none-any.whl ```
@@ -419,15 +415,14 @@ The file would live right beside `__init__.py`: ``` hl_lines="7" . -├── poetry.lock +├── uv.lock ├── pyproject.toml ├── README.md ├── rick_portal_gun │ ├── __init__.py │ ├── __main__.py │ └── main.py -└── tests - └── __init__.py +└── uv.lock ``` No other file has to import it, you don't have to reference it in your `pyproject.toml` or anything else, it just works by default, as it is standard Python behavior. @@ -478,7 +473,7 @@ See the `__main__.py` in the help instead of `rick-portal-gun`? We'll fix that n We are setting the program name in the file `pyproject.toml` in the line like: ```TOML -[tool.poetry.scripts] +[project.scripts] rick-portal-gun = "rick_portal_gun.main:app" ``` @@ -561,7 +556,7 @@ Let's say your new API token is: pypi-wubalubadubdub-deadbeef1234 ``` -Now configure Poetry to use this token with the command `poetry config pypi-token.pypi`: +Now configure uv to use this token with the command `poetry config pypi-token.pypi`:
From fe0634b76391b170a74bfc2b29abcc9a6b6a8588 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 2 Jan 2026 18:25:25 +0100 Subject: [PATCH 2/8] fix hl_lines --- docs/tutorial/package.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 08008aef7e..01078b783c 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -157,7 +157,7 @@ But we want it to provide a CLI program that can be executed in the shell. To do that, we add a configuration to the `pyproject.toml` in the section `[project.scripts]`: -```TOML hl_lines="11 12" +```TOML hl_lines="12 13" [project] name = "rick-portal-gun" version = "0.1.0" From 369e1115fc024b1a24f51d48eab4dd39d8e0fbb4 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 2 Jan 2026 18:26:11 +0100 Subject: [PATCH 3/8] fix duplicate file --- docs/tutorial/package.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 01078b783c..435a8cdadf 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -415,7 +415,6 @@ The file would live right beside `__init__.py`: ``` hl_lines="7" . -├── uv.lock ├── pyproject.toml ├── README.md ├── rick_portal_gun From 898c4ec9e4791f0c7726fdceac37d5c561800aca Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 5 Jan 2026 14:56:30 +0100 Subject: [PATCH 4/8] update package publish steps to use uv instead of poetry --- docs/tutorial/package.md | 156 +++++++++++---------------------------- pyproject.toml | 5 ++ uv.lock | 17 +++++ 3 files changed, 67 insertions(+), 111 deletions(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 435a8cdadf..0ef3b16eb5 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -39,7 +39,7 @@ Create a project with uv: ```console $ uv init --package rick-portal-gun -Initialized project `rick-portal-gun` at `/git/rick-portal-gun` +Initialized project `rick-portal-gun` at `/home/rick-portal-gun` // Enter the new project directory cd ./rick-portal-gun @@ -61,7 +61,7 @@ Using CPython 3.14.0 interpreter at: /location/of/python/ Creating virtual environment at: .venv Resolved 10 packages in 21ms - Built rick-portal-gun @ file:/git/rick-portal-gun + Built rick-portal-gun @ file:/home/rick-portal-gun Prepared 1 package in 19ms Installed 10 packages in 34ms + click==8.3.1 @@ -70,7 +70,7 @@ Installed 10 packages in 34ms + mdurl==0.1.2 + pygments==2.19.2 + rich==14.2.0 - + rick-portal-gun==0.1.0 (from file:/git/rick-portal-gun) + + rick-portal-gun==0.1.0 (from file:/home/rick-portal-gun) + shellingham==1.5.4 + typer==0.21.0 + typing-extensions==4.15.0 @@ -204,7 +204,7 @@ from rick_portal_gun.main import app app() ``` -That config section tells Poetry that when this package is installed we want it to create a command line program called `rick-portal-gun`. +That config section tells uv that when this package is installed, we want it to create a command line program called `rick-portal-gun`. And that the object to call (like a function) is the one in the variable `app` inside of the module `rick_portal_gun.main`. @@ -220,11 +220,11 @@ You can now install it: $ uv sync Resolved 10 packages in 1ms - Built rick-portal-gun @ file:/git/rick-portal-gun + Built rick-portal-gun @ file:/home/rick-portal-gun Prepared 1 package in 18ms Uninstalled 1 package in 1ms Installed 1 package in 13ms - ~ rick-portal-gun==0.1.0 (from file:/git/rick-portal-gun) + ~ rick-portal-gun==0.1.0 (from file:/home/rick-portal-gun) ``` @@ -241,7 +241,7 @@ Your package is installed in the environment created by uv, but you can already $ which rick-portal-gun // You get the one from your environment -/git/rick-portal-gun/.venv/bin/rick-portal-gun +/home/rick-portal-gun/.venv/bin/rick-portal-gun // Try it $ rick-portal-gun --help @@ -411,16 +411,17 @@ You can support that same style of calling the package/module for your own packa Python will look for that file and execute it. -The file would live right beside `__init__.py`: +The file would live right beside `__init__.py` and `main.py`: ``` hl_lines="7" . ├── pyproject.toml ├── README.md -├── rick_portal_gun -│ ├── __init__.py -│ ├── __main__.py -│ └── main.py +├── src +│   └── rick_portal_gun +│     ├── __init__.py +│     ├── __main__.py +│     └── main.py └── uv.lock ``` @@ -433,14 +434,14 @@ from .main import app app() ``` -Now, after installing your package, if you call it with `python -m` it will work (for the main part): +Now, after installing your package, if you call it with `python -m` it will work:
```console $ python -m rick_portal_gun --help -Usage: __main__.py [OPTIONS] COMMAND [ARGS]... +Usage: python -m rick_portal_gun [OPTIONS] COMMAND [ARGS]... Awesome Portal Gun @@ -451,8 +452,8 @@ Options: --help Show this message and exit. Commands: - load Load the portal gun shoot Shoot the portal gun + load Load the portal gun ```
@@ -463,59 +464,7 @@ Notice that you have to pass the importable version of the package name, so `ric /// -That works! 🚀 Sort of... 🤔 - -See the `__main__.py` in the help instead of `rick-portal-gun`? We'll fix that next. - -### Set a program name in `__main__.py` - -We are setting the program name in the file `pyproject.toml` in the line like: - -```TOML -[project.scripts] -rick-portal-gun = "rick_portal_gun.main:app" -``` - -But when Python runs our package as a script with `python -m`, it doesn't have the information of the program name. - -So, to fix the help text to use the correct program name when called with `python -m`, we can pass it to the app in `__main__.py`: - -```Python -from .main import app -app(prog_name="rick-portal-gun") -``` - -/// tip - -You can pass all the arguments and keyword arguments you could pass to a Click application, including `prog_name`. - -/// - -
- -```console -$ python -m rick_portal_gun --help - -Usage: rick-portal-gun [OPTIONS] COMMAND [ARGS]... - - Awesome Portal Gun - -Options: - --install-completion Install completion for the current shell. - --show-completion Show completion for the current shell, to copy it or customize the installation. - - --help Show this message and exit. - -Commands: - load Load the portal gun - shoot Shoot the portal gun -``` - -
- -Great! That works correctly! 🎉 ✅ - -Notice that now it uses `rick-portal-gun` instead of `__main__.py` in the help. +That works! 🚀 ### Autocompletion and `python -m` @@ -539,7 +488,7 @@ But you can still support `python -m` for the cases where it's useful. You can publish that new package to PyPI to make it public, so others can install it easily. -So, go ahead and create an account there (it's free). +So, go ahead and create an account there (it's free). If you just want to experiment, you can use https://test.pypi.org/ instead. ### PyPI API token @@ -555,12 +504,12 @@ Let's say your new API token is: pypi-wubalubadubdub-deadbeef1234 ``` -Now configure uv to use this token with the command `poetry config pypi-token.pypi`: +Now configure uv to use this token by setting an environment variable:
```console -$ poetry config pypi-token.pypi pypi-wubalubadubdub-deadbeef1234 +$ export UV_PUBLISH_TOKEN=pypi-wubalubadubdub-deadbeef1234 // It won't show any output, but it's already configured ``` @@ -568,28 +517,19 @@ $ poetry config pypi-token.pypi pypi-wubalubadubdub-deadbeef1234 ### Publish to PyPI -Now you can publish your package with Poetry. +Now you can publish your package. -You could build the package (as we did above) and then publish later, or you could tell poetry to build it before publishing in one go: +You could build the package (as we did above) and then publish later, or you could tell uv to build it before publishing in one go:
```console -$ poetry publish --build - -# There are 2 files ready for publishing. Build anyway? (yes/no) [no] $ yes - ----> 100% - -Building rick-portal-gun (0.1.0) - - Building sdist - - Built rick-portal-gun-0.1.0.tar.gz - - Building wheel - - Built rick_portal_gun-0.1.0-py3-none-any.whl +// Add --publish-url https://test.pypi.org/legacy/ if you want to publish on PyPI's test server instead. +$ uv publish -Publishing rick-portal-gun (0.1.0) to PyPI - - Uploading rick-portal-gun-0.1.0.tar.gz 100% - - Uploading rick_portal_gun-0.1.0-py3-none-any.whl 100% +Publishing 2 files https://upload.pypi.org/legacy/ +Uploading rick_portal_gun-0.1.0-py3-none-any.whl (2.3KiB) +Uploading rick_portal_gun-0.1.0.tar.gz (841.0B) ```
@@ -600,7 +540,7 @@ You should now see your new "rick-portal-gun" package. ### Install from PyPI -Now to see that we can install it form PyPI, open another terminal, and uninstall the currently installed package. +Now to see that we can install it from PyPI, open another terminal, and uninstall the currently installed package.
@@ -624,6 +564,7 @@ And now install it again, but this time using just the name, so that `pip` pulls
```console +// Add --index-url https://test.pypi.org/simple if you're downloading from PyPI's test server $ pip install --user rick-portal-gun // Notice that it says "Downloading" 🚀 @@ -688,26 +629,26 @@ Now you can publish a new version with the updated docs. For that you need to first increase the version in `pyproject.toml`: ```TOML hl_lines="3" -[tool.poetry] +[project] name = "rick-portal-gun" version = "0.2.0" -description = "" -authors = ["Rick Sanchez "] +description = "Add your description here" readme = "README.md" +authors = ["Rick Sanchez "] +requires-python = ">=3.14" +dependencies = [ + "typer>=0.21.0", +] -[tool.poetry.scripts] +[project.scripts] rick-portal-gun = "rick_portal_gun.main:app" -[tool.poetry.dependencies] -python = "^3.10" -typer = "^0.12.0" - [build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +requires = ["uv_build>=0.8.14,<0.9.0"] +build-backend = "uv_build" ``` -And in the file `rick_portal_gun/__init__.py`: +And in the file `src/rick_portal_gun/__init__.py`: ```Python __version__ = '0.2.0' @@ -718,19 +659,12 @@ And then build and publish again:
```console -$ poetry publish --build - ----> 100% - -Building rick-portal-gun (0.2.0) - - Building sdist - - Built rick-portal-gun-0.2.0.tar.gz - - Building wheel - - Built rick_portal_gun-0.2.0-py3-none-any.whl +$ uv build +$ uv publish -Publishing rick-portal-gun (0.2.0) to PyPI - - Uploading rick-portal-gun-0.2.0.tar.gz 100% - - Uploading rick_portal_gun-0.2.0-py3-none-any.whl 100% +Publishing 2 files https://upload.pypi.org/legacy/ +Uploading rick_portal_gun-0.2.0-py3-none-any.whl (2.3KiB) +Uploading rick_portal_gun-0.2.0.tar.gz (840.0B) ```
diff --git a/pyproject.toml b/pyproject.toml index 5fb7841547..d6d80ab8e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -218,3 +218,8 @@ banned-module-level-imports = ["typer.rich_utils"] Use 'typer._completion_shared._get_shell_name' instead of using \ 'shellingham.detect_shell' directly. """ + +[tool.uv.workspace] +members = [ + "rick-portal-gun", +] diff --git a/uv.lock b/uv.lock index 2798324cc5..7b0a2bab20 100644 --- a/uv.lock +++ b/uv.lock @@ -6,6 +6,12 @@ resolution-markers = [ "python_full_version < '3.10'", ] +[manifest] +members = [ + "rick-portal-gun", + "typer", +] + [[package]] name = "click" version = "8.1.8" @@ -107,6 +113,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, ] +[[package]] +name = "rick-portal-gun" +version = "0.1.0" +source = { editable = "rick-portal-gun" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", editable = "." }] + [[package]] name = "shellingham" version = "1.5.4" From 4204e283562d15d251ffa7e03e98cb6571e9c495 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 5 Jan 2026 14:59:15 +0100 Subject: [PATCH 5/8] fix link --- docs/tutorial/package.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 0ef3b16eb5..a8346df4e9 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -677,7 +677,7 @@ This is a very simple guide. You could add many more steps. For example, you should use Git, the version control system, to save your code. -You can add a lot of extra metadata to your `pyproject.toml`, check the docs for Poetry: Libraries. +You can add a lot of extra metadata to your `pyproject.toml`, check the docs for Poetry metadata settings. You could use `pipx` to manage your installed CLI Python programs in isolated environments. From c9561d691e953cf542c4e2e372326e4b06ee4ba9 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 5 Jan 2026 14:59:58 +0100 Subject: [PATCH 6/8] remove reference to PyPI test server (perhaps in separate PR) --- docs/tutorial/package.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index a8346df4e9..4527a08cf2 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -488,7 +488,7 @@ But you can still support `python -m` for the cases where it's useful. You can publish that new package to PyPI to make it public, so others can install it easily. -So, go ahead and create an account there (it's free). If you just want to experiment, you can use https://test.pypi.org/ instead. +So, go ahead and create an account there (it's free). ### PyPI API token @@ -524,7 +524,6 @@ You could build the package (as we did above) and then publish later, or you cou
```console -// Add --publish-url https://test.pypi.org/legacy/ if you want to publish on PyPI's test server instead. $ uv publish Publishing 2 files https://upload.pypi.org/legacy/ @@ -564,7 +563,6 @@ And now install it again, but this time using just the name, so that `pip` pulls
```console -// Add --index-url https://test.pypi.org/simple if you're downloading from PyPI's test server $ pip install --user rick-portal-gun // Notice that it says "Downloading" 🚀 From fc9f69fafd8946f916fc03e3d5457226969c60f3 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 5 Jan 2026 15:03:55 +0100 Subject: [PATCH 7/8] cleanup --- pyproject.toml | 5 ----- uv.lock | 11 ----------- 2 files changed, 16 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a2355f3298..5897e1aa8a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -256,8 +256,3 @@ banned-module-level-imports = ["typer.rich_utils"] Use 'typer._completion_shared._get_shell_name' instead of using \ 'shellingham.detect_shell' directly. """ - -[tool.uv.workspace] -members = [ - "rick-portal-gun", -] diff --git a/uv.lock b/uv.lock index d935f48873..aa96ca3fb5 100644 --- a/uv.lock +++ b/uv.lock @@ -2053,17 +2053,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, ] -[[package]] -name = "rick-portal-gun" -version = "0.1.0" -source = { editable = "rick-portal-gun" } -dependencies = [ - { name = "typer" }, -] - -[package.metadata] -requires-dist = [{ name = "typer", editable = "." }] - [[package]] name = "ruff" version = "0.14.10" From 4c8d320d8723550139653d99f82ed9e48bfa4aea Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 5 Jan 2026 15:10:00 +0100 Subject: [PATCH 8/8] uv doesn't have a build and publish command in one go (AFAIK) --- docs/tutorial/package.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/tutorial/package.md b/docs/tutorial/package.md index 4527a08cf2..462b56035f 100644 --- a/docs/tutorial/package.md +++ b/docs/tutorial/package.md @@ -519,8 +519,6 @@ $ export UV_PUBLISH_TOKEN=pypi-wubalubadubdub-deadbeef1234 Now you can publish your package. -You could build the package (as we did above) and then publish later, or you could tell uv to build it before publishing in one go: -
```console