Laravel(라라벨)은 Artisan이라는 편리한 CLI 도구가 있는데
간혹 개발하다가 운영 환경에 배포할 때 모든 명령이 필요하지 않아서 운영 환경에선 필요한 명령만 남기고 빼고 싶다는 생각이 들었습니다.
그래서 Artisan의 command list를 내가 필요한 것만 혹은 운영에 필요한 명령만 남기고 빼는 방법을 알아보았습니다.
Artisan의 기본 명령들이 등록되는 부분은
config/app.php
의 Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class
입니다.
ConsoleSupportServiceProvider.php 의 내용을 보면
$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 = [];
}
그런 다음 MyConsoleSupportServiceProvider
를 config/app.php
의 providers에 ConsoleSupportServiceProvider
는 지우고 추가해줍니다.
'providers' => [
...
//Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
App\Providers\MyConsoleSupportServiceProvider::class,
...
]
이제 Artisan 을 실행시켜봅니다.
$ php 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
마치며..
실제로 Artisan 명령을 빼고 싶은 경우가 얼마나 될지는 모르겠지만 가능한지를 확인하고 싶었고 그것이 가능하다는 것을 알 수 있었습니다.
나중에 관련 작업이 있으면 이 글을 보고 참고해야겠습니다.
소스코드: https://github.com/wlgns5376/laravel6-artisan-customize