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` が出て来るので注意。 

まず初期化

```shell-session
composer init
```

作成された`composer.json`

```json:composer.json
{
    "name": "username/hoge",
    "description": "Hoge",
    "authors": [
        {
            "name": "username",
            "email": "username@example.com"
        }
    ],
    "require": {}
}
```
これに必要情報を追加していく。

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


### 依存ファイル
動作に必要なパッケージやphpバージョンを指定する

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

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

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

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

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

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

```shell-session
php artisan make:provider HogeServiceProvider
# app/Providers/HogeServiceProvider.php が生成される
```

```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()
    {
        //
    }
}

```


完成品

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

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

```json:/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` にリンクを貼ってくれる。

```shell-session
$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が動作する度にコンソールに動作確認用のデバッグメッセージが出るようになるはず。

```shell-session
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のローカルパス参照を削除しても可能。