9Cells

Laravel 로컬 패키지 개발

PHP 패키지를 개발할 때 composer에서 로컬 디렉토리를 리파지토리로 지정할 수 있습니다. 이 방법을 이용하면 개발 중에 패키지 변경이 생길 때마다 코드를 배포하지 않고도 로컬에서 테스트를 할 수 있습니다.

일단 composer로 위 설정을 완료하면 그 이후 작업은 laravel 패키지 개발 과정과 마찬가지입니다.

패키지 디렉토리

file:laravel-quiz-package

위 캡쳐화면은 일반적인 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"
    },

repositoriesrequire"ninecells/quiz": "dev-master"를 예제를 참고하여 추가합니다. composer require ninecells/quiz 명령을 실행하면 vendor 디렉토리에 로컬 디렉토리가 심볼릭 링크의 형태로 들어가있는 것을 확인할 수 있습니다.

Laravel 패키지 개발에 대한 부분은 위의 예제보다 더 많은 기능이 준비되어 있습니다. 패키지에서 여러 언어를 지원해야 하거나 artisan 커맨드를 추가해야 할 수도 있습니다. 다른 기능은 Laravel 문서 Package Development에서 더 자세한 설명을 찾을 수 있습니다.