PackagistとComposerで自作パッケージを使う

自分で作ったPHPのパッケージ(ライブラリ)を Packagist に登録して、Composer から使えるようにしてみたのでメモ。

Composer でダウンロードするパッケージは、基本的には Packagist にあるものからダウンロードされる。
個人的によく使う自作ライブラリ等も Composer で依存関係を解消しつつ使いたいなあと思ってやってみた。

全体の流れ

  1. コードを書く
  2. (してなければ)GitHub にユーザー登録する
  3. (してなければ)Packagist にユーザー登録する
  4. GitHub にリポジトリを作る
  5. そのリポジトリと Packagist を連携させる
  6. 書いたコードを GitHubリポジトリ にプッシュ
  7. Packagist に公開(自動)
  8. Composer から使う

まあ普通なら 1 をコピペして済むんだけど Composer から使ってみたかったので。

コードを書くにあたって(composer.json の作成)

自作パッケージのルートに composer.json というファイルを作成して、Composer でどう扱ってもらうかを記述する必要がある。

簡単に作成するには、ルートディレクトリでターミナルやコマンドプロンプトを開き、以下のコマンドを打つ。(Composerインストール済みが前提)

php composer.phar init

composer.json を作成するための質問をいくつか訊かれるため、それに入力していくことで自動生成される。

# パッケージ名(「ベンダー(ユーザー)名/パッケージ名」の形式)
Package name (<vendor>/<name>) [kijtra/oreore-lib]: kijtra/oreore-lib
# パッケージの概要
Description []: オッス!オラ、オレオレライブラリ!
# 作成者(あなた)
Author [kijtra <kijtra@gmail.com>]:
# 依存パッケージの最低限の安定バージョン(「stable」が無難)
Minimum Stability []: stable
# パッケージの種類(なんでも良いようだけど「library」とかで)
Package Type []: library
# ライセンス(今回はまず自分しか使わないので無保証なMIT)
License []: MIT

Define your dependencies. # 「依存関係を決めてね」

# 依存するパッケージがありますか?
Would you like to define your dependencies (require) interactively [yes]?
# 検索する依存パッケージ名(例:monolog/monolog)
Search for a package: monolog/monolog
# 検索した依存パッケージで使用するバージョン
Enter the version constraint to require (or leave blank to use the latest version): @stable
# ほかに検索する場合(なければそのまま Enter)
Search for a package:
# 開発時に依存するパッケージがありますか?(以降は上記と同じ。なければ「no」)
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

{
    "name": "kijtra/oreore-lib",
    "description": "オッス!オラ、オレオレライブラリ!",
    "type": "library",
    "license": "MIT",
    "require": {
        "monolog/monolog": "@stable"
    },
    "authors": [
        {
            "name": "kijtra",
            "email": "kijtra@gmail.com"
        }
    ]
}
# 「上のようなファイルが作られるけどいいかな?」(そのまま Enter)
Do you confirm generation [yes]?

これで composer.json が生成されてるはず。
で、もしPHPのバージョン制限とかあるなら追記しておく。
また、「autoload」での振る舞いも記述しておくと良いので、最終的な composer.json ファイルは以下のようになる。

{
    "name": "kijtra/oreore-lib",
    "description": "オッス!オラ、オレオレライブラリ!",
    "type": "library",
    "license": "MIT",
    "require": {
        "monolog/monolog": "@stable"
    },
    "authors": [
        {
            "name": "kijtra",
            "email": "kijtra@gmail.com"
        }
    ],

    //--以下追記--

    "keywords": ["オレオレ", "自作"], //(任意)Packagistでの検索でタグ指定できる

    "require": {
        "php": ">=5.3.2" //PHP5.3.2以上推奨
    },

    "autoload": {
        "psr-4": { //(ファイル構成が)PSR-4形式で作りましたよ
            "Kijtra\\": "src" //ファイル群は「src」ディレクトリの中ですよ
        }
	},

    "include-path": ["src/"] //(開発時用)「src」ディレクトリ内からautoload
}

開発時には開発ディレクトリのルートで以下を実行しておき、Composer の基本ファイルをダウンロードする。

php composer.phar install

そうすると vendor ディレクトリが作成され、 vendor/autoload.php が使用できる。
上記 composer.json の最終行にある "include-path": ["src/"] は、この時に必要。

「PSR-4」というのはPHPでクラスファイルをオートロードする際のディレクトリやファイルの命名規則等のことで、ここでは説明しないので Googleで「PSR-4とは」 を。

GitHub と Packagist の連携

パッケージをGitHubに置く前に、Packagist との連携を設定しておく。

まずは事前に PackagistAPI Token を取得する。
Packagist のマイページに「Show API Token」というリンクがあるので、クリックすると API Token が表示される。
それをコピーしておく。

Packagist の API Token を取得

次に GitHub に行き、リポジトリを作ったら、そのリポジトリの Settings 画面(右メニュー)に行く。

左メニューの「Webhooks & Services」というページに行き、「Services」の「Add service」から「Packagist」を検索。
クリックで追加。

「Webhooks & Services」から「Packagist」を検索し追加

入力欄に以下のように入れ、「Add service」ボタンで追加。

User ・・・Packagist のユーザー名
Token ・・・Packagist の API Token
Domain ・・・空のままでOK
Active ・・・チェックする

「Webhooks & Services」から「Packagist」を検索し追加

これで GitHub にプッシュすれば自動的に Packagist に反映されるようになる。

バージョン管理

ここまででもう Composer から使える状態なんだけど、パッケージのバージョンをどうリリースするかわからなかったので少しとまどってしまった。
(デフォルトではバージョンなしで「dev-master」のみ)

なんてことはない。Git で push する前にタグとしてバージョンを記述するだけだった。
例えば以下のような感じ。

git add . # Addして
git commit -m "オッス!リリースすっぞ!" # Commitして
git tag -a 0.0.1 # ここでバージョン用タグ作成
git push origin master # Push

コミットの前後とかは関係なさそう?プッシュ前ならどこでもいい?みたいだけど、上記でできてる。


あとがき

これまでPHPのパッケージ群といえば PEAR だったけど、もう最近では Composer ばかりになってしまった。
PEAR はメンテナンスされていないものが多くてインストールも面倒で個人的にはあまり好きじゃなかったので、Composer はけっこう便利に使ってる。

自作のパッケージを登録しておいて、いつでも(依存関係を解消しつつ)使える状態にしておくのはとても便利だと思った。

だけど、Packagist での検索でひっかかってしまうので、あまりにプライベートなものとかはセキュリティ的に危ないまたは恥ずかしくて申し訳ない気持ちに。(GitHub もそうだけど)
検索にヒットしないように設定できたらいいかも。

ちなみに今回試しに作ったのは Yahoo JAPAN の YOLPのAPI を扱うもの。

Packagist: kijtra/yolp
GitHub: kijtra/yolp

おそらく放置の可能性が高いので composer.json の中身とかを見るぐらいでお願いしますw