Saba note

醜悪コード Ugly hacks ITものづくり

Packagist & Githubで開発をするPHPライブラリ

前提条件

  • composerをそこそこ使える人。
  • gitをそこそこ使える人。
  • Githubのアカウントを作ってpush出来るように鍵の設定などを行っておく。
  • Travis CIのアカウントを作っておく。 (Githubのアカウントでログイン。)
  • Packagistのアカウントを作っておく。 (Githubのアカウントでログイン。)

Githubで適当なリポジトリを作成する

Pachagistに登録するリポジトリとして適当なリポジトリを作成します。
ここでは

osamuya/testPackage
https://github.com/osamuya/testPackage.git

として作成しておきます。
testPackage/としてプロジェクトを作成する感じでよいかと思います。

Packageとして開発するディレクトリの作成

Githubのリポジトリと連動してtestPackage/ディレクトリを作成しておきます。(ここで例のgit initとかリモートリポジトリの設定とか諸々やっておきます。)

mkdir /SOMEWHERE/testPackage
cd /SOMEWHERE/testPackage
git init
echo "# testPackage" >> README.md
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:osamuya/testPackage

こんな感じでいつものようにGithubでソース管理できるようにしておきます。

Composerの準備

この開発ディレクトリ内にコンポーザーを準備します。

cd PROJECTDIR
curl -s http://getcomposer.org/installer | php

準備ができたらcomposer.jsonを作成します。
composer initという対話型のコマンドがあるんですが、面倒なので私は基本使いません。viで開いてババっと書いた方がはやいです。
何をどう書くかはパッケージの内容に依存しますがミニマムでこんな感じになります。

{
    "name": "osamuya/test-package",
    "version": "0.1",
    "description": "testPackage",
    "keywords": ["Test", "API", "Develop"],
    "type": "library",
    "license": "MIT",
    "require": {
        "monolog/monolog": "^1.23.0",
    },
    "autoload": {
        "psr-4": {
            "osamuya\\TestPackage\\": "src/"
        }
    }
}

というような感じで必要最低限の情報を書けば大丈夫です。
nameは大文字禁止と言われるので小文字+ハイフンとかで設定するとよいです。通常testPackageのようなキャメルケースをtest-packageにする感じになります。

コンポーザーでインストールするといつものように指定したライブラリーがvendor以下に落ちてきます。
実際に特に依存ライブラリーは考えていなかったのですが、とりあえずチュートリアルとしてmonolog/monolog入れましたが、phpunitとかユニットテスト用のライブラリとか入れることになるような気がします。パッケージ開発に便利なパケージがパッケージストにたくさんあるのでそのパッケージを使ってみてください。(ややこしい)

php composer.phar install

ここまでで開発の準備自体は整いました。

Packagistからオートロードできるようにする

先のcomposer.jsonの

....
    "autoload": {
        "psr-4": {
            "osamuya\\TestPackage\\": "src/"
        }
    }
....

という記述でオートローダーが自動的に読み込んでくれるように設定するところになっています。
ここが最初ややこしくてよくわからなかったのですが、開発自体は、

vi /SOMEWHERE/testPackage/src/xxxxxx.php

として開発します。この/SOMEWHERE/testPackage/src/xxxxxx.phpをライブラリーとして、/SOMEWHERE/testPackage/test.phpみたいな感じで開発すればOKかと思います。
ある程度開発しちゃったら、Githubにコミット&プシュしてPackagistからcomposerで落とせるようにします。
自分で開発したものを自分でPackagistから落としてくると、/SOMEWHERE/vendor/testPackage/test.php

pachagistに登録

Packagistにアカウントがあれば、SubmitのところからGithubのリポジトリを登録するだけで完了します。SSH://の方ではなくて、https://の方のURIを登録します。
成功したら「My Packages」にライブラリーが登録されます。

自分のライブラリーを自分で落としてくる

登録が完了したらcomposerで自分が作成したライブラリーを落としてみます。

php composer require osamuya/test-package:dev-master

コミットの再にtag(通常バージョンを入れる)を入れていなかったらPackagistに叱られます。まだ開発中で特にバージョンがない場合は:dev-masterで落とすことができます。
これで自動的にオートロードされるのでvendor以下のライブラリとして使うことができます。

Githubのサービスフックで自動更新を設定する

This package is not auto-updated. Please set up the GitHub Service Hook for Packagist so that it gets updated whenever you push!

というメッセージがPackagistの方で出ます。これはGithubのpush更新がPackagistに自動的に反映されないのでhookを作成して自動的に反映されるようにしなさいということです。Githubのサービスフックなので簡単に設定できます。
上記の手順までで公開はできていますが、Github側に下記手順を行なっておくことで、ライブラリの更新が自動的にPackagistに反映されるようになります。

Integrations & servicesの設定(旧ServiceHookの設定)

  1. PackagistのProfileからAPI Tokenを取得します。(27tFrPwxHYFGEYiJ5ICcこういう文字列)
  2. Githubにいって対象のリポジトリを選択し、リポジトリのSettingsタブを開きます。
  3. “Integrations & services”という項目をクリックします。
  4. Add serviceボタンをクリックして、Packagistを選択します。
  5. User(PackagistのUser)、先程のAPI Token、Domainは空にして保存します。

これで次回のpushが行われると自動的にPackagistにも反映されるようになります。
ここまでで完了。

Composerでインストールしてみる

php composer.phar require osamuya/test-package:dev-master

基本、これで落ちてきます。:の後がバージョン情報になります。バージョン情報がない場合はたいていの場合dev-masterで落ちてくると思います。
バージョン情報がタグでコミットされていない場合にエラーになります。

[InvalidArgumentException]
Could not find a matching version of package osamthing/osamthing/lara-helper. Check the package spelling, your version constraint and that the package
is available in a stability which matches your minimum-stability (dev).

というようなエラーが出たら、たいていはスペルミスかなんかです。

composer search osamuya/test-package

でヒットするかどうか確認してください。

Packageの確認

composerでダウンロードしてみると、

vendor/osamuya/test-package

にファイルがあるはずです。composer.jsonには、”osamuya/test-package”: “dev-master”が追加されています。composerのアップデード時にこのパッケージの更新も行われる段取りになっています。

autoloaderとパス、名前空間とクラスの呼び出し

いまいち直感的にわからないのが、オートローダーとその呼び出されているクラスまでのパス、名前空間とそのショートカット、最後に実際にnewするとかstaticのメソッドを呼び出して使うというそれらの関係です。
オートローダーのデバックをしてみると、

"osamthing\\Larahelper\\": [
    "/SOME_FULL_PATH/vendor/composer/../osamuya/test-package/src"
],

というふうに設定されています。

バージョン管理

Packageのバージョン管理はGitのタグで行います。私自身もGitの管理でタグは使わないので比較的不慣れな感じですが、使っているうちにわかってくる感じです。

git tag 1.0.0

更新するタイミングでバージョンのタグを付与してあげます。これがない場合は(たぶん)自動的にdev-masterになっているはずです。


ComposerとPackagistでPHPライブラリを開発、テスト、公開する(1/2)
ComposerとPackagistでPHPライブラリを開発、テスト、公開する(2/2)
Composer による依存管理 と Packagist によるライブラリの公開
Laravel 5 パッケージのつくり方
PHP開発でComposerを使わないなんてありえない!Packagist公開編
Laravelで名前空間を指定してオートロードされなかったら見る場所

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください