BEAR.Sundayのモジュールを実装・CI・公開する

# TL;DR

https://github.com/piotzkhider/Ray.FirebaseModule


# 記事のゴール

FirebaseをBEAR.Sundayで利用するためのモジュールを実装・公開する

## 既存のパッケージがあった…

https://github.com/ray-di/Ray.FirebaseModule

内容としてはまさにこれが欲しかったんだけど、3年前からメンテされていないようで使われているFirebaseのライブラリも現在主流のものとは異なっている様子。

こういうときどうしたらいいんだろう…
依存しているライブラリまでガッツリ変えちゃうようなPRを送る？
別ライブラリとして実装する？

とりあえず今回はさくっとcomposerでインストールして使いたかったので別ライブラリとして実装する。

### 追記

既存のライブラリをForkしてガッツリ内容を変えたPRを提出して

* マージされるまではcomposer.jsonのrepositoryにForkして実装したGitHubを使う
* リジェクトされたら別ライブラリとしてpackagistにsubmitする
* マージされたら`composer require`

でよかったのかも？

参考：
[packagistを使わないcomposerのgitリポジトリの作成](https://qiita.com/sansaisoba/items/963b5182749929bc609c)
https://getcomposer.org/doc/05-repositories.md#vcs

# 実装

https://github.com/koriym/Koriym.PhpSkeleton

上記のスケルトンを利用してプロジェクトを作成する
CIやら静的（動的）解析ツールやらの設定が色々同梱されているので最低限のことは全部やってくれる。
[PSR-12](https://www.php-fig.org/psr/psr-12/)とは設定がずれている部分があったので、気になる人は下記を参考にして下さい。

```diff:.php_cs.dist
-'return_type_declaration' => ['space_before' => 'one'],
+'return_type_declaration' => ['space_before' => 'none'],
```

## テスト

```
$ composer test  // phpunit
$ composer tests // php-cs-fixer & phpcs & phpmd & phpstan & phpunit
```

どちらもエラーが出なくなったらGitHubに`commit` & `push`

# README.mdの作成

https://github.com/ray-di/Ray.DbalModule/blob/1.x/README.md

上記を参考にREADMEを作る

## バッジを設定する

こういうやつ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/04772e5d-1f05-a377-e970-80f69ebd2963.png)

参考：
https://qiita.com/dtan4/items/13b0ea9edf5b99926446

### Travis CI

設定ファイル（.travis.yml）がスケルトンに入っているのでCIとしての設定はほとんど必要なし。
ただし今回はNightlyバージョンのPHPは必要ないので設定から削る

```diff:.travis.yml
 php:
 - 7.1
 - 7.2
 - 7.3
- - nightly

 ...

 jobs:
 ...
   allow_failures:
-   - php: nightly

```

画像の赤枠部分をクリックすることでバッジのコードを取得できる。
![スクリーンショット 2019-08-22 12.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/537e9e7c-cc00-bd09-457a-b31bf200e449.png)

このままだと`Lowest dependencies`にエラーが出ているようなので修正が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/114c4190-de18-0e50-2e44-e272178d161d.png)

#### Lowest dependencies？

> 通常与えられた条件の最新のバージョンがインストールされます。テストは最新の依存だけをテストすることになり。^や~で指定した最低のバージョンのテストは行われません。
>
>これが問題になるのは、他のパッケージが特定のパッケージの低いバージョンのものに依存していて、また他のパッケージではその高いバージョンのみにある機能を使用している場合です。依存解決は低いバージョンで行われ、最新バージョンに依存したパッケージはエラーを引き起こしたりBugの元になったりします。

