چه پیپ!؟

ساخت وبلاگ

یک شیرجه عمیق به مدیریت بسته بندی بهتر برای پایتون

پایتون غالباً مناسب برای علم داده است ، با این حال ، مدیریت بسته برای بسیاری از موارد سردرگمی باقی مانده است ، و این کار را حتی بیشتر انجام می دهد. دلایل مختلفی وجود دارد که یادگیری طناب ها به خوبی صرف شده است:

  • ما می توانیم کارهای دستی خسته کننده و وقت گیر را خودکار کنیم
  • ما می توانیم تغییرات وابستگی را با سایر توسعه دهندگان به اشتراک بگذاریم
  • ما می توانیم ساخت و سازهای قابل تکرار و اجرای آزمایش را تضمین کنیم

این مقاله با هدف انجام همین کار ، با فرض کمترین و بدون دانش قبلی در مورد موضوع ، خواننده را از طریق پیچیدگی ها و بهترین شیوه های مربوط به مدیریت وابستگی به پروژه های پایتون انجام می دهد. ما از همان ابتدا شروع خواهیم کرد ، بنابراین احساس راحتی کنید که از هر بخش که از قبل آشنا هستند ، پرش کنید.

به هر حال یک بسته چیست؟

بسته بندی مجموعه ای از ماژول های کد مرتبط است که به طور معمول در کنار هم قرار گرفته و توزیع می شود تا قابلیت های مفید و مشترکی را برای سایر سیستم های نرم افزاری فراهم کند. درست همانطور که توابع به ما امکان استفاده مجدد از کد خودمان را می دهند ، بسته ها یک روش استاندارد برای استفاده مجدد از کد شخص ثالث را ارائه می دهند.

در طول این مقاله ، بسته و وابستگی به طور متناوب استفاده می شود.

شاخص بسته بندی Python (PYPI) بستر توزیع انتخاب برای بسته های پایتون است که معمولاً با استفاده از نصب بسته برای ابزار خط فرمان پایتون (PIP) نصب می شوند.

این روش مدیریت وابستگی برای پروژه های کوچک کافی است. با رشد کد ما و اعتماد به بسته های بیشتر ، با این حال ، تلاش لازم برای به خاطر سپردن و نصب هرکدام غیر مهم می شود. به همین دلیل ، وابستگی های یک پروژه به طور معمول در یک پرونده مورد نیاز واقع در فهرست root ذکر شده است.

در حالت ایده آل ، این پرونده با منبع کنترل می شود تا اطمینان حاصل شود که تغییرات در وابستگی ها برای همه توسعه دهندگان در دسترس است.

گزین ه-r به ما امکان می دهد تا از یک فایل مورد نیاز با استفاده از PIP نصب کنیم.

تاکنون ، ما از توصیف مطالب این پرونده خودداری کرده ایم زیرا این موضوع در طول مقاله موضوع بحث داغ خواهد بود. در حال حاضر ، کافی است بدانید که هر خط باید نام یک بسته پایتون را داشته باشد.

روزی در غرب وحشی ، وحشی ...

پرونده الزامات یک پروژه مکانی بی قانونی بود که وابستگی های آن بدون شک و رایگان پرسه می زد. منظور ما این است که بسته ها به هیچ نسخه خاصی گره خورده اند: PIP آخرین نسخه را در هر نصب بارگیری می کند. مثلا:

چرا این یک مسئله است؟

عدم توانایی در تضمین نسخه بسته ، پیامدهای نگران کننده ای دارد ، به خصوص هنگامی که یک تغییر شکستن به API عمومی آن منتشر می شود.

یک توسعه دهنده یک بسته را نصب می کند ، سپس با استفاده از آن ، کد معتبر پایتون را می نویسد و اجرا می کند. در این مقطع زمانی ، همه چیز هلو به نظر می رسد!

با این حال ، بعداً ، این بسته تغییر شکستن را منتشر می کند. یک فرد نصب شده پس از آن این تغییر را دریافت می کند ، زیرا وابستگی از بین رفته است ، و همان کد با یک وارد کننده شکست می خورد.

این یک سردرد برای توسعه دهندگان است ، که نمی توانند تضمین کنند که کد با اطمینان بر روی ماشین های یکدیگر رفتار خواهد کرد. اگر یک توسعه دهنده دیگر را با یک تست خودکار جایگزین کنیم ، می توانیم ببینیم که چگونه مستعد خرابی متناوب خواهد بود. آنها را با یک اسکریپت استقرار جایگزین کنید و چنین شکستگی هایی می تواند به سیستم های زنده برسد.

