چطور با کمک گیت‌هاب یه Package manager برای یونیتی نوشتم؟

مقدمه از وقتی کار با یونیتی رو شروع کردم، دوست داشتم بتونم یه جوری از Asset هایی که زیاد استفاده میکنم توی هر پروژه ای که میخوام استفاده کنم. یه راهش این بود که همش رو بریزم توی یه پوشه، ازش یه Package درست کنم و اکسپورت کنم و توی پروژه های دیگه وارد کنم.مزیت: سریعمطمئن (چون توی پروژه قبلی کار کرده)عیب: پکیج ها آپدیت نمیشنپکیج ها قبل از ایمپورت کردن قابل انتخاب نیستننمیشه مدیریتشون کردحس گیک بودن بهم دست نمیدهبجز این موارد، با Package manager های مختلفی مثل npm هم آشنایی ابتدایی داشتم ولی هیچ ایده ای نداشتم که چطور باید شروع کنم به نوشتن همچین چیزی.از طرف دیگه خود یونیتی AssetStore ای داره که میشه Asset های مختلف رو از اونجا دانلود کرد ولی خب شخصاً بجز Asset های پولی، زیاد ازش استفاده نمیکنم.تلاش اول:یک سال قبل – شروع کردم به خوندن و یاد گرفتن و نگاه کردن به ساز و کار پکیج منیجرها. درست یا غلط اینجوری دستم اومد که باید یه سرور داشته باشم که لیست همه پکیج ها رو به همراه سورسشون توش نگهداری کنه (که نه سوادش رو داشتم و نه سرورش رو)، بتونم یه CLI بنویسم که بشه پکیج ها رو از سرور دانلود کنه (که بلد نبودم) و سرافکنده شدم و بدون اینکه صداشو در بیارم صفحه ها رو بستم و رفتم دنبال کارم.تلاش دوم:نسخه جدید یونیتی یه Pakcage manager داخلی توش گذاشته که پکیج های خودش رو توش میذاره و به روز رسانی میکنه و از این کارا. هفته پیش دوباره انگولک شدم. توی این مدت چنتا ریپازیتوری توی گیت‌هاب برای کارای مختلف توی یونیتی درست کرده بودم و حداقل خودم توی پروژه های خودم ازشون استفاده میکردم.دیدم میشه به فایل‌ها توی گیت‌هاب لینک مستقیم با آدرس ثابت داشت.سرچ کردم و دیدم میشه با توجه به نسخه های منتشر شده از هر ریپازیتوری، با داشتن اسم ریپازیتوری، نام کاربری صاحبش و نسخهٔ منتشر شده به لینک دانلود از صفحهٔ Release رسید! اینارو کنار هم گذاشتم و دیدم من که میتونم یه EditorTool بنویسم که یه JSON مثل این رو از توی گیت‌هاب بخونه و محتواش رو پارس کنه:{ "packages": [ { "name": "Open Audio", "description": "singleton audio manager for unity", "packageName": "OpenAudio", "author": "omid3098" }, { "name": "Open Framework", "description": " A Lightweight framework for unity.", "packageName": "OpenFramework", "author": "omid3098" } ], "server": "https://github.com/" }یکم توی API خود GitHub سرچ کردم دیدم که نیازی به شماره ورژن نداریم و میتونیم آخرین تغییرات هر پکیج رو با داشتن اسم پکیج و نویسنده ش به دست بیاریم:"https://api.github.com/repos/" + package.author + "/" + package.packageName + "/zipball"پس تا اینجا به نسخهٔ زیپ شده از هر پکیجی میتونیم دسترسی پیدا کنیم. کافیه دانلودش کنیم و در جای مناسب Unzip کنیم. (میشه tarbal رو هم با همین روش گرفت)همهٔ چیزایی که برای داشتن یه Package manager نیاز داشتم رو دارم! پس فقط کافیه یه لیستی از پکیج‌ها درست کنم با یه ابزار توی خود یونیتی و بقیهٔ کارها رو بسپارم به توسعه‌دهنده های هر پکیج! هروقت توسعه‌دهنده نسخه جدیدی توی ریپازیتوری خودش منتشر کنه، این Package manager آخرین تغییرات رو میگیره و در اختیار کاربر قرار میده.و این شد که این ابزار رو نوشتم که فعلاً لیست چنتا پکیج‌ رو نمایش میده، میتونه توی اون لیست جستجو کنه، در محل دلخواه توی پروژهٔ یونیتی دانلود کنه و از این به بعد بتونیم بدون درد و خونریزی از آخرین نسخهٔ هر پکیج توی پروژه استفاده کنیم.اگه شما هم پکیجی برای یونیتی دارین که میخواین توی این Package manager قرار بگیره، کافیه لینک ریپازیتوری رو با در نظر داشتن این موارد بفرستین.دیگه چی؟طبیعتاً این ابزار در ابتدای راه قرار داره و میشه با API ای که گیت‌هاب در اختیارمون گذاشته، تاریخ آخرین انتشار، آخرین نسخهٔ منتشر شده (توی Release)، آخرین شماره Commit و خیلی چیزهای دیگه رو توی این Package manager وارد کرد، براش CLI نوشت، dependency ها رو وارد چرخه کرد و به مرور تکمیلش کنیم.و اینکه شما میتونین نه تنها برای یونیتی، که برای هر استفادهٔ دیگه ای با این قابلیت‌ها Package manager خودتون رو بنویسین.