때때로 콘솔 프로그램을 개발하고 싶을 때가 있다. 기존에는 Go 로 하다가 그래도 조금 더 잘 알고 있는 라라벨로 콘솔 프로그램을 개발하기 수월하게 할 수는 없을까 싶어서 찾아낸 것이 바로 Laravel Zero 다. 물론 라라벨에서도 아티즌 콘솔 명령어를 작성하는 일은 가능하지만, 콘솔 어플리케이션을 위해 라라벨을 사용하는 일은 너무 오버 엔지니어링이다.
Laravel Zero 는 콘솔 어플리케이션을 위한 마이크로 프레임워크다. 라라벨의 공식 패키지는 아니지만 오픈소스이며 라라벨에서 아티즌 콘솔 명령어를 따로 떼어낸 듯한 느낌으로 사용할 수 있다. 따라서 기존에 라라벨을 사용하는 방법을 알고 있다면 사용해 볼만하다. 사용법도 아주 간단하며 서비스 컨테이너나 서비스 프로바이더, 파사드, 헬퍼 등 라라벨에서 제공하는 기능을 고스란히 가져다가 쓸 수 있다. 여기서는 간단하게 소개만 해볼까 한다.
설치
Laravel Zero 는 간단하게 컴포저로 설치할 수 있다.
$ composer create-project --prefer-dist laravel-zero/laravel-zero my-app
앱 이름 바꾸기
이후 php application app:rename
을 사용하여 앱 이름을 바꾸는 것이 가능하다. 프로젝트를 설치하면 기본으로 설정되는 어플리케이션 이름이 application
이다.
$ php application app:rename tistory-cli
이 작업을 거치고 나면 이제 php tistory-cli inspire
와 같이 사용하여 명령어를 실행할 수 있다.
$ php tistory-cli inspire
Laravel Zero Simplicity is the ultimate sophistication.
명령어 작성하기
새로운 명령어를 생성하고 싶다면 어떻게 해야하는가? 그럴 때는 php tistory-cli make:command
를 사용하여 생성할 수 있다. post:create
명령어를 생성해보자.
$ php tistory-cli make:command PostCreateCommand
그럼 app/Commands 에 다음과 같이 명령어를 작성할 수 있다. 명령어 시그니쳐를 작성하는 방법은 라라벨의 공식문서에서 아티즌 콘솔을 참고해보자.
namespace App\Commands;
use Illuminate\Console\Scheduling\Schedule;
use LaravelZero\Framework\Commands\Command;
class PostCreateCommand extends Command
{
/**
* The signature of the command.
*
* @var string
*/
protected $signature = 'post:create {title} {content} {--tags=*}';
/**
* The description of the command.
*
* @var string
*/
protected $description = 'Create a post';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
/**
* Define the command's schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
public function schedule(Schedule $schedule): void
{
// $schedule->command(static::class)->everyMinute();
}
}
PostCreateCommand::$signature
에 작성된 명령어 시그니쳐를 간단하게 살펴보면, 제목, 본문, 그리고 태그를 옵션으로 받을 수 있다. 예를 들어 다음과 같이 사용할 수 있다.
$ php tistory-cli post:create "Hello, world" "Hello, world" --tags=laravel --tags=php
이렇게 작성한 옵션과 명령어를 얻어오는 방법을 간단하게 이야기해보자면, 그냥 단순하게 Command::argument(), option()
으로 받아올 수 있다. 예를 들어 다음과 같이 커맨드로 입력된 명령어의 값을 고스란히 JSON 으로 바꿔주는 행동을 할 수 있다.
public function handle()
{
$title = $this->argument('title');
$content = $this->argument('content');
$tags = $this->option('tags');
$message = json_encode(
compact('title', 'content', 'tags')
);
$this->line($message);
}
$ php tistory-cli post:create "Hello, world" "Hello, world" --tags=laravel --tags=php
{"title":"Hello, world","content":"Hello, world","tags":["laravel","php"]}
또는 간단하게 $this->arguments(), options()
로 다 받아올 수도 있다.
public function handle()
{
$message = json_encode([
...$this->arguments(), ...$this->options()
]);
$this->line($message);
}
$ php tistory-cli post:create "Hello, world" "Hello, world" --tags=laravel --tags=php
{"command":"post:create","title":"Hello, world","content":"Hello, world","tags":["laravel","php"],"help":false,"quiet":false,"verbose":false,"version":false,"ansi":null,"no-interaction":false,"env":null}
마치며
단순하게도 Laravel Zero 의 내용은 이게 전부다. 그 밖에도 데이터베이스, 로거, 파일 시스템, 태스크 등 다양한 애드온을 제공하고 있으므로 필요하다면 사용하는 것도 가능하다. 특히 기존의 라라벨에서 제공하지 않는 기능들을 일부 제공하는데, 그 중에는 작업 태스킹, 유저 인터렉션 메뉴, 데스크탑 알림이 있으며 게다가 독립적인(Standalone) 어플리케이션으로 빌드하는 일도 가능하다.
Laravel HTTP Client 와 Laravel Dusk 를 사용한 브라우저 자동화도 가능하므로 어지간한 일은 대부분 처리할 수 있다. 라라벨을 할 줄 안다면 CLI 를 만들기 위해 괜히 새로운 프레임워크를 익히려 들지 말고 그냥 이걸 쓰는게 마음 편하다.