皆さんこんにちは
前回のエントリーを見ていただいた方、ありがとうございます
今日も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を使うと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
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);
}
}
適当にコード書いてみました
結果は実際のパッケージかリポジトリを見てもらうとして、ついでにオートロードの設定もいじります
+ "autoload": {
+ "psr-4": {
+ "NiisanTokyo\\FluentPsrLogger\\": "src/"
+ }
+ }
これ入れたらオートローダを更新しておきましょう
$ composer dump-autoload
とりあえず挙動確認
適当にfluentd突っ込んだイメージを用意します
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
<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の先ほどのリポジトリを公開しましょう
右上にsubmitと書かれた部分があるので、押して見ます
すると、こんなページが出てきますので、先ほどの作業リポジトリを入れてみます
checkを押すとリポジトリを検査します。
問題がないとsubmitボタンが出てきますので、押してしまえば終わりです
パッケージをインストールしてみる
取りあえず動くようになったはずなので、別のディレクトリに行って、インストールしてみましょう
composer require niisan-tokyo/fluent-psr-logger:dev-master
なぜdev-masterなんていう変なタグを使用しているかというと、minimum-stability, つまり最低限動作保証されたバージョンを指定していないからです。
なんにせよ、これで無事自分の作ったパッケージをインストールすることができました
早速使ってみましょう
<?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にパッケージを公開するまでの手順は以下のとおりです
-
composer init
やcomposer create-project
でプロジェクトを建てる - コードをgithubなどの公開リポジトリに上げる
- packagistで公開リポジトリを指定してsubmitする
- composerでそのパッケージをインストールすることができるようになっている
実質たったの3ステップで自分の作ったパッケージを世界中に公開できます
これで、OSS世界の住人に仲間入りです!
Githubアカウントを持っていない方はなりふり構わず取りに行きましょう
Packagistのアカウントを持っていない方は、とっととサインインしちゃいましょう。
お手軽なOSS公開の世界が待っていますぞ!
まとめ
Packagistを使うことで、composerによるインストールパッケージの探索だけでなく、自分の作ったパッケージの公開まで出来てしまいます。
この圧倒的な敷居の低さにより、レベル高い感のあるOSS開発を、とても身近なものにしてくれるのです。
いやぁ、やはりcomposerは偉大ですわ!
これを使わないPHP開発なんて、ありえませんわな!!