pip và requirements.txt vẫn chạy tốt, nhưng chúng không khóa được phiên bản phụ thuộc gián tiếp và không quản lý môi trường ảo giúp bạn. Poetry và uv sinh ra để giải quyết cả hai.
Vấn đề của requirements.txt
Bạn ghi requests==2.31.0, nhưng requests lại kéo theo urllib3, certifi… mà bạn không ghi phiên bản. Ba tháng sau cài lại, một thư viện con cập nhật và ứng dụng hỏng — trong khi file requirements không đổi một chữ.
Poetry: đầy đủ và ổn định
pip install poetry
poetry new duan-cua-toi # tạo cấu trúc chuẩn
cd duan-cua-toi
poetry add requests pandas
poetry add --group dev pytest ruff
poetry install # cài đúng theo poetry.lock
poetry run python main.py
# pyproject.toml
[project]
name = "duan-cua-toi"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["requests>=2.31", "pandas>=2.0"]
File poetry.lock ghi lại chính xác từng phiên bản của toàn bộ cây phụ thuộc. Commit nó vào Git để mọi máy và server đều cài y hệt nhau.
uv: rất nhanh
curl -LsSf https://astral.sh/uv/install.sh | sh
uv init duan-cua-toi
cd duan-cua-toi
uv add requests pandas
uv add --dev pytest
uv run python main.py # tự tạo và dùng môi trường ảo
uv sync # cài đúng theo uv.lock
uv viết bằng Rust và thường nhanh hơn pip hàng chục lần. Nó còn quản lý luôn cả phiên bản Python:
uv python install 3.12
uv run --python 3.12 main.py
Nên chọn cái nào?
- uv — dự án mới, CI cần nhanh, hoặc bạn phải làm việc với nhiều phiên bản Python. Đây là lựa chọn mặc định hợp lý hiện nay.
- Poetry — dự án đã dùng sẵn, hoặc nhóm quen công cụ này và cần các tính năng xuất bản package đã trưởng thành.
- pip + venv — script nhỏ, một file, không đáng thêm công cụ.
Điểm chung quan trọng nhất
Dù chọn gì, hãy commit file khóa (poetry.lock hoặc uv.lock) và đừng commit thư mục .venv. Đó là ranh giới giữa “chạy được trên máy tôi” và “chạy được ở mọi nơi”.
