انتشار پکیج در Packagist

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

در این مقاله در رابطه با ایجاد یک پکیج در لاراول صحبت می‌کنیم و مرحله به مرحله آن را انجام می‌دهیم.

برای انتشار پکیج‌های PHP از Composer استفاده می‌کنیم، قبلا در مقاله‌ای در رابطه با نصب لاراول و composer صحبت کردم که می‌توانید آن را مطالعه کنید.

انتشار پکیج لاراول در packagist

وقتی می‌خواهیم پکیجی را به صورت عمومی منتشر کنیم از وب‌سایت Packagist استفاده می‌کنیم در این وب‌سایت ما میتوانیم تمام پکیج‌هایی که سایر کاربران برای PHP توسعه داده اند را جستجو و پیدا کنیم و در صورت لزوم آنها را نصب کنیم.

من ابتدا در مسیری که میخواهم پکیج را برای لاراول توسعه دهم یک لاراول نصب میکنم و پس از آن یک فولدر در روت اصلی به نام package ایجاد می‌کنم. پس از نصب و راه اندازی لاراول داخل فولدر package پکیج‌ یا پکیج‌هایی که میخواهم توسعه دهم را ایجاد میکنم برای اینکار ریپازیتوری جدید در گیت‌هاب ایجاد می‌کنم و آن را داخل فولدر پکیج clone میکنم.  برای مثال به صورت زیر اینکار را انجام می‌دهم.


git clone git@github.com:Mekaeil/LaravelUserManagement.git

پس از clone کردن آن دستور زیر را در مسیر ریپازیتوری در محیط ترمینال اجرا میکنم.


composer init

پس از اجرای دستور زیر با تصویر زیر مواجه می‌شوید

که در نهایت پس از پاسخ به سوالات مراحل تایید آخر را با بازبینی اطلاعات وارد شده از شما می‌گیرد و فایل composer.json ایجاد می‌شود.

در صورتیکه پکیج شما آماده انتشار است و میخواهید به صورت عمومی منتشر کنید در وبسایت packagist ثبت نام کنید و آدرس مربوط به ریپازیتوری در گیت‌هاب را وارد کنید تا بر اساس ورژن‌هایی که منتشر می‌کنید سایت packagist بروزرسانی و انتشار پکیج را انجام دهد.

پیشنهاد میکنم برای نسخه‌های release پکیج از ساختار GitFlow برای مدیریت انتشارهای پکیج استفاده کنید.

ساختار‌ فایلهایی که برای پکیج ایجاد می‌کنیم به صورت زیر است:

هنگام توسعه پکیج با توجه به ساختاری که پکیج دارد و لازم است در autoload پروژه قرار بگیرد فایل composer.json را ویرایش میکنم و بخش‌های requires, autoload, extra را به آن اضافه می‌کنم.


    "require": {
        "php": ">=7.0",
        "laravel/framework": "5.*"
    },
    "autoload": {
        "psr-4": {
            "Mekaeil\\LaravelNotification\\": "src/"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "Mekaeil\\LaravelNotification\\LaravelNotificationProvider"
            ]
        }
    }

انتشار پکیج‌های PHP یا لاراول صورت Private

همانطور که در ابتدای مقاله اشاره کردم برای پروژه‌های شرکت که با آنها همکاری میکردیم نیاز بود که پکیج ایجاد شود ولی برخی از پکیج‌ها کاملا خصوصی بودند و امکان انتشار آن در وبسایت packagist وجود نداشت، راهکار آن مطالعه داکیومنت composer و ایجاد پکیج در گیت‌لب اختصاصی شرکت بود.

فایل composer.json را به صورت زیر مطابق توضیحات فوق خواهیم داشت:


{
    "name": "CompanyName/core",
    "description": "Description of Comapny's project",
    "homepage": "http://mekaeil.me",
    "authors": [
        {
            "name": "Mekaeil Andisheh",
            "email": "maikel1370@gmail.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "php": ">=7.0",
        "laravel/lumen-framework": "5.8.*"
    },
    "autoload": {
        "psr-4": {
            "Faraz\\Core\\": "src/"
        },
        "files": [
            "src/Helper/helpers.php"
        ]
    },
    "extra": {
        "laravel": {
            "providers": [
                "Company\\Core\\Src\\HelperServiceProvider"
            ]
        }
    }
}

حالا در پروژه‌ای که میخواهیم از پکیج استفاده کنیم به صورت زیر در فایل composer.json آن پروژه موردنظر آدرس ریپازیتوری پکیج را که در گیت‌لب اختصاصی است قرار می‌دهیم.

توجه داشته باشید اگر شما عضو پروژه نباشید یعنی دسترسی نداشته باشید نمیتوانید پکیج را استفاده کنید برای اینکه بتوانید پکیج را در تمام پروژه‌ها استفاده کنید باید عضو تیم پکیج باشید در غیر اینصورت با خطا مواجه می‌شود.

برای اینکه آدرس ریپازیتوری را به فایل composer.json اضافه کنیم ابتدا باید با مفهوم VCS در composer آشنا باشیم:

VCS stands for version control system. This includes versioning systems like git, svn, fossil or hg. Composer has a repository type for installing packages from these systems

به صورت زیر آدرس ریپازیتوری را اضافه می‌کنیم:


 "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/igorw/monolog"
        }
    ],

