ساخت نصب کننده (Installer) برای پروژه لاراول

13 خرداد 1398, خواندن در 3 دقیقه

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

وقتی شما روی یک پروژه لاراول کار می کنید یک سری تنظیمات اولیه وجود داره که باید برای هر پروژه ای انجام بشه.

  • اجازه دادن به پوشه های bootstrap/cache, storage, vendor
  • composer install / composer update
  • env.example to .env
  • تولید کلید
  • Migrations, Seeding
  • نصب npm

بجای اینکه از کاربر بخواهید این قدم ها رو انجام بده, یک نصب کننده بسازید که این کارها رو خودکار انجام میده. 

قدم اول - قرار دادن اجازه ها برای پوشه های مختلف

اجازه معمول برای پوشه ها باید 775 باشه. دستور این کار :

sudo chmod -R 775 storage/ bootstrap/cache/ vendor/

نکته : اگر مشکلی وجود داشت میتونید از 777 استفاده کنید (پیشنهاد نمی شود).

قدم دوم - نصب وابستگی های کامپوزر

کافیه دستور زیر رو اجرا کنید :

composer install

قدم سوم - راه اندازی env.

دستوری که برای اینکار لازمه بصورت زیر هست :

cp .env.example .env

خط زیر برای اینه که ما فایل env. رو از کامند آپدیت می کنیم :

sudo chmod 777 .env

قدم چهارم - راه اندازی دیتابیس, Migrations, Seeding

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

بیایید به کد زیر نگاهی بیاندازیم و سپس متوجه میشیم هر متد چه کاری انجام میده :


namespace App\Console\Commands;
 
use Illuminate\Console\Command;
use DB;
 
class InstallAppliction extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'application:install';
 
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'This will install the application & set up DB';
 
    /**
     * Create a new command instance.
     *
     * @return void|mixed
     */
    public function __construct()
    {
        parent::__construct();
    }
 
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->line("You can use Ctrl+C to exit the installer any time.\n");
        $this->createDatabase();
        $this->migrate();
        $this->seed();
        $this->setUpKey();
    }
 
    /** 
     * This method creates the database by taking inputs from the user. 
     * 
     * @return void 
    */
    private function createDatabase(){
        if($this->testDbConnection()){
            return;
        }
 
        $this->line("You need to choose a database type.");
 
        install_database:
 
        $connection = null;
        $host = null;
        $port = null;
        $database = null;
        $username = null;
        $password = null;
 
        $available_connections = array_keys(config('database.connections'));
        $connection = $this->choice('Choose a connection type', $available_connections);
 
        if($connection == "sqlite"){
            $path = database_path('database.sqlite');
            touch($path);
            $this->info('Database file created at ' . $path);
        } else{
            $defaultPort = $connection == "mysql" ? 3306 
                               : ($connection == "pgsql" ? 5432 : null);
 
            $host = $this->ask('Database host', 'localhost');
            $port = $this->ask('Database port', $defaultPort);
            $database = $this->ask('Database name');
            $username = $this->ask('Database username');
            $password = $this->secret('Database password');
        }
 
        $settings = compact('connection', 'host', 'port', 'database', 'username', 'password');
        $this->updateEnvironmentFile($settings);
 
        if(!$this->testDbConnection()){
            $this->error('Could not connect to database.');
            goto install_database;
        }
    }
 
    /** 
     * This method is to test the DB connection. 
     * 
     * @return boolean 
    */
    private function testDbConnection(){
        $this->line('Checking DB connection.');
 
        try{
            DB::connection(DB::getDefaultConnection())->reconnect();
        }catch(\Exception $e){
            return false;
        }
 
        $this->info('Database connection working.');
        return true;
    }
 
    /**
     * Updates the environment file with the given database settings.
     *
     * @param  string  $settings
     * @return void
     */
    private function updateEnvironmentFile($settings)
    {
        $env_path = base_path('.env');
        DB::purge(DB::getDefaultConnection());
 
        foreach($settings as $key => $value){
            $key = 'DB_' . strtoupper($key);
            $line = $value ? ($key . '=' . $value) : $key;
            putenv($line);
            file_put_contents($env_path, preg_replace(
                '/^' . $key . '.*/m',
                $line,
                file_get_contents($env_path)
            ));
        }
 
        config()->offsetSet("database", include(config_path('database.php')));
 
    }
 
    /** 
     * Migrate the Database. 
     * 
     * @return void 
    */
    private function migrate(){
        $this->line("\nStarting DB Migration...");
        $this->call('migrate');
    }
 
    /** 
     * Seeds the Database. 
     * 
     * @return void 
    */
    private function seed(){
        $this->line("\nStarting DB Seeding...");
        $this->call('db:seed');
    }
 
    /** 
     * Sets up the application key. 
     * 
     * @return void 
    */
    private function setUpKey(){
        $this->call('key:generate');
        $this->info("\nApplication installation completed!");
    }
}

handle : این متد نقطه شروع دستور هست. این متد یک خط پرینت میکنه و سپس سایر متدها رو برای نصب فراخوانی میکنه.

createDatabase : این متد مسئول ساخت دیتابیس هست. این اول اتصال دیتابیس رو چک میکنه, اگر موفق بود دیتابیس رو برمیگردونه. اگر اتصال دیتابیس مشکل داشت اطلاعات کاربری و پسورد و پورت و ... دیتابیس رو می پرسه. این متد از متدهای ask و secret توسط کنسول لاراول استفاده میکنه. همچنین شما میتونید "install_database" رو مشاهده کنید که یک label برای تعریف بخش نصب دیتابیس هست. بعد از دریافت ورودی از کاربر, ما سعی میکنیم دوباره به دیتابیس متصل بشیم و اگر موفق بود به متد handle برمیگردیم. 

testDbConnection : این متد اتصال پیشفرض دیتابیس رو چک میکنه.

updateEnvironmentFile : این متد یک آرایه کلید - مقدار میگیره و مقادیر رو برای تمام کلیدها در فایل env. جایگزین میکنه.

migrate : این متد شروع به migrate دیتابیس میکنه.

seed : این متد هم برای انجام مراحل seed هست.

setUpKey : این هم کلید محیطی تولید میکنه.

این فایل باید توسط اسکریپت shell فراخوانی بشه. برای اینکار کد زیر رو به اسکریپت اضافه کنید :

php artisan application:install

قدم پنجم - اجرای نصب NPM

ما نیاز داریم npm install رو به اسکریپت اضافه کنیم. کد اسکریپت shell شبیه زیر میشه :

#!/bin/sh

#Update the folder permissions
sudo chmod -R 775 storage/ bootstrap/cache/ vendor/

# Install Composer Dependency
composer install

# Copy .env.example to .env
cp .env.example .env

# Update permission for .env
# This line is here because we will update .env from command line
sudo chmod 777 .env

#Start the installation process
php artisan application:install

# Install node dependency
npm install

پس کد اسکریپت نصب ما آمادست. اون رو بعنوان installer.sh در مسیر اصلی پروژه ذخیره کنید. حالا هروقت کسی سورس کد پروژه رو دریافت کنه installer.sh رو داره و کافیه اون رو اجرا کنه تا پروژه آماده بشه.

برای اجرای اسکریپت از کد زیر استفاده میشه:

sudo chmod +x installer.sh
sudo ./installer.sh

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید