composerパッケージ開発の流れ(Laravel用)


下記を参考にパッケージ作成環境構築を試した時のメモ。
https://medium.com/laravelapps/laravel-package-development-step-by-step-guide-743d9e5e076e

大まかな流れ

  • Laravelをセットアップする(いつもの)
  • パッケージ開発環境を作る
  • パッケージ開発をする
  • composer install 動作確認
  • packagist登録

Laravelをセットアップする(いつもの)

ベースにするLaravelをインストールする。
shell-session
laravel new core

パッケージ開発環境を作る

パッケージは通常 vendor ディレクトリ内にインストールされる。
まだ公開していないパッケージを作るので適当なディレクトリを作成し、その中で開発をしていく。
今回は /package/username/hoge にパッケージを作っていく
上記ディレクトリに移動し、composer.json を準備する
この先作成パッケージの composer.json とLaravel動作環境の /composer.json が出て来るので注意。

まず初期化

composer init

作成されたcomposer.json

composer.json
{
    "name": "username/hoge",
    "description": "Hoge",
    "authors": [
        {
            "name": "username",
            "email": "[email protected]"
        }
    ],
    "require": {}
}

これに必要情報を追加していく。

  • 依存ファイル
  • 名前空間とオートロード
  • Laravel用のサービスプロバイダ、ファサード

依存ファイル

動作に必要なパッケージやphpバージョンを指定する

    "require": {
        "php": "^7.0",
        "laravel/framework": "5.6.*",
    },

名前空間とオートロード

パッケージに割り当てる名前空間とファイルパスを指定する

    "autoload": {
        "psr-4": {
            "Username\\Hoge\\": "src/"
        }
    },

Laravel用のサービスプロバイダ、ファサード

Laravelのアプリケーション起動時に自動的に読み込まれるサービスプロバイダやファサードを指定する。

    "extra": {
        "laravel": {
            "providers": [
                "Username\\Hoge\\HogeServiceProvider"
            ]
        }
    }

今回はサービスプロバイダのみ使う。
サービスプロバイダはartisanコマンドで作成したものを移動、名前空間を変更して使う。
動作確認も兼ねてbootメソッドにdumpメッセージを入れておく。

php artisan make:provider HogeServiceProvider
# app/Providers/HogeServiceProvider.php が生成される
packages/username/hoge/src/HogeServiceProvider.php
<?php

namespace Username\Hoge;    // 名前空間を修正

use Illuminate\Support\ServiceProvider;

class HogeServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // 動作確認用メッセージ
        dump('Hello Laravel!');
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

完成品

composer.json
{
    "name": "username/hoge",
    "description": "hoge",
    "authors": [
        {
            "name": "username",
            "email": "[email protected]"
        }
    ],
    "require": {
        "php": "^7.0",
        "laravel/framework": "5.6.*"
    },
    "autoload": {
        "psr-4": {
            "Username\\Hoge\\": "src/"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "Username\\Hoge\\HogeServiceProvider"
            ]
        }
    }
}

あとはLaravel実行時にこのディレクトリがロードされるようにすればよい。
repositories にパッケージディレクトリを指定すると、パッケージインストール時に

/composer.json
    "repositories": [
        {
            "type": "path",
            "url": "packages/username/hoge",
            "symlink": true
        }
    ],
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "^1.0",
        "username/hoge": "dev-master"
    },

これでcomposer install (またはupdate)を実行すれば、 packages/username/hoge とシンボリックリンク(winならジャンクション)で vendor/username/hoge にリンクを貼ってくれる。

$composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing username/hoge (dev-master): Junctioning from packages/username/hoge

Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
"Hello Laravel!"
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nunomaduro/collision
Discovered Package: username/hoge
Package manifest generated successfully.

インストールが完了したらLaravelが動作する度にコンソールに動作確認用のデバッグメッセージが出るようになるはず。

php artisan
"Hello Laravel!"
Laravel Framework 5.6.17

Usage:
  command [options] [arguments]
  ...

パッケージ開発をする

省略

packagist登録

作成したパッケージをgithubなどに上げてから登録。
審査などもないようですぐに反映される。
https://packagist.org/

composer install 動作確認

動作確認用のLaravelを別途用意しておくとよい。
composer require username/hoge でpackagistから導入できるはず
開発用Laravelのcomposer.json内のrepositoriesのローカルパス参照を削除しても可能。