Laravel 로컬 패키지 개발
PHP 패키지를 개발할 때 composer에서 로컬 디렉토리를 리파지토리로 지정할 수 있습니다. 이 방법을 이용하면 개발 중에 패키지 변경이 생길 때마다 코드를 배포하지 않고도 로컬에서 테스트를 할 수 있습니다.
일단 composer로 위 설정을 완료하면 그 이후 작업은 laravel 패키지 개발 과정과 마찬가지입니다.
패키지 디렉토리
위 캡쳐화면은 일반적인 laravel 프로젝트의 디렉토리 구조와 거의 같습니다. 선택된 quiz 디렉토리는 로컬에서 패키지 개발을 하기위해 추가한 것입니다.
quiz 디렉토리에 composer.json
파일이 있습니다. 내용은 다음과 같습니다.
{
"name": "ninecells/quiz",
"license": "MIT",
"require": {
"php": ">=7.1.0",
"erusev/parsedown": "^1.7",
"symfony/yaml": "^5.0"
},
"autoload": {
"psr-4": {
"NineCells\\Quiz\\": "src/"
},
"files": [
"utils.php"
]
},
"extra": {
"laravel": {
"providers": [
"NineCells\\Quiz\\QuizServiceProvider"
]
}
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
Composer를 사용자라면 쉽게 내용을 파악할 수 있을 것입니다. 위 composer.json의 providers
에서 QuizServiceProvider
를 추가하고 있습니다. 해당 파일의 내용을 살펴봅시다.
<?php
namespace NineCells\Quiz;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
class QuizServiceProvider extends ServiceProvider
{
public function register()
{
}
public function boot()
{
Route::middleware('web')
->namespace(__NAMESPACE__ . '\Controllers')
->group(__DIR__ . '/../routes.php');
Route::prefix('api')
->middleware('api')
->namespace(__NAMESPACE__ . '\Controllers')
->group(__DIR__ . '/../api.php');
$this->publishes([
__DIR__ . '/../config.php' => config_path('notification.php'),
]);
$package_path = dirname(__DIR__);
$this->loadViewsFrom("$package_path/views", 'c9');
$this->loadMigrationsFrom(__DIR__ . '/../migrations');
}
}
이 서비스 프로바이더에서 routes 파일, view 디렉토리, migration 디렉토리 등을 설정하고 있습니다. 이렇게 로컬 패키지 디렉토리 안에서 laravel 앱의 MVC 디렉토리와 비슷한 구조를 만들었습니다.
이제 이 패키지를 사용하는 laravel 앱에 해당 디렉토리가 리파지토리임을 알리고 패키지를 추가해야 합니다.
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"repositories": [
{
"type": "path",
"url": "./quiz"
}
],
"require": {
"php": "^7.2.5",
"fideloper/proxy": "^4.2",
"fruitcake/laravel-cors": "^1.0",
"guzzlehttp/guzzle": "^6.3",
"laravel/framework": "^7.0",
"laravel/tinker": "^2.0",
"laravel/ui": "^2.0",
"ninecells/quiz": "dev-master"
},
"require-dev": {
"facade/ignition": "^2.0",
"fzaninotto/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"nunomaduro/collision": "^4.1",
"phpunit/phpunit": "^8.5"
},
repositories
와 require
의 "ninecells/quiz": "dev-master"
를 예제를 참고하여 추가합니다. composer require ninecells/quiz
명령을 실행하면
vendor
디렉토리에 로컬 디렉토리가 심볼릭 링크의 형태로 들어가있는 것을 확인할 수 있습니다.
Laravel 패키지 개발에 대한 부분은 위의 예제보다 더 많은 기능이 준비되어 있습니다. 패키지에서 여러 언어를 지원해야 하거나 artisan 커맨드를 추가해야 할 수도 있습니다. 다른 기능은 Laravel 문서 Package Development에서 더 자세한 설명을 찾을 수 있습니다.