قدرت پایتون در اکوسیستم گسترده کتابخانههای شخص ثالث آن نهفته است. با این حال، برای بسیاری از توسعهدهندگان، سفر از نوشتن یک اسکریپت تا توزیع یک بسته قدرتمند همچنان یک جعبه سیاه باقی مانده است. درک نحوه بستهبندی، ساخت و توزیع صحیح پروژههای پایتون برای هر توسعهدهنده متوسط تا پیشرفتهای که میخواهد کد خود را به اشتراک بگذارد، روی پروژههای متنباز همکاری کند یا ابزارهای داخلی را در یک نمایه خصوصی منتشر کند، ضروری است.
در این راهنما، ما منظره بستهبندی مدرن پایتون را شفافسازی میکنیم. ما از مونولیت قدیمی setup.py فراتر رفته و استانداردهای جدیدتر و قدرتمندتری را که توسط مرجع بستهبندی پایتون (PyPA) توصیه شدهاند، در پیش میگیریم.
گذار از Setuptools به PEP 517/518
تاریخچه بستهبندی پایتون به شدت بر setuptools و یک فایل setup.py طولانی و پیچیده متکی بود. اگرچه این رویکرد کارآمد بود، اما اغلب منجر به ساختهای شکننده و پراکندگی پیکربندی میشد. جامعه توسعهدهندگان از آن زمان به سمت بکاندهای ساخت استاندارد تعریف شده در PEP 517 و PEP 518 حرکت کرده است.
استاندارد جدید دو فایل کلیدی را معرفی میکند:
- pyproject.toml: الزامات ساخت و متادیتای پروژه را اعلام میکند.
- بکاند ساخت: ابزاری مانند
setuptools،poetryیاflitکه عملیات ساخت واقعی را انجام میدهد.
تعریف ساختار پروژه
یک ساختار پروژه تمیز، پایه و اساس یک بسته قابل نگهداری است. اگرچه variations زیادی وجود دارد، اما یک چیدمان مدرن رایج به این شکل است:
my_package/
├── pyproject.toml
├── README.md
├── LICENSE
└── src/
└── my_package/
├── __init__.py
├── core.py
└── utils.py
استفاده از چیدمان src/ به شدت توصیه میشود. این کار از واردات تصادفی فایلهای محلی در طول تست جلوگیری کرده و اطمینان حاصل میکند که بسته نصب شده همیشه همان چیزی است که تست میشود، نه کد منبع موجود در دایرکتوری فعلی شما.
پیکربندی pyproject.toml
فایل pyproject.toml منبع حقیقت واحد برای متادیتای پروژه شماست. در زیر یک نمونه پیکربندی با استفاده از setuptools به عنوان بکاند ساخت آورده شده است که رایجترین استاندارد پذیرفته شده است.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-awesome-package"
version = "0.1.0"
description = "A sample Python package for demonstration."
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.8"
authors = [
{name = "Jane Developer", email = "jane@example.com"},
]
dependencies = [
"requests>=2.28.0",
"click>=8.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=22.0.0",
]
ویژگیهای کلیدی که باید در این پیکربندی مورد توجه قرار گیرد:
- متادیتای پویا: میتوانید اعداد نسخه را در فایلهای جداگانه نگه دارید تا از بهروزرسانیهای دستی جلوگیری شود.
- وابستگیهای اختیاری: کاربران میتوانند ابزارهای توسعه را از طریق
pip install my-package[dev]نصب کنند. - محدودیت نسخه پایتون: تعریف صریح
requires-pythonاطمینان حاصل میکند که بررسیهای سازگاری انجام شود.
ساخت و توزیع
پس از پیکربندی pyproject.toml، ساخت بسته شما ساده است. ابتدا مطمئن شوید که جدیدترین ابزارهای ساخت نصب شدهاند:
pip install build twine
سپس، دستور ساخت را از ریشه پروژه خود اجرا کنید. این دستور یک دایرکتوری dist/ ایجاد میکند که شامل توزیع منبع (sdist) و یک فایل wheel است.
python -m build
خروجی چیزی شبیه به این خواهد بود:
Creating sdist archive: dist/my_awesome_package-0.1.0.tar.gz
Creating wheel archive: dist/my_awesome_package-0.1.0-py3-none-any.whl
Sdist شامل کد منبع است و نیاز دارد که محیط کاربر در طول نصب، wheel را بسازد. Wheel یک توزیع ساخته شده است که آماده نصب است و معمولاً سریعتر است و برای بیشتر موارد استفاده ترجیح داده میشود.
تست قبل از انتشار
هرگز مستقیماً در نمایه زنده PyPI منتشر نکنید. در عوض، از TestPyPI استفاده کنید که یک نمونه جداگانه برای تست است.
- در test.pypi.org یک حساب کاربری ایجاد کنید.
- یک توکن API در تنظیمات حساب کاربری خود تولید کنید.
- بسته خود را با استفاده از
twineآپلود کنید:
twine upload --repository testpypi dist/*
سپس میتوانید نصب را در یک محیط مجازی تمیز تست کنید:
pip install --index-url https://test.pypi.org/simple/ --no-deps my-awesome-package
نتیجهگیری
بستهبندی پایتون به طور قابل توجهی تکامل یافته و به سمت استانداردسازی و سهولت استفاده حرکت کرده است. با پذیرش ابزارهای مدرن و پیروی از بهترین شیوهها مانند چیدمان src/ و پیکربندی صحیح pyproject.toml، اطمینان حاصل میکنید که بستههای شما قدرتمند، قابل تکرار و برای دیگران آسان برای مصرف هستند. چه یک کتابخانه را با جامعه به اشتراک بگذارید و چه ابزارهای داخلی را مستقر کنید، تسلط بر این مراحل یک مهارت حیاتی در جعبه ابزار توسعهدهنده پایتون مدرن است.