Skip to content

Commit c517fde

Browse files
committed
add guide on Migrating from pip requirements files to uv
1 parent 7913d54 commit c517fde

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

docs/posts/2025/2025-08-26-python-uv-cheat-sheet.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,3 +568,81 @@ The tool will be installed in an isolated environment in the user's cache direct
568568
## Workspace
569569

570570
To be continued.
571+
572+
## Migrating from pip requirements files to uv
573+
574+
Say a project uses `requirements.txt` to manage dependencies, there's no setup.py, the build config is declared in the `pyproject.toml` and now we want to migrate to `uv` with `pyproject.toml`.
575+
576+
Before the migration, there're 3 req files:
577+
578+
```bash
579+
requirements/
580+
base.txt
581+
dev.txt
582+
docs.txt
583+
```
584+
585+
and they're declared as dynamic dependencies in `pyproject.toml`.
586+
587+
```toml
588+
[project]
589+
name = "fastapi-demo"
590+
dynamic = ["version", "dependencies", "optional-dependencies"]
591+
592+
[tool.setuptools.dynamic]
593+
version = { file = ["VERSION"] }
594+
595+
[tool.setuptools.dynamic.dependencies]
596+
file = ["requirements/base.txt"]
597+
598+
[tool.setuptools.dynamic.optional-dependencies]
599+
dev = { file = ["requirements/dev.txt"] }
600+
docs = { file = ["requirements/docs.txt"] }
601+
```
602+
603+
Now need to remove the dynamic dependencies part in `pyproject.toml`, change to static dependencies, like below:
604+
605+
```diff
606+
[project]
607+
name = "fastapi-demo"
608+
- dynamic = ["version", "dependencies", "optional-dependencies"]
609+
+ dynamic = ["version"]
610+
611+
[tool.setuptools.dynamic]
612+
version = { file = ["VERSION"] }
613+
614+
- [tool.setuptools.dynamic.dependencies]
615+
- file = ["requirements/base.txt"]
616+
617+
- [tool.setuptools.dynamic.optional-dependencies]
618+
- dev = { file = ["requirements/dev.txt"] }
619+
- docs = { file = ["requirements/docs.txt"] }
620+
```
621+
622+
And run the pip req file to uv migration with following command:
623+
624+
```bash
625+
rm uv.lock
626+
627+
deactivate && rm -rf .venv
628+
629+
uv venv
630+
# or: uv venv -p 3.13.9
631+
632+
# Add all base dependencies as main dependencies at once
633+
grep -v '^#' requirements/base.txt | grep -v '^$' | xargs -I {} uv add {}
634+
635+
# Add all docs dependencies as extra at once
636+
grep -v '^#' requirements/docs.txt | grep -v '^$' | xargs -I {} uv add --extra docs {}
637+
638+
# Add all dev dependencies as dev group at once
639+
grep -v '^#' requirements/dev.txt | grep -v '^$' | xargs -I {} uv add --dev {}
640+
641+
rm -rf requirements/
642+
```
643+
644+
Future full installation could be done by:
645+
646+
```bash
647+
uv sync --frozen --all-extras --all-groups
648+
```

0 commit comments

Comments
 (0)