composerのプロジェクトをPackagistに公開して，composer require で利用できるようにする

packagist.org にパッケージを公開する方法について記載します．

下記の記事が非常に良いのですが，情報が古くなってきている箇所があるため新規に記事とします．

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を作成します．

`name`, `authors`, `autoload` あたりの項目についてはこのままではアップロードできないと思いますので，適宜変更してください．

```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/` ディレクトリを作成します．

`autoload` で指定している箇所です．

```
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` を， `composer.json` に記載した `Tarohida\Tarohida\` (私の場合) に設定してください．

### テストの作成

※ パッケージ公開に必須のものではないため，とりあえず動かしてみたいみたいな場合は飛ばしても大丈夫です．

テストも作成してみます．

以下発行すると，`require-dev` に記載してある `phpunit/phpunit` がインストールされるはずです．


```
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のレポジトリにプッシュします．

### Packagistへの公開

いよいよPackagistへの公開を行います．

`composer.json` のフォーマットチェックを行います．

```
php composer.phar validate
```

#### packagist.org アカウントの作成と，パッケージの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` 等を利用するのと同じような感覚で自分の作成したライブラリを利用することができます．

```
$ composer require tarohida/tarohida
Using version ^1.0 for tarohida/tarohida
./composer.json has been created
Running composer update tarohida/tarohida
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking tarohida/tarohida (v1.0.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading tarohida/tarohida (v1.0.0)
  - Installing tarohida/tarohida (v1.0.0): Extracting archive
Generating autoload files

```

タグを打っていない場合は，`dev-main` というバージョンを指定しておかないと `require` 処理に失敗します．

https://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-2/

```
composer require tarohida/tarohida:dev-main
```

のように，`dev-{branch}` の文言を指定してください．

packagist の画面に表示されてるやつです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124948/a1ac350f-a43d-cb88-24e8-08bee0507b6b.png)


### 使う側のサンプルプログラム

使う側のサンプルプログラムも，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/)
- [Packagist](https://packagist.org)