参考：
[Composerで低いバージョンの依存テスト](https://qiita.com/koriym/items/86ed556538759432cba1)

#### エラーが出ないよう修正する

```
> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

EEEEE                                                               5 / 5 (100%)

Time: 43 ms, Memory: 4.00MB

There were 5 errors:

1) Piotzkhider\FirebaseModule\FirebaseModuleTest::testModule
Error: Class 'PhpParser\ParserFactory' not found

/PhpStormProjects/Ray.FirebaseModule/vendor/ray/aop/src/ParserFactory.php:13
/PhpStormProjects/Ray.FirebaseModule/vendor/ray/aop/src/Compiler.php:35
/PhpStormProjects/Ray.FirebaseModule/vendor/ray/di/src/Injector.php:32
...
```

phpstan-shimに存在している[この問題](https://github.com/phpstan/phpstan-shim/issues/29)のよう。
issueによると`bootstrap.php`でこの問題は解決しているようなので、`bootstrap.php`が存在するバージョンを最低バージョンに指定する。

参考：
http://blog.a-way-out.net/blog/2015/06/19/composer-version-tilde-and-caret/

```diff:composer.json
    "require-dev": {
        "phpunit/phpunit": "^7.5",
        "squizlabs/php_codesniffer": "^3.2",
        "friendsofphp/php-cs-fixer": "^2.12",
        "phpmd/phpmd": "^2.6",
-        "phpstan/phpstan-shim": "^0.10"
+        "phpstan/phpstan-shim": "^0.10.2"
    },
```

```
> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

EEEEE                                                               5 / 5 (100%)

Time: 109 ms, Memory: 12.00MB

There were 5 errors:

1) Piotzkhider\FirebaseModule\FirebaseModuleTest::testModule
Error: Class 'Google\Cloud\Core\ServiceBuilder' not found

/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:370
/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:344
/Users/ysato/PhpStormProjects/Ray.FirebaseModule/vendor/kreait/firebase-php/src/Firebase/Factory.php:165
...
```

1つ目のエラーは解消されたが、また別のエラーが発生しているよう。
こちらも前回のエラーと同様に、低いバージョンでは必要となるファイルが存在していないことが問題になっているので、存在するバージョンを指定する。

```diff:composer.json
    "require": {
        "php": ">=7.1.0",
        "ray/di": "^2.9",
        "kreait/firebase-php": "^4.30",
+        "google/cloud-core": "^1.19"
    },
```

```
> vendor/bin/phpunit
PHPUnit 7.5.0 by Sebastian Bergmann and contributors.

.....                                                               5 / 5 (100%)

Time: 123 ms, Memory: 16.00MB
```

無事ローカルでのエラーも消え、Travis CIでのエラーがなくなりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/4d18cfd0-afbd-0e47-3f5f-54096ef737f5.png)

### scrutinizer

こちらも設定ファイル（.scrutinizer.yml）がスケルトンに入っているのでCIとしての設定は特に必要なし
画像の赤枠内の各バッジをクリックすることでバッジのコードを取得できる。
![スクリーンショット 2019-08-22 12.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/280cfa73-1cb3-08bb-c64d-e630019a5fb4.png)

#### coverageがNot enabled

スケルトンの設定でTravis CIで出力されたカバレッジがscrutinizerに送られているが、設定がデグレしているようなので修正。

```diff:.travis.yml
    script:
-    - ./vendor/bin/phpunit -v --coverage-clover ./build/logs/clover.xml
+    - ./vendor/bin/phpunit -v --coverage-clover=coverage.clover
    after_script:
    - wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover;
```

ついでに[PR](https://github.com/koriym/Koriym.PhpSkeleton/pull/46)も出しておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/79154276-592d-afb2-284f-ca8a8e93ace6.png)

全て正常に表示されました！

# Packagistで公開

Submit Packageしておしまい！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47107/8d0dc5bd-045c-1a31-3443-164277e23840.png)


と思ったのですが、タグをつけてあげないと`dev-master`になってしまうため、`minimum-stability:dev`でないとインストールすることができなくなるようです。
（ブランチ名でもバージョン制御をしてくれるようですが、そちらもdev扱いになってしまいます）
1.0.0としてタグを登録します。

```
$ git tag 1.0.0 [revision-number]
$ git push origin 1.0.0
```

参考：
https://getcomposer.org/doc/articles/versions.md#tags
[git tagの使い方まとめ](https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08)