[PHP]自作ライブラリをComposer化&Packagistの登録方法
2017/07/03
こんにちは、okutani(@okutani_t)です。本記事では、以前作った「NPHPMailer」というライブラリをComposer化したので、それを例にしてComposer管理の自作ライブラリの作り方を解説しています。
NPHPMailerは以下の記事で解説しています。NPHPMailerは、ただのPHPMailerのラッパークラスです。
「Composerってなに?」という方は、こちらの過去記事を先に一読してみてください。
リモートリポジトリは今回「GitHub」を使っています。GitHubの概要&登録は以下の記事を参考に。
Composerライブラリにしたパッケージは、最後に「LINKPackagist」というサイトに登録して、誰でもかんたんに導入できるよう設定しています。
ではさっそく、自作ライブラリをComposer化して、Packagistで導入できるまでを見ていきましょう。
参考ComposerとPackagistでPHPライブラリを開発、テスト、公開する(1/2) · THINKING MEGANE
スポンサーリンク
もくじ
composer.jsonの作成
Composer化したいライブラリのルートディレクトリに「composer.json」を作成します。
今回、composer.jsonは以下の内容にしてみました。
上記の項目は以下のとおりです。
name | [ベンダー名/プロジェクト名]の形式で記述 |
---|---|
type | ライブラリの種類を記述(library, project, metapackage, composer-pluginなど) |
description | ライブラリの概要 |
homepage | ライブラリのサイト。今回はGitHubのページを指定 |
keywords | ライブラリに関連したキーワード。配列で指定 |
authors | 作者、メールアドレスを配列で記述 |
require | 必要な依存ライブラリ、PHPのバージョンを指定。今回は名前空間を使っているのでPHP5.3.0以上を指定 |
require-dev | テストに必要なライブラリを指定 |
scripts | composer testコマンドでphpunitを使えるように[“test”: “phpunit”]を指定 |
autoload | オートロードの設定。[“名前空間プレフィックス\\” : “ソースコード設置ディレクトリ”]の形式で記述(PSR-0) |
license | ライセンス情報。(Apache-2.0, MIT, LGPL-2.1など) |
今回、autoloadにPSR-0を使っています。
本当はPSR-4で指定したかったのですが、知識不足でPSR-4だとうまく読み込めなかったため、泣く泣くPSR-0で設定しています。。
さらに詳しい設定内容は以下のサイトを参考にしてください。本記事も以下を参考にしています。
参考The composer.json Schema – Composer
ちなみに、以下のコマンドで対話的にcomposer.jsonを作成することもできます。今回は以下のコマンドを使わず手打ちしました。
$ composer init
composer.jsonを作成したら、requireに記述した必要なライブラリ(依存ライブラリ)を導入します。
$ composer install --dev
「--dev
」を利用することで、開発時に必要なライブラリ(ここではPHPUnit)を一緒に導入しています。
composer.jsonのチェック
以下のコマンドでcomposer.jsonのチェック(バリデーション)をおこなうことができます。
$ composer validate
./composer.json is valid # ok
一通りcomposer.jsonができあがってきたら上記コマンドで確認しておくことをおすすめします。
自作ライブラリの設置
srcディレクトリ以下に自作のライブラリを配置します。
今回は、名前空間に一致するように「src/OkutaniT/NPHPMailer.php」として配置しました。
ライブリ本体内には「namespace OkutaniT;」として名前空間を利用しています。
テスト
次に、PHPUnitを使ってテストをおこなっていきます。
テストについて僕がそこまで詳しくない(勉強中)なので、必要最低限だけ記載していきます。
phpunit.xmlの作成
以下の内容で「tests/phpunit.xml」を作成。
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="../vendor/autoload.php"
cacheTokens="true"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
verbose="false">
<filter>
<whitelist>
<directory>../src/</directory>
</whitelist>
</filter>
<testsuite name="OkutaniT\NPHPMailer Test Suite">
<directory>.</directory>
</testsuite>
</phpunit>
phpunit.xmlの用意ができました。
テストコードを用意する
次にテストをおこなうコードを書いていきます。今回は「tests/OkutaniT/Tests/NPHPMailerTest.php」を作成しました。
<?php
namespace OkutaniT\Tests;
use OkutaniT\NPHPMailer;
class NPHPMailerTest extends PHPUnit_Framework_TestCase {
// ここにテストを書いていく...
}
実際のコードは記事末にあるGitHubから確認してみてください(ただし、今のところ動作だけでほぼテストになってないです……)。
なお、今回メールの送信テストに「mailcatcher」を使っています。mailcatcherを利用できるように、php.iniファイルを変更します(メールテストしない場合は飛ばして読んでください)。
$ which catchmail
/usr/local/opt/rbenv/shims/catchmail
$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/5.6
Loaded Configuration File: /usr/local/etc/php/5.6/php.ini
Scan for additional .ini files in: /usr/local/etc/php/5.6/conf.d
Additional .ini files parsed: /usr/local/etc/php/5.6/conf.d/ext-pdo_pgsql.ini
$ vi /usr/local/etc/php/5.6/php.ini
;sendmail_path
↓
sendmail_path = "/usr/local/opt/rbenv/shims/catchmail"
本記事ではmailcatcherについて細かく解説しませんが、気になる方は過去に書いた「LINKLaravelでMailCatcherを利用してテストメールを送信する | vdeep」あたりを参考にしてみてください。
テストの実行
以下のコマンドでテストを実行できます。
$ composer test tests
これは「composer.json」にscript: testを追加しているので、上記の形で実行できます。以下を参考にしました。
参考$ composer testでPHPUnitを実行する | kanonjiのブログ
これでテストが通るように実装を進めていけばOKですね。
ライセンスファイルの設置
お好きなライセンスで「LICENSE」ファイルを作成し、プロジェクトのルートディレクトリに設置します。
なお、ライセンスの詳しい解説は以下のサイトが参考になります。
参考GPLやMITやCCなど主要ライセンスの内容と意味のまとめ | ITキヲスク
GitHub上でLICENSEファイルを作成する場合は以下のサイトを参考に。
今回は、PHPMailerと同じライセンスである「LGPL-2.1」を利用してみました。
.gitignoreの作成
今回、Composer化したライブラリはGitHubで管理するため、.gitignoreを設置しておきます。
以下の内容でプロジェクトのルートディレクトリに.gitignoreを設置。
composer.lock
vendor/
composer.phar
今回、ComposerはPCに直接インストールしてますが、のちのち共同開発者が出てきた場合も考えてcomposer.phar(composr本体のこと)をignoreしています。
コミットしておきます。
$ git add .
$ git commit -m "add .gitignore"
これで準備が整いました。
ちなみに、ライブラリのディレクトリ構成は以下のとおりです。
.
├── LICENSE
├── README.md
├── composer.json
├── composer.lock
├── src
│ └── OkutaniT
│ └── NPHPMailer.php
└── tests
├── OkutaniT
│ └── Tests
│ └── NPHPMailerTest.php
└── phpunit.xml
本記事の解説に載っていないファイルがちらほらありますが、補完してお読みください。
GitHubへプッシュする
ライブラリ公開の準備がすべて整ったので、GitHubへプッシュしましょう。
と、その前にライブラリのバージョンを設定しておきます。以下のコマンドを実行。
$ git tag v1.0.0
これでバージョン1.0.0のライブラリとして公開できますね。
以下のコマンドでプッシュします。
$ git push origin master
タグ情報のプッシュ。
$ git push origin v1.0.0
これでGitHubにライブラリを公開できました。
Packagistへ登録
では、最後にPackagistに登録して、誰でもかんたんにライブラリを導入できるように設定していきましょう。
まずはPackagistの公式サイトへアクセス。
LINKPackagist
「Create account」でアカウントを作成していきます。
それぞれ項目を入力して「Register」クリック。
アカウントが作成されました。
では先ほど作成したライブラリを登録していきましょう。
ライブラリの登録
上部メニューから「Submit」→Repository URLにリポジトリがあるGitHubのURLを入力します。「Check」ボタンをクリック。
問題がなければ、続けて「Submit」ボタンをクリック。
これでPackagistに自作ライブラリが登録できました。
検索バーからライブラリを検索すると、きちんと登録されているのが確認できます。
GitHub自動更新設定
GitHubにプッシュしたときに、Packagist側に通知を送って自動更新させる設定をおこないます。
GitHub上の自作ライブラリのページを開き、「Settings」→「Integrations & services」→「Services(Add service)」からPackagistを選択。
以下を入力し、「Add service」をクリック。
User | Packagistのユーザー名 |
---|---|
Token | PackagistのAPIトークン(Profile -> Your API Tokenから取得) |
Domain | 未入力でOK |
Active | チェック |
「Okay,〜」と表示されればOKです。これで自動更新設定が完了しました。
では、最後に確認のため、composerを使ってPackagistに登録したライブラリをインストールしてみます。
composer導入確認
てきとうに導入確認用のディレクトリを作成して、composer.jsonを以下の内容で作成します。
{
"require": {
"okutani-t/nphpmailer": "~1.0"
}
}
もしくは、以下のように開発用のバージョンを指定してもOKです。これはmasterブランチの最新を取得します。
{
"require": {
"okutani-t/nphpmailer": "dev-master"
}
}
インストールを実行します。
$ composer install
無事にvendor以下に自作ライブラリを導入することができました。
あとは以下のようにライブラリをオートロードしてあげればOKですね。
<?php
require __DIR__ . "/vendor/autoload.php";
use OkutaniT\NPHPMailer;
名前空間を使っているので、useするのをお忘れなく。
まとめ
自作ライブラリをComposer化する手順について紹介しました。
最初はちょっと手こずりますが、一度手順に慣れてしまえば難しいものではないですね。
今回Composer化したNPHPMailerは、以下のGitHubリポジトリで公開しています。
LINKokutani-t/NPHPMailer: PHPMailerを日本語で使えるようにするラッパークラス
参考になるか分かりませんが、Composer化の方法についての概要ぐらいは分かっていただけるかと思います。
僕自身、まだイマイチ掴みきれてないところがいくつかあるので、なにかあれば追記していこうと思います。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク