Composerを使いこなしてEC-CUBE4系プラグインの開発効率を爆上げする
EC-CUBE4系のプラグイン開発、みなさんどうされていますか?
-
bin/console eccube:plugin:generate
コマンドでプラグイン生成 -
bin/console eccube:plugin:install --code=<PluginCode>
でインストール -
app/Plugin/<PluginCode>
に移動して、 git でバージョン管理しつつ開発
という感じでしょうか?
オーナーズストアに対応する場合は、 mock-package-api を使用して、一旦 tgz で固めないといけませんね。
開発中「あ、プラグイン削除のテストしなきゃ」とプラグインを削除したら、.git もろともプラグインが削除されて、泣きそうになった経験はありませんか?
(僕は何回かあります...)
このような背景から EC-CUBE4系プラグインの開発をする場合は少々工夫が必要で、日々ストレスを募らせており、何とか解消できないかと悶々としておりました。
Composer と EC-CUBE4系プラグインの関係
EC-CUBE4系のプラグインは Composer を利用して管理されてます。
通常、 Composer は packagist.org にあるリポジトリと通信して、一覧やパッケージの詳細、バージョン情報、依存関係などを取得します。
EC-CUBE4系には EC-CUBE Package API の Composer リポジトリが追加されており、この API と通信して、有料プラグインのライセンス情報や、インストール状況などを取得します。
Composer を使用して、EC-CUBE4系のプラグインをインストールする
EC-CUBE Package API の Composer リポジトリは、通常の Composer リポジトリの機能拡張です。
機能拡張されている部分は、主に EC-CUBE の管理画面から操作できるよう拡張されている部分ですので、コマンドライン操作に限ってしまえば、通常の Composer リポジトリとほとんど変わりません。
ですので、 composer.json の repositories
にEC-CUBE4系プラグインのリポジトリを追加してあげれば、bin/console eccube:composer:require
コマンドを使用して、プラグインをインストール可能です。
Composer のローカルリポジトリを活用する
Composer には、ローカル環境のディレクトリを参照できる機能がありますので、これを活用してみます。
この方法は、EC-CUBE4.0.x〜4.2.x まで使用可能です。
事前準備
bin/console eccube:plugin:generate
コマンドでプラグインの雛形を生成しておきます
bin/console eccube:plugin:generate
EC-CUBE Plugin Generator Interactive Wizard
===========================================
name [EC-CUBE Sample Plugin]:
> <enter>
code [Sample]:
> <enter>
ver [1.0.0]:
> <enter>
上記で app/Plugin/Sample
というプラグインの雛形が生成されます。
これを、 EC-CUBE と同階層へ移動しておきます。
mv app/Plugin/Sample ../Sample
composer.json にリポジトリを追加する
composer.json の repositories
に、先ほどの Sample プラグインのローカルリポジトリを追加します。
オーナーズストアのプラグインと同じパッケージ名のプラグインを開発する場合は、Package API のリポジトリに exclude
を追加してください。
exclude
に記述したプラグインは、Package API のリポジトリの検索対象から除外されます。
"exclude": ["ec-cube/sample", "ec-cube/recommend42"],
という感じで複数記述できます。
// ここから // ここまで は追加時には削除してください。構文エラーになってしまいます
"repositories": {
// ここから
"sample-plugin": {
"type": "path",
"url": "../Sample"
},
// ここまで
"eccube": {
// ここから
"exclude": ["ec-cube/sample"],
// ここまで
"type": "composer",
"url": "...",
"options": {
"http": {
"header": ["X-ECCUBE-KEY: ..."]
}
}
}
}
repositories
の項目自体が無い場合は、EC-CUBE の管理画面→オーナーズストア→認証キー設定にて、認証キーを登録すると生成されると思います。
ローカルリポジトリのプラグインをインストール
bin/console eccube:composer:require
コマンドを利用してプラグインをインストールします。
bin/console eccube:composer:require ec-cube/sample
たくさんログが出力されますが、以下のようなログが含まれていればインストール成功です。
[81.2MiB/12.76s] Package operations: 1 install, 0 updates, 0 removals
[81.3MiB/12.77s] - Installing ec-cube/sample (1.0.0): [81.3MiB/12.77s] Symlinking from ../Sample[81.3MiB/12.77s]
インストール時に以下のようなエラーが出た場合は、
In PluginInstaller.php line 56:
Undefined index: id
プラグインの composer.json に extra.id
を追加してください。(id の値は重複しない数字であればOKです)
diff --git a/composer.json b/composer.json
index 7e23bbd..2d1cf32 100644
--- a/composer.json
+++ b/composer.json
@@ -7,6 +7,7 @@
"ec-cube/plugin-installer": "^2.0"
},
"extra": {
- "code": "Sample"
+ "code": "Sample",
+ "id": 1
}
}
app/Plugin
を確認すると、シンボリックリンクでプラグインが追加されていると思います。
ls -al app/Plugin
drwxr-sr-x 12 nanasess nanasess 4096 10月 17 16:08 .
drwxr-sr-x 10 nanasess nanasess 4096 7月 5 09:54 ..
lrwxrwxrwx 1 nanasess nanasess 26 10月 17 16:08 Sample -> ../../../Sample/
シンボリックリンクですので、管理画面からプラグインを削除してもリンク先のソースコードが消えることはありません。
このインストール方法は、独自プラグインにも、オーナーズストアのプラグインにも使えます。
注意点
- Composer API でプラグイン一覧を返すことができないので、管理画面の プラグインを探す からはインストールできません。(有効化/無効化/削除は可能)
- 開発用途なので、本番環境での使用は推奨しません。
その他
EC-CUBE4.2.1 からは、本インストール方法を活用したオプション が追加されます。
また PHPバージョンごとに Docker イメージを作成する機能を活用すると、E2Eテストも10分くらいで書けてしまいます。
Composerを使いこなしてEC-CUBE4系プラグインの開発効率を爆上げして睡眠時間を増やしましょう!
Discussion