Composerで自作ライブラリを試す


背景

Composerって普段何気なくphpのライブラリをインストールするだけに使っていたのだが、
ちょっと気になったので自作パッケージ作ってみたときのメモ

環境

  • Packgistは使わない
  • 自作パッケージはgithubで管理
  • php7.2.2
  • laravelフレームワークのソフトウェアで読んでみる
  • 上記ソフトウェアはdockerで動かしている

ライブラリ側

ついでに普段ChromePhpでコンソールにログを吐かせることが多く、
環境ごとに入れたりするのが面倒なので、そちらをcomposerで呼べるようにする。
(こんなことしなくてもChromePhp自体はすでにpackageになっているのだが、
自分で拡張も効くようにあえて作ってみることにする)

クラス

<?php
namespace Sleazoids;
use ChromePhp;
class C
{
    public static function log($message)
    {
        return ChromePhp::log($message);
    }
}

こんな感じで。
後々ログの扱い方によっては関数追加していくのも良い。

composer.json

これでchromePhpとの依存関係を書く。
後述するが、stabilityを解決しておく。

{
    "name": "SLEAZOIDS/chrome-logger-ex",
    "description": "chrome-logger-extension",
    "type": "library",
    "minimum-stability": "stable",
    "require": {
        "ccampbell/chromephp": "4.1.0"
    }
}

リポジトリに設置

上記のクラスとcomposer.jsonをgithubに置いてみた。
https://github.com/SLEAZOIDS/chrome-logger-ex
今回はPackagistには登録しないことにする

ライブラリを使う側

ライブラリを使いたい環境で、
compose.jsonに(もともとあった場合追記)してupdateする

{
    "autoload-dev": {
        "psr-4": {
            "Sleazoids\\": "vendor/SLEAZOIDS/chrome-logger-ex/src/ChromeLoggerEx"
        }
    },

    "repositories":[{
        "type": "vcs",
        "url": "https://github.com/SLEAZOIDS/chrome-logger-ex"
    }],

    "require-dev": {
        "SLEAZOIDS/chrome-logger-ex": "dev-master"
    }
}

一応ログ系ライブラリなのでdevに。

ライブラリのインストール

composer update
でインストールし、
composer dump-autoload
で自動的に読み込まれるようにする

ライブラリを使う

require_once 'vendor/autoload.php';

で、autoload.phpをrequireしておく

あとは、名前空間にならえば使える

$a = 'ここは' . 'どこだ?';
\Sleazoids\C::log($a);

落とし穴(勝手にはまったところ)

psr-4での定義名

autoloadする際のpsr-4で定義する名前と、
クラスの名前空間は一致させないと正しく読み込まれない。
(今回で言うと「Sleazoids」)

githubでライブラリを更新するとupdateでエラー

以下のようなエラーが出た時には

$composer update

[InvalidArgumentException]
  Could not find package SLEAZOIDS/chrome-logger-ex at any version for your minimum-stability (stable). Check the package spelling or your minimum-stability

ライブラリ側のcomposer.jsonで以下のようにstabilityの解決をしないといけない

"minimum-stability": "stable",

まだまだ

よくわからないこともあるので、引き続き気にかけておきます。
何気なく使っているサービスは一度自分で検証してみるのは勉強になります。