[Laravel 6] Artisan command list customize

Hoone·2021년 6월 16일
0
post-thumbnail

Laravel(라라벨)은 Artisan이라는 편리한 CLI 도구가 있는데
간혹 개발하다가 운영 환경에 배포할 때 모든 명령이 필요하지 않아서 운영 환경에선 필요한 명령만 남기고 빼고 싶다는 생각이 들었습니다.

그래서 Artisan의 command list를 내가 필요한 것만 혹은 운영에 필요한 명령만 남기고 빼는 방법을 알아보았습니다.

Artisan의 기본 명령들이 등록되는 부분은
config/app.phpIlluminate\Foundation\Providers\ConsoleSupportServiceProvider::class 입니다.
config/app.php

ConsoleSupportServiceProvider.php 의 내용을 보면
ConsoleSupportServiceProvider

$providers 에는 또 다른 ServiceProvider 들이 있습니다.
이 중에서 ArisanServiceProvider 가 기본 명령들을 등록해주는 provider 입니다.
그리고 MigrationServiceProvider는 migrate 명령들을 등록해주는 provider 입니다.

그럼 우선 모든 Artisan 명령을 빼기 위해 ConsoleSupportServiceProvider를 override 하는 provider를 만듭니다.

$ php artisan make:provider MyConsoleSupportServiceProvider
Provider created successfully.

생성된 provider를 열어서 ServiceProvider 대신에 ConsoleSupportServiceProvider 를 넣고 register와 boot 코드는 삭제를 해줍니다.
그리고 $providers를 비워 놓습니다.

<?php

namespace App\Providers;

use Illuminate\Foundation\Providers\ConsoleSupportServiceProvider;

class MyConsoleSupportServiceProvider extends ConsoleSupportServiceProvider
{
	protected $providers = [];
}

그런 다음 MyConsoleSupportServiceProviderconfig/app.php의 providers에 ConsoleSupportServiceProvider는 지우고 추가해줍니다.

'providers' => [
    ...
    
    //Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
    App\Providers\MyConsoleSupportServiceProvider::class,

    ...
]

이제 Artisan 을 실행시켜봅니다.

$ php artisan list

아래처럼 일부를 제외하고 대부분의 명령이 빠졌습니다.
artisan list

그런데 개발 환경에서는 다 필요한 명령이고 운영 환경에서만 빼고 싶기 때문에 다시 provider를 수정합니다.

ConsoleSupportServiceProvider 에서 $providers에 있는 provider가 등록되는 부분은 AggregateServiceProvider의 register 메소드 입니다.

이 메소드를 override 해서 production에서만 명령을 빼도록 수정하겠습니다.
MyConsoleSupportServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Foundation\Providers\ConsoleSupportServiceProvider;

class MyConsoleSupportServiceProvider extends ConsoleSupportServiceProvider
{
    public function register()
    {
        if ($this->app->environment() == 'production') {
            $this->providers = [];
        }
        parent::register();
    }
}

그리고 bootstrap/cache/service.php 캐시 파일을 삭제해줍니다.
php artisan list 명령을 실행하면 다시 명령이 추가된 것을 확인할 수 있습니다.

.env 파일에서 APP_ENV=production 으로 수정해서 다시 명령을 실행하면 명령이 빠져있을 것 입니다.

이제 필요한 기본 명령들을 추가하겠습니다.
기본 명령은 ArisanServiceProvider에 있습니다. $commands 에 있는 명령들 중에서 필요한 명령만 사용하기 위해 override할 provider를 생성합니다.

$ php artisan make:provider MyArtisanCommandServiceProvider 
Provider created successfully.

생성한 MyArtisanCommandServiceProvider에 ArisanServiceProvider를 extend 하고 $commands 에 필요한 것만 추가합니다.

테스트로 몇 개만 추가해보았습니다.

MyArtisanCommandServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Foundation\Providers\ArtisanServiceProvider;

class MyArtisanCommandServiceProvider extends ArtisanServiceProvider
{
    /**
     * The commands to be registered.
     *
     * @var array
     */
    protected $commands = [
        'CacheClear' => 'command.cache.clear',
        'ConfigCache' => 'command.config.cache',
        'ConfigClear' => 'command.config.clear',
        'Down' => 'command.down',
        'Up' => 'command.up',
    ];

    /**
     * The commands to be registered.
     *
     * @var array
     */
    protected $devCommands = [];
}

그런 다음 MyConsoleSupportServiceProvider의 providers에 다른 provider와 함께 추가합니다.
MyConsoleSupportServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Database\MigrationServiceProvider;
use Illuminate\Foundation\Providers\ComposerServiceProvider;
use Illuminate\Foundation\Providers\ConsoleSupportServiceProvider;

class MyConsoleSupportServiceProvider extends ConsoleSupportServiceProvider
{
    public function register()
    {
        if ($this->app->environment() == 'production') {
            $this->providers = [
                MyArtisanCommandServiceProvider::class,
                MigrationServiceProvider::class,
                ComposerServiceProvider::class,
            ];
        }
        parent::register();
    }
}

마지막으로 명령을 실행하면 추가한 명령만 나오는것을 확인할 수 있습니다.

$ php artisan list

php artisan list

마치며..

실제로 Artisan 명령을 빼고 싶은 경우가 얼마나 될지는 모르겠지만 가능한지를 확인하고 싶었고 그것이 가능하다는 것을 알 수 있었습니다.
나중에 관련 작업이 있으면 이 글을 보고 참고해야겠습니다.

소스코드: https://github.com/wlgns5376/laravel6-artisan-customize

profile
도움이 되고픈 개발자

0개의 댓글