mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00
280 lines
7.3 KiB
Markdown
280 lines
7.3 KiB
Markdown
---
|
|
title: Working on projects
|
|
description:
|
|
A guide to using uv to create and manage Python projects, including adding dependencies, running
|
|
commands, and building publishable distributions.
|
|
---
|
|
|
|
# Working on projects
|
|
|
|
uv supports managing Python projects, which define their dependencies in a `pyproject.toml` file.
|
|
|
|
## Creating a new project
|
|
|
|
You can create a new Python project using the `uv init` command:
|
|
|
|
```console
|
|
$ uv init hello-world
|
|
$ cd hello-world
|
|
```
|
|
|
|
Alternatively, you can initialize a project in the working directory:
|
|
|
|
```console
|
|
$ mkdir hello-world
|
|
$ cd hello-world
|
|
$ uv init
|
|
```
|
|
|
|
uv will create the following files:
|
|
|
|
```text
|
|
├── .gitignore
|
|
├── .python-version
|
|
├── README.md
|
|
├── main.py
|
|
└── pyproject.toml
|
|
```
|
|
|
|
The `main.py` file contains a simple "Hello world" program. Try it out with `uv run`:
|
|
|
|
```console
|
|
$ uv run main.py
|
|
Hello from hello-world!
|
|
```
|
|
|
|
## Project structure
|
|
|
|
A project consists of a few important parts that work together and allow uv to manage your project.
|
|
In addition to the files created by `uv init`, uv will create a virtual environment and `uv.lock`
|
|
file in the root of your project the first time you run a project command, i.e., `uv run`,
|
|
`uv sync`, or `uv lock`.
|
|
|
|
A complete listing would look like:
|
|
|
|
```text
|
|
.
|
|
├── .venv
|
|
│ ├── bin
|
|
│ ├── lib
|
|
│ └── pyvenv.cfg
|
|
├── .python-version
|
|
├── README.md
|
|
├── main.py
|
|
├── pyproject.toml
|
|
└── uv.lock
|
|
```
|
|
|
|
### `pyproject.toml`
|
|
|
|
The `pyproject.toml` contains metadata about your project:
|
|
|
|
```toml title="pyproject.toml"
|
|
[project]
|
|
name = "hello-world"
|
|
version = "0.1.0"
|
|
description = "Add your description here"
|
|
readme = "README.md"
|
|
dependencies = []
|
|
```
|
|
|
|
You'll use this file to specify dependencies, as well as details about the project such as its
|
|
description or license. You can edit this file manually, or use commands like `uv add` and
|
|
`uv remove` to manage your project from the terminal.
|
|
|
|
!!! tip
|
|
|
|
See the official [`pyproject.toml` guide](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/)
|
|
for more details on getting started with the `pyproject.toml` format.
|
|
|
|
You'll also use this file to specify uv [configuration options](../concepts/configuration-files.md)
|
|
in a [`[tool.uv]`](../reference/settings.md) section.
|
|
|
|
### `.python-version`
|
|
|
|
The `.python-version` file contains the project's default Python version. This file tells uv which
|
|
Python version to use when creating the project's virtual environment.
|
|
|
|
### `.venv`
|
|
|
|
The `.venv` folder contains your project's virtual environment, a Python environment that is
|
|
isolated from the rest of your system. This is where uv will install your project's dependencies.
|
|
|
|
See the [project environment](../concepts/projects/layout.md#the-project-environment) documentation
|
|
for more details.
|
|
|
|
### `uv.lock`
|
|
|
|
`uv.lock` is a cross-platform lockfile that contains exact information about your project's
|
|
dependencies. Unlike the `pyproject.toml` which is used to specify the broad requirements of your
|
|
project, the lockfile contains the exact resolved versions that are installed in the project
|
|
environment. This file should be checked into version control, allowing for consistent and
|
|
reproducible installations across machines.
|
|
|
|
`uv.lock` is a human-readable TOML file but is managed by uv and should not be edited manually.
|
|
|
|
See the [lockfile](../concepts/projects/layout.md#the-lockfile) documentation for more details.
|
|
|
|
## Managing dependencies
|
|
|
|
You can add dependencies to your `pyproject.toml` with the `uv add` command. This will also update
|
|
the lockfile and project environment:
|
|
|
|
```console
|
|
$ uv add requests
|
|
```
|
|
|
|
You can also specify version constraints or alternative sources:
|
|
|
|
```console
|
|
$ # Specify a version constraint
|
|
$ uv add 'requests==2.31.0'
|
|
|
|
$ # Add a git dependency
|
|
$ uv add git+https://github.com/psf/requests
|
|
```
|
|
|
|
If you're migrating from a `requirements.txt` file, you can use `uv add` with the `-r` flag to add
|
|
all dependencies from the file:
|
|
|
|
```console
|
|
$ # Add all dependencies from `requirements.txt`.
|
|
$ uv add -r requirements.txt -c constraints.txt
|
|
```
|
|
|
|
To remove a package, you can use `uv remove`:
|
|
|
|
```console
|
|
$ uv remove requests
|
|
```
|
|
|
|
To upgrade a package, run `uv lock` with the `--upgrade-package` flag:
|
|
|
|
```console
|
|
$ uv lock --upgrade-package requests
|
|
```
|
|
|
|
The `--upgrade-package` flag will attempt to update the specified package to the latest compatible
|
|
version, while keeping the rest of the lockfile intact.
|
|
|
|
See the documentation on [managing dependencies](../concepts/projects/dependencies.md) for more
|
|
details.
|
|
|
|
## Managing version
|
|
|
|
The `uv version` command can be used to read your package's version.
|
|
[See the publishing docs for updating your package's version](./package.md#updating-your-version).
|
|
|
|
To get the version of your package, run `uv version` with no other arguments:
|
|
|
|
```console
|
|
$ uv version
|
|
hello-world 0.7.0
|
|
```
|
|
|
|
To get the version of a particular package, pass `--package`:
|
|
|
|
```console
|
|
$ uv version --package myapp
|
|
myapp 1.2.3
|
|
```
|
|
|
|
To just get the version with no other output, pass `--short`:
|
|
|
|
```console
|
|
$ uv version --short
|
|
0.7.0
|
|
```
|
|
|
|
To get the version as json, pass `--output-format json`:
|
|
|
|
```console
|
|
$ uv version --output-format json
|
|
{
|
|
"package_name": "hello-world",
|
|
"version": "0.7.0",
|
|
"commit_info": null
|
|
}
|
|
```
|
|
|
|
## Running commands
|
|
|
|
`uv run` can be used to run arbitrary scripts or commands in your project environment.
|
|
|
|
Prior to every `uv run` invocation, uv will verify that the lockfile is up-to-date with the
|
|
`pyproject.toml`, and that the environment is up-to-date with the lockfile, keeping your project
|
|
in-sync without the need for manual intervention. `uv run` guarantees that your command is run in a
|
|
consistent, locked environment.
|
|
|
|
For example, to use `flask`:
|
|
|
|
```console
|
|
$ uv add flask
|
|
$ uv run -- flask run -p 3000
|
|
```
|
|
|
|
Or, to run a script:
|
|
|
|
```python title="example.py"
|
|
# Require a project dependency
|
|
import flask
|
|
|
|
print("hello world")
|
|
```
|
|
|
|
```console
|
|
$ uv run example.py
|
|
```
|
|
|
|
Alternatively, you can use `uv sync` to manually update the environment then activate it before
|
|
executing a command:
|
|
|
|
=== "macOS and Linux"
|
|
|
|
```console
|
|
$ uv sync
|
|
$ source .venv/bin/activate
|
|
$ flask run -p 3000
|
|
$ python example.py
|
|
```
|
|
|
|
=== "Windows"
|
|
|
|
```pwsh-session
|
|
PS> uv sync
|
|
PS> .venv\Scripts\activate
|
|
PS> flask run -p 3000
|
|
PS> python example.py
|
|
```
|
|
|
|
!!! note
|
|
|
|
The virtual environment must be active to run scripts and commands in the project without `uv run`. Virtual environment activation differs per shell and platform.
|
|
|
|
See the documentation on [running commands and scripts](../concepts/projects/run.md) in projects for
|
|
more details.
|
|
|
|
## Building distributions
|
|
|
|
`uv build` can be used to build source distributions and binary distributions (wheel) for your
|
|
project.
|
|
|
|
By default, `uv build` will build the project in the current directory, and place the built
|
|
artifacts in a `dist/` subdirectory:
|
|
|
|
```console
|
|
$ uv build
|
|
$ ls dist/
|
|
hello-world-0.1.0-py3-none-any.whl
|
|
hello-world-0.1.0.tar.gz
|
|
```
|
|
|
|
See the documentation on [building projects](../concepts/projects/build.md) for more details.
|
|
|
|
## Next steps
|
|
|
|
To learn more about working on projects with uv, see the
|
|
[projects concept](../concepts/projects/index.md) page and the
|
|
[command reference](../reference/cli.md#uv).
|
|
|
|
Or, read on to learn how to [build and publish your project to a package index](./package.md).
|