# composerのプロジェクトをPackagistに公開して,composer require で利用できるようにする
###### tags: `php` `composer`
良記事:https://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-1/
しかし,情報が古くなってきている箇所があるため,新規に記事とする.
## サンプルプロジェクト
https://github.com/tarohida/composer_publish_lib
このサンプルプロジェクトを作成していく.
主に差分を解説しており,内容については元記事のほうが詳しいため,参照しつつ読んでいただきたい.
## 手順と解説
### 必要なディレクトリとファイルの作成
まずは前述の記事同様,サンプルプロジェクト用のディレクトリを作成する.
```
mkdir MyLibrary
cd MyLibrary
curl -s http://getcomposer.org/installer | php
```
composer.jsonを作成.ここの内容は各所違うので注意
```json
{
"name": "tarohida/tarohida",
"description": "composer publish test",
"keywords": ["tarohida"],
"type": "library",
"license": "MIT",
"homepage": "https://github.com/tarohida/composer_publish_lib",
"authors": [
{
"name": "Taro Hida",
"email": "sk8trou@gmail.com"
}
],
"require-dev": {
"phpunit/phpunit": "*"
},
"autoload": {
"psr-4": {
"Tarohida\\Tarohida\\": "src/Tarohida/Tarohida/"
}
}
}
```
次に,psr-4形式で読み込む対象としている `src/Tarohida/Tarohida/` ディレクトリを作成する.
```
mkdir -p src/Tarohida/Tarohida/
```
ディレクトリ以下,`src/Tarohida/Tarohida/Tarohida.php`を作成する.これはクラスライブラリのファイル.名前は何でもいい.
```php
<?php
namespace Tarohida\Tarohida;
class Tarohida
{
private $word;
public function say()
{
return $this->word;
}
public function __construct($word)
{
$this->word = $word;
}
}
```
namespaceを,psr-4形式で `composer.json` に記載した `Tarohida\Tarohida\"` (私の場合) にすること.
### テストの作成
当然テストも作成する.
以下発行すると,`require-dev` に記載してある `phpunit/phpunit` がインストールされるはずである.
composerは `composer install` するとデフォルトで `require-dev` の方をインストールするようになったため,`--dev` オプションは必要ない.
```
php composer.phar install
```
`phpunit.xml` は作成しない.
実際に `tests/TarohidaTest.php` という名称のテストを作成し,実行して成功することを確認する.
```
mkdir tests/
```
```php
<?php
require_once 'vendor/autoload.php';
use PHPUnit\Framework\TestCase;
class TarohidaTest extends TestCase
{
public function testTarohidaSay()
{
$tarohida = new Tarohida\Tarohida\Tarohida('Hello, World');
$this->assertSame('Hello, World', $tarohida->say());
}
}
```
```
vendor/bin/phpunit ./tests/TarohidaTest.php
```
### ライブラリをGitに登録
`.gitignore` を作成.
```
vendor/
composer.lock
composer.phar
.phpunit.result.cache
```
タグ付けを行う.
参考元の記事とは異なり,どうもvx.y.zの形式が望ましいようだった.
```
git tag v1.0.0
```
```
git add -A
git commit -m 'init'
git remote add origin https://example.com/hogeuser/hogerepo/
git push origin main
```
Githubのレポジトリにプッシュする.レポジトリはGithub側で事前に作成しておくこと.
### Packagistへの公開
いよいよPackagistへの公開である.
`composer.json` のチェック
```
php composer.phar validate
```
#### アカウントの作成と,Submit
https://packagist.org にアクセス.
ユーザ登録を行い,https://packagist.org/packages/submitSubmit のURLからGithubのプロジェクトをSubmitする.
これで,Packagistへの登録が完了する.簡単!
例:https://packagist.org/packages/tarohida/tarohida
## ライブラリを使う.
任意のディレクトリで,
```
composer require tarohida/tarohida
```
を実行すると,`nsbot/carbon` 等を利用するのと同じような感覚で自分の作成したライブラリを利用することができる.
### 使う側のサンプルプログラム
使う側のサンプルプログラムも,Githubレポジトリとして用意した.
https://github.com/tarohida/composer_publish_lib_use
きわめて簡単.`vendor/autoload.php` をいつものように読み込んでから,クラスを利用するだけである.
`use` キーワードを使えば,フルパスで指定せず利用することも可能である.
```
<?php
require_once 'vendor/autoload.php';
$tarohida = new Tarohida\Tarohida\Tarohida('I use tarohida/tarohida!');
var_dump($tarohida->say());
```
ちなみに,以下ファイルを確認すれば読み込まれていることが確認できる.
```
$ cat vendor/composer/autoload_psr4.php
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Tarohida\\Tarohida\\' => array($vendorDir . '/tarohida/tarohida/src/Tarohida/Tarohida'),
);
```
おわり.
# Special Thanks For...
- [ComposerとPackagistでPHPライブラリを開発、テスト、公開する](https://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-1/https://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-1/)
- [Packagist](https://packagist.org)
## p.s.
Qiitaに,公開用の記事としてまとめ直したのでリンクしておく.
https://qiita.com/taro-hida/items/a218c6c9929ee5000e33