---
name: poetry-rye-dependency-management
description: Python dependency management with Poetry and Rye -- lockfile-driven workflows, dependency groups, monorepo patterns, and migration paths. Covers pyproject.toml-centric packaging for projects not yet on uv.
version: 2.0.0
category: Languages
agents: [python-pro, developer]
tags: [python, poetry, rye, dependency-management, packaging, pyproject-toml, lockfile]
model: sonnet
invoked_by: both
user_invocable: true
tools: [Read, Write, Edit, Bash, Glob, Grep]
globs: '**/pyproject.toml'
best_practices:
- Always commit lockfiles (poetry.lock / requirements.lock) for reproducible builds
- Use dependency groups to separate dev, test, and docs dependencies
- Pin direct dependencies to compatible ranges; let the solver resolve transitive deps
- Run lockfile audits regularly to detect known CVEs in dependencies
- Prefer pyproject.toml over setup.py/setup.cfg for all new projects
error_handling: graceful
streaming: supported
verified: true
lastVerifiedAt: '2026-03-01'
---
# Poetry / Rye Dependency Management Skill
Python dependency management specialist for Poetry and Rye workflows. Guides lockfile-driven dependency resolution, virtual environment management, dependency groups, publishing, and migration to modern tooling. Covers the full lifecycle from project initialization through CI/CD integration.
- Initialize new Python projects with Poetry or Rye
- Manage dependency groups (main, dev, test, docs, optional extras)
- Configure lockfile-driven builds for reproducibility
- Set up CI/CD pipelines with cached dependency installation
- Migrate between Poetry, Rye, pip, and uv workflows
- Configure monorepo dependency management with workspaces
- Audit dependencies for security vulnerabilities
- Publish packages to PyPI using Poetry or Rye
## 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
1. **ALWAYS** commit the lockfile (`poetry.lock` or `requirements.lock`) -- without it, builds are non-deterministic and CI/CD will resolve different versions than development.
2. **NEVER** use `pip install` in a Poetry/Rye-managed project -- it bypasses the resolver and creates ghost dependencies invisible to the lockfile.
3. **ALWAYS** use `poetry add`/`rye add` to add dependencies -- manual `pyproject.toml` edits without re-locking create stale lockfiles.
4. **NEVER** pin transitive dependencies manually -- let the solver manage the full dependency graph; pinning transitive deps causes resolver conflicts.
5. **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
```bash
# 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
```bash
# 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)
```toml
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = "Project description"
authors = ["Team "]
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)
```yaml
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
```bash
# 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:
```bash
# 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.