Laravelパッケージを作ろう！その壱

複数プロジェクトに跨る様な、コアライブラリを作りたくなりました。
パッケージ化すれば良いらしいので、備忘録として纏めて行こうと思います。

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# 開発環境
* PHP（PHP-FPM） 8.x
* Composer 2.x
* Laravel 8.x

# やりたい事
* 複数プロジェクトで共通のコアライブラリを作りたい
* composer require 〜で導入可能にしたい
* 社内で使うので外部公開しない

# 環境構築
まずはLaravel環境を構築する。
[Docker ComposeでLaravel開発環境を構築その陸#使い方](https://qiita.com/_bobtabo_/items/ca984fb5b3e8109830ef#%E4%BD%BF%E3%81%84%E6%96%B9)

# パッケージ作成

パッケージ構成は、こんな感じ。

```
[laravel] ← Laravelプロジェクト
 |-app
 |-packages ← 作成
   |-bobtabo ← パッケージルート
     |-library ← ここで composer init する
       |-src
         |-...
```

まずは、Laravelプロジェクト内にpackagesディレクトリを作成し、必要なものは配下に作成する

packages/bobtabo/libraryで、composer init を実行して、質問に回答して行く。

```terminal
Package name (<vendor>/<name>) [root/core]: bobtabo/library
Description []: Bobtabo Core Library
Author [, n to skip]: n
Minimum Stability []: 
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: php
Enter the version constraint to require (or leave blank to use the latest version): ^8.0
Search for a package: laravel/framework
Enter the version constraint to require (or leave blank to use the latest version): ^8.12
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: barryvdh/laravel-ide-helper
Enter the version constraint to require (or leave blank to use the latest version): ^2.9
Search for a package: squizlabs/php_codesniffer
Enter the version constraint to require (or leave blank to use the latest version): ^3.5
Search for a package: 

〜 中略 〜

Do you confirm generation [yes]? 
Would you like to install dependencies now [yes]? 
```

packages/bobtabo/library に、composer.json が作成されます。

```json:composer.json
{
    "name": "bobtabo/library",
    "description": "Bobtabo Core Library",
    "type": "library",
    "require": {
        "php": "^8.0",
        "laravel/framework": "^8.12"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.9",
        "squizlabs/php_codesniffer": "^3.5"
    },
    "license": "MIT"
}
```

他、必要なのあれば、編集します。

※参考
[Laravel でいつも最初から仕込むようなファイルたちはパッケージにしてしまおう](https://qiita.com/moobay9/items/c1fa6455ce29c9d51e99)
[【Laravel】パッケージ開発の第一歩 〜helloページを出力する〜](https://qiita.com/nasteng/items/350fb46d3f08479a7bcf)
[Laravel Package Development#Package Skeleton](https://laravelpackage.com/02-development-environment.html#package-skeleton)
[社内で横断的に使えるPHPライブラリを書こう！](https://sota1235.hatenablog.com/entry/2016/12/03/164223)
[自作Composerのパッケージの基本的な構成](https://qiita.com/busyoumono99/items/5c328e48ea3b5469ac58)

# Gitリポジトリにプッシュする

1. 空のリポジトリを用意します。

1. 作成したリポジトリに紐付けます。

```terminal
$ cd ~/laravel/packages/bobtabo/library
$ git init
$ git remote add origin https://github.com/bobtabo/laravel-package.git
```

あとは、コマンドまたはIDEでプッシュすれば良いです。

※参考
[【git】既存のフォルダをgit管理にしてリモートリポジトリと紐づける](https://www.sukerou.com/2019/12/git-tipsgit.html#toc_headline_1)

# パッケージを導入する

リポジトリを追加します。

```terminal
$ cd ~/laravel
$ composer config repositories.bobtabo/library vcs https://github.com/bobtabo/laravel-package
```

composer.json に追加されます。

```json:~/laravel/composer.json
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    ・・・
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        ・・・
    },
    "repositories": {
        "bobtabo/library": {
            "type": "vcs",
            "url": "https://github.com/bobtabo/laravel-package"
        }
    }
}
```

パッケージをインストールします。

```terminal
$ composer require bobtabo/library
Using version dev-master for bobtabo/library
./composer.json has been updated
Running composer update bobtabo/library
・・・
Package manifest generated successfully.
```

vendorに追加されてる！！
![スクリーンショット 2021-11-05 2.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/336974a2-3002-ba5e-0ece-6b90ee52dcff.png)

※参考
[composerでGitHubのリポジトリからパッケージ追加する方法](https://scrapbox.io/namaozi/composer%E3%81%A7GitHub%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)