poetry-rye-dependency-management
Poetry / Rye Dependency Management Skill
Overview
Poetry and Rye are Python dependency managers that enforce lockfile-driven, deterministic builds. Both use pyproject.toml as the single configuration file. Poetry is the established standard (since 2018); Rye is a newer Astral tool that bridges to uv. For greenfield projects, consider modern-python skill (uv-native). This skill covers Poetry/Rye for existing codebases and teams already invested in these tools.
When to Use
- When maintaining existing Poetry or Rye projects
- When a team has standardized on Poetry and migration to uv is not planned
- When publishing Python packages to PyPI (Poetry has mature publishing support)
- When managing monorepo Python workspaces
- When auditing or upgrading dependency lockfiles
Iron Laws
- ALWAYS commit the lockfile (
poetry.lockorrequirements.lock) -- without it, builds are non-deterministic and CI/CD will resolve different versions than development. - NEVER use
pip installin a Poetry/Rye-managed project -- it bypasses the resolver and creates ghost dependencies invisible to the lockfile. - ALWAYS use
poetry add/rye addto add dependencies -- manualpyproject.tomledits without re-locking create stale lockfiles. - NEVER pin transitive dependencies manually -- let the solver manage the full dependency graph; pinning transitive deps causes resolver conflicts.
- ALWAYS separate runtime and development dependencies into groups -- shipping dev/test dependencies in production images wastes space and expands attack surface.
Anti-Patterns
| Anti-Pattern | Why It Fails | Correct Approach |
|---|---|---|
Editing pyproject.toml deps without running poetry lock |
Lockfile becomes stale; CI installs different versions than intended | Always run poetry lock or rye lock after any dependency change |
Using poetry install without --no-root in CI |
Installs the project in editable mode unnecessarily; slower CI builds | Use poetry install --no-root for library deps only, --only main for production |
Committing .venv/ directory to version control |
Bloats repo; virtualenvs are platform-specific and non-portable | Add .venv/ to .gitignore; recreate with poetry install or rye sync |
| Mixing pip and Poetry in the same project | Creates two dependency graphs; pip-installed packages invisible to Poetry | Use only poetry add/rye add for all dependency changes |
Using * version constraints for all dependencies |
No upper bound protection; major version bumps break silently | Use compatible release (^ in Poetry) or upper-bounded ranges |
Workflow
Poetry Project Setup
# Initialize new project
poetry init --name my-project --python ">=3.12"
# Add dependencies by group
poetry add requests httpx
poetry add --group dev ruff pytest pytest-cov
poetry add --group docs sphinx
# Install all groups
poetry install
# Install production only
poetry install --only main
Rye Project Setup
# Initialize new project
rye init my-project
cd my-project
# Add dependencies
rye add requests httpx
rye add --dev ruff pytest pytest-cov
# Sync (install) dependencies
rye sync
pyproject.toml Configuration (Poetry)
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "Project description"
authors = ["Team <team@example.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = ">=3.12"
requests = "^2.31"
httpx = "^0.27"
[tool.poetry.group.dev.dependencies]
ruff = "^0.9"
pytest = "^8.0"
pytest-cov = "^6.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
CI/CD Integration (GitHub Actions)
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install Poetry
run: pipx install poetry
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ~/.cache/pypoetry
key: poetry-$HASH_OF_LOCKFILE
- name: Install dependencies
run: poetry install --no-root
- name: Lint
run: poetry run ruff check .
- name: Test
run: poetry run pytest --cov
Security Audit
# Poetry: audit dependencies for known CVEs
poetry audit
# Rye: use pip-audit integration
rye run pip-audit
Migration to uv
When ready to migrate from Poetry/Rye to uv:
# Export Poetry dependencies
poetry export -f requirements.txt --output requirements.txt
# Initialize uv project
uv init
uv add $(grep -v '^#' requirements.txt | grep -v '^\-' | cut -d'=' -f1)
# Verify
uv sync
uv run pytest
See modern-python skill for the complete uv workflow.
Complementary Skills
| Skill | Relationship |
|---|---|
modern-python |
uv-native workflow (recommended for greenfield projects) |
python-backend-expert |
Framework-specific patterns (Django, FastAPI, Flask) |
tdd |
Test-driven development methodology |
comprehensive-unit-testing-with-pytest |
Testing strategies and patterns |
Memory Protocol (MANDATORY)
Before starting:
Read .claude/context/memory/learnings.md for prior Python packaging decisions.
After completing: Record any migration issues, version constraints, or resolver conflicts to .claude/context/memory/learnings.md.
ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.