Nỗi ám ảnh mang tên “tái sử dụng code”
Hồi mới làm dự án, mình thường xuyên copy-paste các hàm xử lý logic từ tool này sang tool khác. Một script automation ban đầu chỉ tầm 200 dòng, nhưng sau vài tháng bảo trì, nó phình lên hơn 2.000 dòng. Lúc này, quản lý thư viện phụ thuộc bằng file requirements.txt bắt đầu trở thành một thảm họa.
Chỉ cần chuyển sang máy mới, mình lại loay hoay fix lỗi xung đột phiên bản. Thậm chí, khi muốn biến đống code đó thành một package để cài qua pip install, mình đã suýt bỏ cuộc. Đống cấu hình loằng ngoằng của setup.py và MANIFEST.in thực sự là một rào cản lớn.
Tại sao cách làm truyền thống lại gây đau đầu?
Nếu bạn từng thử đóng gói thư viện theo cách cũ (Setuptools), bạn sẽ thấy quy trình này cực kỳ rời rạc:
- Dùng
requirements.txtđể cài môi trường. - Dùng
setup.pyhoặcsetup.cfgđể định nghĩa metadata. - Dùng
MANIFEST.inchỉ để quản lý các file phi kỹ thuật như README hay License. - Đối mặt với “Dependency Hell” khi các thư viện yêu cầu phiên bản chéo nhau không tương thích.
Quên cập nhật version trong setup.py trước khi upload là lỗi kinh điển. Kết quả? Bạn phải xóa bản cũ, đổi tên hoặc tăng version rồi upload lại từ đầu rất mất thời gian.
Các giải pháp hiện nay: Đâu là lựa chọn tối ưu?
Cộng đồng Python đã ra mắt nhiều công cụ hiện đại để dọn dẹp đống lộn xộn này:
- Flit: Siêu nhẹ, cực kỳ phù hợp cho các thư viện đơn giản.
- Pipenv: Quản lý môi trường ảo rất tốt nhưng tính năng đóng gói package còn hạn chế.
- Poetry: Lựa chọn số 1 của mình cho mọi dự án, từ script cá nhân đến hệ thống doanh nghiệp lớn.
Poetry – Tất cả trong một file cấu hình duy nhất
Poetry gom mọi thứ vào file pyproject.toml. Nó quản lý dependency chặt chẽ nhờ file lock, đồng thời hỗ trợ build và publish lên PyPI chỉ với vài câu lệnh đơn giản.
Bước 1: Cài đặt Poetry chuẩn xác
Đừng dùng pip install poetry để tránh làm nhiễm bẩn môi trường hệ thống. Thay vào đó, hãy dùng script cài đặt chính thức:
curl -sSL https://install.python-poetry.org | python3 -
Cài xong, bạn hãy gõ poetry --version để chắc chắn mọi thứ đã sẵn sàng.
Bước 2: Khởi tạo dự án
Để tạo một thư viện mới tên là itfromzero-utils, bạn chỉ cần chạy:
poetry new itfromzero-utils
Nếu bạn đã có code sẵn, hãy dùng lệnh poetry init trong thư mục dự án. Poetry sẽ hỏi bạn vài câu về metadata và tự động tạo file pyproject.toml cực kỳ chuyên nghiệp.
Bước 3: Quản lý Dependency thông minh
Quên việc sửa file text thủ công đi. Nếu cần thư viện requests, bạn chỉ việc gõ:
poetry add requests
Poetry sẽ tự tìm phiên bản phù hợp, cập nhật pyproject.toml và tạo file poetry.lock. File lock này đảm bảo 100% đồng nghiệp của bạn sẽ có môi trường y hệt khi cài đặt.
Bước 4: Viết code và kiểm thử
Hãy đặt các hàm xử lý chính vào thư mục itfromzero_utils/. Kinh nghiệm của mình là chỉ quản lý version tại file pyproject.toml. Để tăng version nhanh, bạn có thể dùng lệnh poetry version patch (ví dụ từ 0.1.0 lên 0.1.1).
Để chạy thử code trong môi trường cô lập, hãy dùng:
poetry run python main.py
Bước 5: Đưa thư viện lên “chảo lửa” PyPI
Đầu tiên, bạn cần tài khoản trên PyPI. Hãy tạo một API Token để bảo mật thay vì dùng mật khẩu cá nhân.
Cấu hình token cho Poetry bằng lệnh:
poetry config pypi-token.pypi your-api-token-here
Cuối cùng, chạy lệnh gom tất cả các bước build và publish vào làm một:
poetry publish --build
Lệnh này sẽ tạo file .whl và đẩy thẳng lên kho lưu trữ chính thức của Python trong tích tắc.
Mẹo thực chiến: Tránh làm rác PyPI
Đừng vội publish bản chính thức ngay lần đầu. Hãy tận dụng TestPyPI – một môi trường sandbox để bạn thử nghiệm thoải mái.
poetry config repositories.testpypi https://test.pypi.org/legacy/
poetry publish -r testpypi --build
Sau khi kiểm tra tên package hiển thị đẹp mắt và không lỗi font README, lúc đó hãy nhấn nút publish thật.
Vài lưu ý nhỏ để tránh lỗi 403
- Check tên: Hãy tìm trên PyPI xem tên thư viện đã bị ai lấy chưa.
- Gitignore: Luôn ignore thư mục
dist/để tránh đẩy các file build nặng nề lên GitHub. - Semantic Versioning: Tuân thủ quy tắc
Major.Minor.Patch. PyPI cực kỳ nghiêm ngặt, bạn không thể upload đè lên một version đã tồn tại.
Sử dụng Poetry giúp mình tiết kiệm hàng giờ đồng hồ khi quản lý các dự án Python phức tạp. Từ một người từng sợ đóng gói, giờ đây mình có thể release phiên bản mới chỉ trong chưa đầy 2 phút. Nếu bạn gặp khó khăn trong quá trình cài đặt, cứ để lại comment phía dưới nhé!