یک سنجاق در آن قرار دهید

یعنی اینکه وابستگی های ما باید پین شود! پیننینگ به فرآیند مشخص کردن نسخه ها برای نصب صریح اشاره دارد ، تضمین می کند که وضوح بسته در زمان های مختلف قابل پیش بینی است.

یک رویکرد ساده این است که هر بسته را به نسخه موجود در حال حاضر خود بچسبانید ، که می توانیم از طریق معاینه با استفاده از PIP پیدا کنیم.

سپس با اضافه کردن دستی شماره نسخه پس از هر نام بسته ، پرونده مورد نیاز خود را پین می کنیم.

این مطمئناً پیشرفت در ترک همه چیز غیرقابل توصیف است ، اما از چند اشکال رنج می برد:

به روزرسانی دستی بسته ها خسته کننده است ، به خصوص که پرونده مورد نیاز ما بزرگ می شود. با این وجود ، عدم انجام این کار ، وابستگی های ما را بی ثبات می کند: قادر به بهره مندی از پیشرفت ها ، تکه ها یا رفع امنیت نیست.

مهمتر از همه ، هیچ تضمینی وجود ندارد که بسته هایی که ما به آنها اعتماد داریم ، وابستگی های خود را به هم می ریزند! بسته های بدون سیم ممکن است هنوز هم به صورت رو به رشد جمع شوند ، مگر اینکه کل درخت وابستگی را پین کنیم.

این به نوبه خود ، سر و صدایی را به پرونده مورد نیاز ما اضافه می کند: تمایز بین بسته های مستقیم و گذرا دشوار است و حتی برای مدیریت هر نسخه با دست حتی دشوار تر است.

اتوماسیون به نجات

خوشبختانه ، ابزارهایی وجود دارد که کار سخت را برای ما انجام می دهد. قابل ذکر است ، لوله های پیپ:

PIP-TOOLS: مجموعه ای از ابزارها برای نگه داشتن وابستگی های پایتون شما تازه.

بیایید با استفاده از پرونده مورد نیاز قبلی ما به عنوان نمونه ، به دو ابزار ارائه شده ، PIP-Compile و PIP-SYNC نگاهی بیندازیم. طبق کنوانسیون ، این پرونده اکنون باید پسوند داده شود.

نگه داشتن یک کپی از بسته های غیرقابل کنترل از این طریق ، مشاهده و مدیریت وابستگی مستقیم پروژه را آسان می کند ، و از هم جدا شدن نیازهای پین شده از موضوع موضوع جدا می شود.

از وابستگی های غیرمجاز ، PIP-Compile برای ما آنهایی را برای ما ایجاد می کند ، و با استفاده از خسته کننده نسخه های مناسب و اضافه کردن محدودیت های مناسب ، دست به دست هم می دهد.

خروجی یک فایل مورد نیاز آشنا است.

با بررسی الزامات. txt ، باید ما را خوشحال کنیم که دریابیم که کل درخت وابستگی پین شده است ، و اطمینان حاصل می کند که نصب های بعدی قابل پیش بینی و قابل تکرار خواهند بود. همچنین می توانیم ببینیم که هر بسته از کجا آمده است و قابلیت ردیابی برای اشکال زدایی را بهبود می بخشد.

هر زمان که بخواهیم همه بسته ها را به روز کنیم ، می توانیم PIP-Compile را دوباره اجرا کنیم تا با جدیدترین نسخه ها نیازهای پین شده خود را بازسازی کنیم: خیلی راحت تر از اینکه خودمان را به صورت دستی دست و پنجه نرم کنیم!

بسته های جداگانه را می توان با استفاده از آرگومان-بسته بندی-بسته بندی به روز کرد.

پس از آن ، PIP-SYNC به ما اجازه می دهد تا این وابستگی های پین را نصب کنیم. بهتر است این کار را در یک محیط مجازی انجام دهید تا نسخه بسته در پروژه های مختلف روی یکدیگر نصب نشود.

با استفاده از این ابزارها در کمربند ما ، ما در راه تبدیل شدن به یک Python Pack Pro Pro هستیم!

اما صبر کنید ، چیزهای بیشتری وجود دارد!

تاکنون ، ما در مورد بسته ها به عنوان وابستگی به زمان اجرا سیستم های نرم افزاری بحث کرده ایم. این داستان به آنجا ختم نمی شود ، با این حال ، به عنوان ابزارهای بسته بندی شده اضافی ممکن است در روند توسعه کمک کند: خطوط ، چارچوب های آزمایش ، کتابخانه های استقرار ، به نام چند مورد.

مدیریت نسخه های ابزار به همان شیوه به همان دلایلی که در ابتدا بیان شد مطلوب است ، اما چنین ابزارهایی فقط در زمینه های خاص مورد نیاز است. در حالی که برای توسعه دهندگان و تست های آنها مفید است ، این بسته ها توسط خود منبع استفاده نمی شوند و به آنها اجازه می دهد هنگام بسته بندی با کد برای استقرار ، آنها را نادیده بگیرند. این باعث می شود اندازه و سطح حمله بالقوه آثار باستانی ساخت.

یک روش متداول برای دستیابی به این جداسازی ، نگه داشتن چندین پرونده مورد نیاز است: هرکدام بسته های مورد نیاز در یک زمینه خاص را مشخص می کنند. ما از دو پرونده از این دست استفاده خواهیم کرد.

مورد نیاز. in حاوی وابستگی های زمان اجرا نشده آشنا ما است.

مورد نیاز dev. in حاوی وابستگی های توسعه نشده ما است.

یک بار دیگر ، ضروری است که نسخه های بسته در حین توسعه ، آزمایش و استقرار برای تضمین قابلیت پیش بینی کد ثابت بمانند. از آنجا که هر پرونده مورد نیاز مستقل است ، بسته های مشترک احتمالاً به نسخه های مختلف پین می شوند. استفاده از PIP-SYNC برای نصب هر دو پرونده . txt در کنار هم ، مسئله را برجسته می کند ، اما آن را برطرف نمی کند.

به عنوان یک راه حل ، ما با اضافه کردن مرجع بین زمان اجرا و الزامات توسعه خود شروع می کنیم.

سپس ، ما می توانیم از یک ابزار جدید ، Pip-Compile-Multi استفاده کنیم:

PIP-Compile-Multi: چندین پرونده مورد نیاز را برای قفل کردن نسخه های وابستگی تهیه کنید.

عملکرد PIP-Compile-Multi به طور مشابه با PIP-Compile ، به ما امکان می دهد چندین مجموعه از وابستگی ها را با هم جمع کنیم و در عین حال منابع را نیز ردیابی کنیم. بسته هایی که قبلاً در زمان اجرا ما پین شده اند ، از الزامات توسعه حذف می شوند به طوری که سابق به عنوان منبع واحد حقیقت برای نسخه های بسته بندی مشترک عمل می کند. این به ما امکان می دهد هر دو مجموعه الزامات را بدون درگیری نصب کنیم.

خلاصه

  • بسته ها به ما این امکان را می دهند تا از عملکردهای مشترک و مشترکی که توسط اشخاص ثالث در سیستم های نرم افزاری ما ایجاد شده است استفاده مجدد کنیم.
  • بسته های پایتون با استفاده از PYPI توزیع می شوند و با استفاده از PIP نصب می شوند.
  • بسته های پایتون به طور معمول برای سهولت در مدیریت در یک پرونده مورد نیاز ذکر شده و به آنها امکان کنترل نسخه می دهند.
  • بسته ها باید پین شوند تا اطمینان حاصل شود که نصب ها در زمان های مختلف قابل پیش بینی و قابل تکرار هستند.
  • بسته های پین های پیپ برای ما ، به روزرسانی آنها را آسان تر می کند. این به ما امکان می دهد از پیشرفت ها ، تکه ها و رفع امنیت بهره مند شویم.
  • تقسیم الزامات توسط زمینه های کاربرد و توسعه به ما امکان می دهد تا اندازه آثار باستانی ساخت را به حداقل برسانیم.
  • PIP-Compile-Multi چندین پرونده مورد نیاز را با هم گردآوری می کند ، و از تضاد نسخه های بسته بندی شده جلوگیری می کند.

با تشکر از شما برای وقت خواندن این مقاله! امیدوارم که این امر مفید باشد ، و از هرگونه بازخورد بسیار استقبال می شود.

فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید

برچسب : نویسنده : احمد قانع پور بازدید : 41 تاريخ : شنبه 9 ارديبهشت 1402 ساعت: 12:45