PHP開発でComposerを使わないなんてありえない！Packagist公開編

皆さんこんにちは
[前回のエントリー](http://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94)を見ていただいた方、ありがとうございます

今日もcomposerを使わなかったプロジェクトをさわってしまった悲しみを、記事を書くことによって全力で吹き飛ばそうというはた迷惑な企画を進めていきます

# 広がりを見せるcomposer

## packagist

composerでインストールできるライブラリの殆どはpackagistから取得されます。
というか、普通はpackagistに問い合わせているのです。
https://packagist.org/

packagistというのは、PHPのライブラリを管理するサービスで、誰でもパッケージを作成してここで公開することができるというものです。
composerでライブラリをインストールするときは、このpackagistを使用するか、awesomeを漁ることになるでしょう

## composer.jsonの役割

composer.jsonはそのプロジェクトのパッケージを管理していると前回のエントリーで書きましたが。。。
実はcomposer.jsonにはプロジェクト名とかプロジェクトの説明とかを書き加えることができ、そのことから、composer.json自体がそのプロジェクトの定義を行っていると見ることができます。

そして、composerでインストールするパッケージがどのような依存性を持っているかは、このcomposer.jsonを参照することで、知ることができるのです。
composerは必要となるパッケージのcomposer.jsonの情報を収集し、どのパッケージのどのバージョンを落とすかを計画するのです。
![composer.jpg](https://qiita-image-store.s3.amazonaws.com/0/102182/d78ab76c-e89d-b1ef-9054-6f4af46eb755.jpeg)


## composerを使うとcomposerで使えるようになる

上述したように、composerはcomoser.jsonの情報を元にパッケージの依存性を解決していくため、composer.jsonのないパッケージのインストールは基本的には無理です。
しかし、逆に考えてみると、composerを使うと必ずcomposer.jsonが生成されるわけですから、composerを使用したプロジェクトは必然的にcomposerで管理可能なパッケージになり得るということです。

つまり、「ちゃちゃっとライブラリでも作るか」→「あれ？これ、結構出来よくね？」→「公開しちゃえ！」→「composerで簡単にインストールできるよ！」
というフローが簡単にできるということです。
packagistという仕組みを利用することで、このようなライブラリ公開を容易に行えるのですから、これはもうcomposerを使わないという選択肢がまるで思い浮かびません！

# 実践！Packagistへのパッケージ登録

というわけで、packagistへのパッケージ登録を実践してみましょう

## まずは事始め - init

```
composer init
```
適当に設定しましょう
今回は、以前にfluentdのロガーを作ったら、PSR-3に準拠していないとか怒られたので、こいつを対応させてしまいましょう
今回の作業は以下のリポジトリで行います
https://github.com/niisan-tokyo/fluent-psr-log

## パッケージを導入する

```
composer require psr/log
composer require fluent/logger
```

これで十分です

## コードを書いてみる

全部書いてるときりがないので、何書いているのか見たい場合はgithubをどうぞ
https://github.com/niisan-tokyo/fluent-psr-log

```php:src/logger.php
namespace NiisanTokyo\FluentPsrLogger;

use Psr\Log\LoggerInterface;
use Psr\Log\LoggerTrait;
use Fluent\Logger\FluentLogger;
use Psr\Log\LogLevel;
//=== 中略 ===//

    public function log($level, $message, $context = [])
    {
        if ($level !== LogLevel::INFO) {
            $context['message'] = $message;
        }

        $this->logger->post($level);

    }
}
```
適当にコード書いてみました
結果は実際のパッケージかリポジトリを見てもらうとして、ついでにオートロードの設定もいじります

```composer.json
+    "autoload": {
+        "psr-4": {
+            "NiisanTokyo\\FluentPsrLogger\\": "src/"
+        }
+    }
```
これ入れたらオートローダを更新しておきましょう

```
$ composer dump-autoload
```

## とりあえず挙動確認

適当にfluentd突っ込んだイメージを用意します

```Dockerfile
From niisan/phpdev

# install fluentd
RUN curl https://packages.treasuredata.com/GPG-KEY-td-agent | apt-key add - ;\
echo "deb http://packages.treasuredata.com/2/ubuntu/trusty/ trusty contrib" > /etc/apt/sources.list.d/treasure-data.list ;\
apt-get update ;\
apt-get install -y --force-yes td-agent

ADD fluent.conf /etc/td-agent/td-agent.conf
```

```fluent.conf
<source>
  type forward
</source>

<match *>
  type file
  path /var/log/td-agent/
</match>
```
こんな感じで適当にPHPイメージにfluentdを突っ込んでおき、テストしてみます
```
2016-05-02T00:14:06+00:00	notice	{"message":"テスト"}
2016-05-02T00:14:06+00:00	info	{"test":"asert","tag":"perfect"}
```
うまく行っているようです

## Packagistに公開する

早速Packagistに公開しましょう
Packagistにgithubでログインしたら、リポジトリとしてgithubの先ほどのリポジトリを公開しましょう
<img width="1060" alt="スクリーンショット 2016-05-02 9.20.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/102182/a98a3aee-1698-71eb-6e30-a71a71e7f3e8.png">
右上にsubmitと書かれた部分があるので、押して見ます

すると、こんなページが出てきますので、先ほどの作業リポジトリを入れてみます
<img width="1146" alt="スクリーンショット 2016-05-02 9.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/102182/a175b12d-d750-a2ec-6221-e076555b59b1.png">
checkを押すとリポジトリを検査します。
問題がないとsubmitボタンが出てきますので、押してしまえば終わりです

## パッケージをインストールしてみる

取りあえず動くようになったはずなので、別のディレクトリに行って、インストールしてみましょう

```
composer require niisan-tokyo/fluent-psr-logger:dev-master
```
なぜdev-masterなんていう変なタグを使用しているかというと、minimum-stability, つまり最低限動作保証されたバージョンを指定していないからです。
なんにせよ、これで無事自分の作ったパッケージをインストールすることができました
早速使ってみましょう

```php:test.php
<?php
require "vendor/autoload.php";
$logger = new NiisanTokyo\FluentPsrLogger\Logger();
$logger->debug("this is package log");
```
で、このコードを

```
$ php test.php
$ ls /var/log/td-agent
$ tail /var/log/td-agent/xxxx
2016-05-02T14:18:43+00:00	debug	{"message":"this is package log"}
```
こんな感じでログに出せることが確認できました

## おさらい

Packagistにパッケージを公開するまでの手順は以下のとおりです

1. `composer init`や`composer create-project`でプロジェクトを建てる
1. コードをgithubなどの公開リポジトリに上げる
1. packagistで公開リポジトリを指定してsubmitする
1. composerでそのパッケージをインストールすることができるようになっている

実質たったの3ステップで自分の作ったパッケージを世界中に公開できます
これで、OSS世界の住人に仲間入りです！
Githubアカウントを持っていない方はなりふり構わず取りに行きましょう
Packagistのアカウントを持っていない方は、とっととサインインしちゃいましょう。
お手軽なOSS公開の世界が待っていますぞ！

# まとめ

Packagistを使うことで、composerによるインストールパッケージの探索だけでなく、自分の作ったパッケージの公開まで出来てしまいます。
この圧倒的な敷居の低さにより、レベル高い感のあるOSS開発を、とても身近なものにしてくれるのです。
いやぁ、やはりcomposerは偉大ですわ！
これを使わないPHP開発なんて、ありえませんわな！！

# 参考

[前回のやつ](http://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94)
[packagist](https://packagist.org/)
[Composerがパッケージのstabilityを解決するしくみ](http://kohkimakimoto.hatenablog.com/entry/2014/04/04/102125)