vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

[PHP]自作ライブラリをComposer化&Packagistの登録方法

      2017/07/03

LINEで送る
Pocket


こんにちは、okutani(@okutani_t)です。本記事では、以前作った「NPHPMailer」というライブラリをComposer化したので、それを例にしてComposer管理の自作ライブラリの作り方を解説しています。

NPHPMailerは以下の記事で解説しています。NPHPMailerは、ただのPHPMailerのラッパークラスです。

PHPMailerを日本語で便利につかう「NPHPMailer」作ってみた
こんにちは、okutani(@okutani_t)です。PHPでメール機能を実装するとき、『PHPMail...
2015-12-17 23:50
はてブ

「Composerってなに?」という方は、こちらの過去記事を先に一読してみてください。

[PHP]Composerを導入&はじめてのパッケージインストールまで
こんにちは、okutani(@okutani_t)です。『Composer』というツールを使うことで、PH...
2016-02-19 18:22
はてブ

リモートリポジトリは今回「GitHub」を使っています。GitHubの概要&登録は以下の記事を参考に。

GitHubの登録手順。SSH設定&リポジトリをclone, pushまで解説
こんにちは、okutani(@okutani_t)です。最近はコーディング時にGitを使うのがマストになっ...
2016-01-15 19:30
はてブ

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ファイルを作成する場合は以下のサイトを参考に。

参考githubでライセンスを設定する – Qiita

今回は、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化の方法についての概要ぐらいは分かっていただけるかと思います。

僕自身、まだイマイチ掴みきれてないところがいくつかあるので、なにかあれば追記していこうと思います。

LINEで送る
Pocket

okutani (okutani_t) のヒトコト
自作ライブラリをComposer化するにあたって、Composerの勉強にもなりました。これから作ったプログラムは極力Composerで導入できるようにしていきたいですね。

Web開発のお仕事を募集しています

フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。

Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。

ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。

LINKお問い合わせ

LINKokutani's Portfolio


 - PHP

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。