hello foo bar
Pachagistに登録するリポジトリとして適当なリポジトリを作成します。
ここでは
osamuya/testPackage
https://github.com/osamuya/testPackage.git
として作成しておきます。
testPackage/としてプロジェクトを作成する感じでよいかと思います。
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でソース管理できるようにしておきます。
この開発ディレクトリ内にコンポーザーを準備します。
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
ここまでで開発の準備自体は整いました。
先の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
Packagistにアカウントがあれば、SubmitのところからGithubのリポジトリを登録するだけで完了します。SSH://の方ではなくて、https://の方のURIを登録します。
成功したら「My Packages」にライブラリーが登録されます。
登録が完了したらcomposerで自分が作成したライブラリーを落としてみます。
php composer require osamuya/test-package:dev-master
コミットの再にtag(通常バージョンを入れる)を入れていなかったらPackagistに叱られます。まだ開発中で特にバージョンがない場合は:dev-masterで落とすことができます。
これで自動的にオートロードされるのでvendor以下のライブラリとして使うことができます。
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に反映されるようになります。
これで次回のpushが行われると自動的にPackagistにも反映されるようになります。
ここまでで完了。
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
でヒットするかどうか確認してください。
composerでダウンロードしてみると、
vendor/osamuya/test-package
にファイルがあるはずです。composer.jsonには、”osamuya/test-package”: “dev-master”が追加されています。composerのアップデード時にこのパッケージの更新も行われる段取りになっています。
いまいち直感的にわからないのが、オートローダーとその呼び出されているクラスまでのパス、名前空間とそのショートカット、最後に実際に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で名前空間を指定してオートロードされなかったら見る場所