Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

プラグインの初期インストール機構 #4733

Closed
okazy opened this issue Oct 14, 2020 · 7 comments
Closed

プラグインの初期インストール機構 #4733

okazy opened this issue Oct 14, 2020 · 7 comments
Milestone

Comments

@okazy
Copy link
Contributor

okazy commented Oct 14, 2020

概要(Overview)

EC-CUBEはプラグインをインストールすることで様々なカスタマイズが可能だが、EC-CUBEのインストール後にプラグインを個別にインストールする必要がある。
よく使われているプラグインはEC-CUBEのインストール時に最初から入っていた方が使いやすいので、プラグインの初期インストール機構があれば便利だと思う。
例えば以下のような用途にも活用できる可能性がある。

  • 「おすすめ商品プラグイン」などのよく使われるプラグインを初期インストール
  • 「アパレル」や「B2B」など目的ごとにおすすめのプラグインを初期インストール
  • プラグイン利用のチュートリアルの役割(?)

全ての要件を満たすのは難しいと思うので、まずはどのような仕様が良いか検討したい。

要件/仕様

  • EC-CUBEのパッケージに公式プラグインを同封して配布できる
  • EC-CUBEをインストールすると同封したプラグインもインストールされた状態となる
  • プラグインはストアからインストールしたプラグインと同様にアップデートができる

実装(調査状況)

  • パッケージング
    • ストア( composer )経由でインストール
      • ライブラリ( vendor配下 )がインストールされる
      • composer.jsonにプラグインが追記される
      • initialize されていない状態( initialized=false
        • EntityProxyは生成されていない
        • PluginManager->install() および PluginManager->enable() は実行されていない
    • dtb_plugin.csvへ追記 OR 同等の処理を追加
      • 生成にはストアの情報が必要
        • パッケージングスクリプトで dtb_plugin OR package-api を叩いて生成
  • インストール
    • インストール時に dtb_plugin に登録されており、 initialized=false のプラグインを有効化する処理を追加する
  • アップデート
    • 公式プラグインは認証キーなしでインストール、アップデートできるように修正
    • パッケージング時にストアのプロダクトIDまで登録しておけばアップデート可能(要検証)

考えられる仕様

  • 初期インストールプラグインの指定方法
    • パッケージで指定(ユーザが変更不可)
    • インストール時にユーザが指定(Webインストーラ)
    • インストール時に開発者が指定(インストールコマンド)
  • インストール方法
    • パッケージに同封
      • メリット:インストールは早い
      • デメリット:インストール機構が複雑になりそう
    • EC-CUBEインストール後にプラグインインストール
      • メリット:インストール機構が比較的シンプル
      • デメリット:(プラグインが複数になった場合)インストールに時間がかかる

  • Webインストーラ内でオプトインでプラグインを選択可能
  • EC-CUBEのインストール後にプラグインをインストール(*1)
  • 初期インストールプラグインのリストはpackage-apiで配信

*1: composer2.0でインストール時間の短縮を期待

期待する内容(Expect) or 要望 (Requirement)

要件の検討と設計

環境 (environment)

  • EC-CUBE: 4.1

関連情報 (Ref)

@okazy okazy added this to the 4.1 milestone Oct 14, 2020
@okazy
Copy link
Contributor Author

okazy commented Oct 15, 2020

検討メモ

  • 初期インストールプラグインの指定方法
    • パッケージで指定(ユーザが変更不可)
    • インストール時にユーザが指定(Webインストーラ)
      • 管理画面の情報入力画面で認証キーを指定できる
    • インストール時に開発者が指定(インストールコマンド)
      • 一旦不要
  • インストール方法
    • パッケージに同封(こっち)
      • プラグインのアップデートごとにパッケージをアップデートする
      • メリット:インストールは早い
      • デメリット:インストール機構が複雑になりそう
    • EC-CUBEインストール後にプラグインインストール
      • メリット:インストール機構が比較的シンプル
      • デメリット:(プラグインが複数になった場合)インストールに時間がかかる
  • 対象のプラグイン
    • 公式プラグインのみ(基本こっち)
    • 有料プラグインの扱い
  • 認証キーの扱い
    • package-api 認証キーなしでインストールできるプラグインの制御をする
  • プラグインのアップデート対応
  • レンサバなどのプリインストールの考慮

方針

  • composer.jsonにプラグインを記載しておく
  • GitHubにはコードを含めない
  • パッケージにはコードを含める
  • package-apiでアップデートができるように
  • プラグインのアップデートごとにパッケージをアップデートする

本体に組み込みではなくプラグインで実現する理由

  • 本体から切り離してプラグインごとのアップデートが可能

その他の課題

  • プラグインのパック売りは別で実現する
    • 有料プラグインのセット売りはストア側の改修が必要

@okazy
Copy link
Contributor Author

okazy commented Oct 16, 2020

少なくとも公式プラグインでinstall時に特別な処理をしているプラグインはない
DBの変更処理はenableで行われる

方針

  • プラグインをインストールした状態でパッケージングする
  • プラグインの有効化処理は本体のインストール時に行う

テスト対象

  • Web API プラグイン
  • クーポンプラグイン
    • enableでページの追加処理をしているのでテストに良さそう
  • 関連商品プラグイン
    • 新規テーブルの追加とtraitでのカラムの追加をしている

課題

  • プラグインをインストールした状態でパッケージングする
    • dtb_plugin.csvへレコードの追加
      • パッケージング時にimport_csvへの追記
      • EC-CUBEをインストール時に追記
  • プラグインの有効化処理は本体のインストール時に行う
    • テーブル作成はenableで行われている
    • 例えばDBへのデータ追加、ファイルの作成などもenableで行われている
    • enableでどんな処理が行われているのか網羅できないため、EC-CUBEのインストール時に処理を走らさざるを得ない

検証メモ

  • プラグインをインストールしdtb_plugin.csvへレコードの追加した状態でパッケージしてインストールするとプラグインがインストールされた状態になった
  • bin/console eccube:fixtures:load 内で動的にdtb_pluginへ登録してやることはできないか。
  • または新しいコマンドを作成するか
  • プラグインの有効化処理はしないといけないのでコマンドは作成する

@okazy
Copy link
Contributor Author

okazy commented Oct 19, 2020

プラグインインストールには3種類ある

  • インストール

    • var/cache(phpのキャッシュ?)に一時ファイルを作る
  • 初回有効化

    • app以下のproxyファイルを作る
  • 初回以外の有効化

  • 独自テーブルを追加とtraitを追加は処理が別?

参照: #2546

  • 解決策1: インストールの処理を初回有効化時に実行できるか
    image
  • EC-CUBEのインストール時にインストール時の処理を実行
    • キャッシュの生成削除タイミングを調整しないといけない(proxy作った後にcacheを作り直す)

@okazy
Copy link
Contributor Author

okazy commented Oct 19, 2020

プロキシ生成/スキーマ更新タイミングの検証結果

  • ストア経由ではインストール時にプロキシ生成/スキーマ更新がされず、有効化のタイミングで更新されるプロキシ生成/スキーマ更新がされる

  • install コマンド/ファイルアップロードではインストール時にプロキシ生成/スキーマ更新される

  • プロキシが生成されていない時、 doctrine:schema:update コマンドを実行すると無効化されているプラグインも含めてテーブル/Traitが有効になり更新される

  • プロキシが生成されている時、 doctrine:schema:update コマンドを実行すると無効化されているプラグインも含めてテーブルは有効になり、Proxyに読み込まれているTraitのみ有効になり更新される

  • ストア経由(まだinitializeされていない)のプラグイン有効化で、全プラグインの追加テーブル/追加Traitが生成される

@okazy
Copy link
Contributor Author

okazy commented Oct 23, 2020

composer.lock"type": "eccube-plugin", の記載があると composer install ができない。
また、 composer install が完了しないと bin/console eccube:composer:require コマンドも使えない。
そのためgitでEC-CUBEプラグイン導入済みの composer.lock を管理できない。
eccube-plugin-installer を修正するか、インストール済みのプラグインをgit管理しないか

https://github.com/EC-CUBE/eccube-plugin-installer/blob/6185cd43ae0dd0423bebc9bb900d096356340f80/src/Eccube/Composer/PluginInstaller.php#L34

@okazy
Copy link
Contributor Author

okazy commented Aug 19, 2021

@okazy
Copy link
Contributor Author

okazy commented Aug 19, 2021

こちら解決していますのでクローズします。
対応ありがとうございました。

@okazy okazy closed this as completed Aug 19, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant