Faragiri

همهٔ زبان‌ها

آموزش کامپوزر PHP

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

۴بخش
۳دقیقه خواندن
۴عمق

پنج لایه، دو فایل

چه چیزی مال شماست و چه چیزی خروجی است

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

  1. composer.jsonچیزی که خواسته‌اید، به‌شکل بازه نسخهدر مخزن
  2. composer.lockچیزی که حل شد، با نسخه دقیق و هش هر بستهدر مخزن
  3. کش محلی کامپوزرآرشیو بسته‌های گرفته‌شده، و همان چیزی که ارزش کپی کردن داردروی ماشین
  4. پوشه بسته‌هاساخته می‌شود و هیچ‌وقت در مخزن نمی‌رودخروجی
  5. نقشه بارگذاری خودکارهمان فایلی که یک require در ابتدای برنامه به آن اشاره می‌کندخروجی

این ترتیب می‌گوید چه چیزی از چه چیزی ساخته می‌شود و نه اینکه چه وقت. سه لایه پایین را می‌شود هر لحظه دور ریخت و از دو لایه بالا دوباره ساخت، مادام که به شبکه دسترسی باشد.

کامپوزر سه چیز تولید می‌کند و مرزشان همان چیزی است که تفاوت میان یک استقرار قابل تکرار و یک استقرار تصادفی را می‌سازد.

  • composer.json چیزی را نگه می‌دارد که خواسته‌اید، به‌شکل بازه نسخه
  • composer.lock چیزی را نگه می‌دارد که واقعا حل شد، با نسخه دقیق و هش
  • پوشه بسته‌ها خروجی است و هیچ‌وقت در مخزن نمی‌رود

دو فایل اول باید در مخزن باشند و همین دومی است که معمولا فراموش می‌شود. بدون فایل قفل، دو ماشین می‌توانند دو نسخه متفاوت بگیرند و هیچ‌جا هم نوشته نشده، و همان است که «روی ماشین من کار می‌کند» را می‌سازد.

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

بارگذاری خودکار، که کار اصلی است

چیزی که کامپوزر بیش از هر چیز دیگری می‌دهد یک فایل است که همه چیز را وصل می‌کند: یک require در ابتدای برنامه، و از آن به بعد هر کلاسی که نامش را بنویسید خودش پیدا می‌شود. این هم برای بسته‌های بیرونی کار می‌کند و هم برای کد خودتان، اگر نگاشت فضای نام خودتان را در همان فایل تنظیمات اعلام کرده باشید.

خطای «کلاس پیدا نشد» پس از افزودن یک کلاس تازه، تقریبا همیشه یعنی نقشه بارگذاری خودکار به‌روز نشده. تولید دوباره آن یک دستور است و به شبکه نیازی ندارد. جزئیات نگاشت در کلاس، فضای نام، و بارگذاری خودکار است.

محدوده نسخه، و کاری که علامت‌ها می‌کنند

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

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

جایی که کار گیر می‌کند، دانلود از مخزن بسته‌هاست

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

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶ کامپوزر ابزار استاندارد و بی‌رقیب مدیریت بسته در PHP است، متن‌باز و رایگان، و جای دانلود دستی کتابخانه‌ها و require کردن فایل‌به‌فایل را گرفته که تا حدود سال ۲۰۱۲ روش رایج بود. برای بررسی اینکه بسته‌های نصب‌شده آسیب‌پذیری شناخته‌شده دارند یا نه، خود کامپوزر یک دستور بازبینی دارد و به یک پایگاه داده عمومی وصل می‌شود؛ همین یک دستور باید در خط لوله باشد.

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

کنار این

بالای این