برای مطالعه بیشتر و جزئیات آن ( Loading a package from a VCS repository ) را بخوانید.

و یا اینکه کد زیر را به ریپازیتوری خود اضافه کنید، و در نهایت آن را require کنید.


 "repositories": [
        {
            "type": "git",
            "url": "git@github.com:Mekaeil/LaravelUserManagement.git"
        }
    ],

و بعد دستور زیر را اجرا کنید تا به لیست requireهای پروژه شما اضافه شود.


 composer require Mekaeil/Package-name

نکته: دقت کنید اگر از یک ریپازیتوری دیگر Fork گرفتید و میخواهید به پروژه به این صورت اضافه کنید باید حتما نام فولدر را تغییر دهید وگرنه با خطا مواجه می‌شوید.

برای راحتی کار میتوانید با استفاده از دستورات زیر نیز اقدامات فوق را انجام دهید:


composer config repositories.repo-name vcs https://git-url/your-package.git
composer require company/package:dev-branch-name

 

نحوه ایجاد مسیردهی فایل‌ها در پکیج

ما توانستیم پکیجی را ایجاد و آن را منتشر کنیم، موضوعی که الان مطرح می‌شود این است که چگونه route, view, controller , … را داخل پکیج ایجاد کنیم و کدهای ما از این پکیج فراخوانی را انجام دهند و از مسیر پیشفرض لاراول فراخوانی صورت نگیرد؟!

یک فایل برای Provider پکیج درنظر خواهیم گرفت که حاوی متدهای boot و register است، همانطور که در کانفیگ composer هم مشاهده کردید مسیر فایل Provider را در بخش extra در composer قرار دادیم.

در فایل Provider پکیج در داخل متد boot مسیر فراخوانی بخش‌های مختلف پکیج را مشخص می‌کنیم.

 $this->loadRoutesFrom(__DIR__ . '/Routes/route.notification.php');

//// SET VIEW'S ROUTE
$this->loadViewsFrom(__DIR__ . '/Views', 'LaravelNotification');

//// SET MIGRATIONS'S ROUTE
$this->loadMigrationsFrom(__DIR__ . '/Database/migrations');

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

php artisan vendor:publish

برای اینکار به صورت زیر اقدام می‌کنیم:

 $this->publishes([
  __DIR__ . '/Config/laravel-notification.php' => config_path('laravel-notification.php'),
 ]);

نکته: هنگامی که پکیج را توسعه می‌دهیم کلاس پروایدر را در فایل config/app.php اضافه میکنیم ولی وقتی میخواهیم فایل‌ها را publish کنیم با خطا مواجه می‌شویم به این خاطر که اصلا پروایدر ما را شناسایی نمیکند. ما باید در فایل composer.json مسیر پروایدر پکیج را قرار دهیم:

    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/",
            "Mekaeil\\LaravelNotification\\": "package/LaravelNotification/src/"
        }
    },

برای مطالعه بیشتر داکیومنت لاراول را در این رابطه مطالعه کنید.

نحوه بروزرسانی پکیج‌ها در Packagist

اگر شما پروژه خود را با استفاده از استانداردهای گیت‌ پیاده سازی کرده باشید و برای آن ورژن بندی در نظر گرفته باشید نیازی نیست کار خاصی انجام دهید، بعد از هر Release و ورژن تگ جدیدی که برای پکیج ایجاد می‌کنید کافی است در پروفایل خود در سایت Packagist گزینه بروزرسانی پکیج را بزنید تا تمام آپدیت‌ها از گیت‌هاب بر روی packagist قرار خواهد گرفت.

دقت کنید که بروزرسانی پکیج با استفاده از ورژن‌تگ‌هایی است که برای پکیج خود وارد می‌کنید.

Comments