複数のCakePHPに入れるライブラリを1つのComposerで管理

PluginとVendorの中を1つのComposerで管理したい

以下のツリーのように、ひとつのCakePHP本体と複数のCakePHPアプリケーションがあるときに
DebugKitやPHPUnitなどはそれぞれのアプリケーションごとにある必要は無く、共通で参照できる場所にあればオッケーです。

.
├── app1/(CakePHPアプリケーション)
│   ├── Plugin/
│   └── Vendor/
├── app2/(CakePHPアプリケーション)
│   ├── Plugin/
│   └── Vendor/
├── app3/(CakePHPアプリケーション)
│   ├── Plugin/
│   └── Vendor/
├── composer/
└── lib/(CakePHP本体)
    └── Cake/
  • CakePHP アプリケーションディレクトリ内のPluginとVendorはComposerで入れたい
  • Composerは共通の1つで管理したい

こんなことがしたかったので、次のようにやってみました。

Composerのインストール

mkdir -p composer/{bin,Vendor,Plugin}
cd composer
https://getcomposer.org/installer | php -- --install-dir=bin

composer.jsonを記述

vi bin/composer.json
{
  "require": {
    "phpunit/phpunit": "3.7.*",
    "cakephp/debug_kit": "2.*"
  },
  "config": {
    "vendor-dir":"../Vendor"
  },
  "extra": {
    "installer-paths": {
      "../Plugin/{$name}/": [
        "cakephp/debug_kit"
      ]
    }
  }
}
cd composer/bin
php composer.phar install

こうすると、installer-pathsで指定したライブラリはcomposer/Plugin/に、
それ以外はvendor-dirで指定したcomposer/Vendor/に分かれて入るので、
各アプリケーションからApp::build()でパスを追加指定してあげます。

vi app2/Config/bootstrap.php
<?php

App::build(array(
    'Vendor' => array(
      '/path/to/composer/Vendor/',
    ),
    'Plugin' => array(
      '/path/to/composer/Plugin/',
    ),
  )
);

// アプリケーションで使いたいプラグインだけをロード
CakePlugin::load('DebugKit')


これでオッケー。
Composerは便利だなー。