EC-CUBE4.1系プラグイン開発時、オーナーズストア経由のインストールテストでハマった話

EC-CUBEのプラグイン開発を行っているのですが、先日、公式のドキュメントに従ってオーナーズストア経由のインストールをテストした時に、色々とハマってしまった時の経緯や対処法を書いておきます。

環境

  • Docker version 20.10.14 (Docker Desktop forMac)
  • PHP 7.4.29
  • mysql Ver 14.14 Distrib 5.7.37,

公式ドキュメントと異なる点と対処方法

公式ドキュメントでのmockサーバの実行手順(一部のみ抜粋)では、以下の2つのコマンドは無視しました。

// mockサーバを参照するように環境変数を定義
echo ECCUBE_PACKAGE_API_URL=http://127.0.0.1:9999 >> .env

// 認証キーを設定
psql eccube_db -h 127.0.0.1 -U postgres -c "update dtb_base_info set authentication_key='test';"

代わりに、以下のコマンドを実施して docker-compose.yml を書き換えて、

vi docker-compose.yml
# environment 内に以下を追加
ECCUBE_PACKAGE_API_URL: "http://host.docker.internal:9999"

更に、Dockerで立ち上げたローカル環境の、「認証キー設定 – オーナーズストア」にアクセスして、認証キー設定に「test」と入力して保存する。

認証キー設定オーナーズストア
http://localhost:8080/admin/store/plugin/authentication_setting

オーナーズストア経由のインストールをテストする – < for EC-CUBE 4 Developers />

ハマったポイント

.env eccube.yaml の設定を読み込んでくれない

.env に「ECCUBE_PACKAGE_API_URL」を設定したり、eccube.yaml で、env(ECCUBE_PACKAGE_API_URL) や eccube_package_api_url を「http://127.0.0.1:9999」にするも、上手く読み込んでくれず、結局「https://package-api-c2.ec-cube.net」を参照してしまう・・。

現時点でも、.env eccube.yaml が無視される理由は結局わかっていません。。
ただ、docker-compose.yml 内に記載すれば読み込んでくれることを発見したので、冒頭のとおり docker-compose.yml を編集しました。

http://127.0.0.1:9999 ではリクエストが通らない

「http://127.0.0.1:9999」ではなく、「http://host.docker.internal:9999」を使うことで動作しました。(以下:参考記事)

オーナーズストアのモック化がうまくいかない – EC-CUBE 開発コミュニティ – フォーラム
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?viewmode=flat&order=ASC&topic_id=26255&forum=17&move=prev&topic_time=1633936369

host.docker.internal は Docker Desktop forMac , Docker Desktop for Windows では利用できるが、それ以外(Linux等)の環境では動作しないようですのでご注意ください。

https://docs.docker.jp/v19.03/docker-for-mac/networking.html
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/windows/networking/

「プラグインを探すオーナーズストア」で、エラーは出ないがプラグインが表示されない

Dockerで立ち上げたインスタンス「objective_lamarr eccube/mock-package-api」のログを見ると、以下のログが吐き出されていた。

2022-04-30 03:50:06.713 ERROR 1 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: org.apache.commons.vfs2.FileSystemException: Could not read from "tgz:file:///repos/PluginName.tgz!/composer.json" because it is not a file.] with root cause

公式のドキュメントに合わせて以下のコマンドでファイルを生成し直したら解消されたので、これは、tar での圧縮時に誤った構成になっていることが原因だと思われます。

COPYFILE_DISABLE=1 tar --exclude ".git" --exclude ".DS_Store" -cvzf ../PluginName.tgz *

※公式ドキュメントでは「tar.gz」になっているが「.tgz」に変更しないと読み取ってくれない模様。

プラグイン仕様 – < for EC-CUBE 4 Developers />
https://doc4.ec-cube.net/plugin_spec

Failed to initialize global composer: Composer could not find the config file: /var/www/html/app/Plugin/.composer/composer.json

僕の環境だと「-」を含んでいる場合、composer.json を見つけられないというエラーが発生した。

-   "name": "ec-cube/your-plugin-name",
+   "name": "ec-cube/yourpluginname",

Composerのドキュメントでは、

The name must be lowercase and consist of words separated by [-], [.] or [_].
名前は小文字で、[-]、[.]、[_]で区切られた単語で構成されている必要があります。

とあり、原因は不明。。(もしわかる方がいたらコメントで教えて頂けると嬉しいです。)

The composer.json schema – Composer

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください