EC-CUBE4 環境構築（ローカル編）

## :zipper_mouth: まえおき

* 公式リポジトリの中にある `docker-compose.yml` は、初回起動時に `Dockerfile` をビルドしてコンテナイメージを作る。そのため、`composer.json` に EC-CUBEプラグインが入っている場合、`Dockerfile` 内に記述されている `composer install` で止まる（と思われる）。したがって、公式の `docker-compose.yml` は使わずに環境を構築する方法を考える。
* 個人的には、PhpStorm の静的解析は動いて欲しいのです。なので `vendor` ディレクトリの中も見えていた方がいいので、本手順で構築を行いました。
* 以前に投稿した記事 [EC-CUBE4 初回デプロイ](https://qiita.com/applexco/items/00831ba61936139e8b26) が1年以上経ち、忘れている部分もあるので、まとめ直しました。

## :point_right_tone1: 前提

* 動作確認したEC-CUBEのバージョンは `4.0.5` です。
* 作業を進めるにあたり適当な `docker-compose.yml` を用意する。今回は以下のようなサンプルを想定する。

```docker
version: '3'

services:
  web:
    image: xxxx
    container_name: container-web
    working_dir: /var/www/vhosts/your_project/app
    volumes:
      - ../app:/var/www/vhosts/your_project:delegated
      - /var/www/vhosts/your_project/app/codeception
      - /var/www/vhosts/your_project/app/dockerbuild
      - /var/www/vhosts/your_project/app/gulp
      - /var/www/vhosts/your_project/app/node_modules
      - /var/www/vhosts/your_project/app/var/cache
      - /var/www/vhosts/your_project/app/var/log
      - /var/www/vhosts/your_project/app/var/sessions
      - /var/www/vhosts/your_project/app/zap
    ports:
      - '80:80'
```

* プロジェクトのディレクトリ構成は以下の通りです

```
your_workspace − your_project − docker/docker-compose.yml
　　　　　　　　　　　　　　　　　　∟ app
```


## :raised_hands_tone1: Docker を使用して新しく開発環境を構築する手順

### 最新のソースコードを GitHub から取得する

```bash
cd your_workspace/your_project/app
git clone -b 4.0 --depth 1 https://github.com/EC-CUBE/ec-cube.git .
```

### 不要なファイルを削除する

```bash
rm -rf .git
```

### 環境変数ファイルのコピーと変更

```bash
cp -ap .env.dist .env
vi .env
```

### Dockerの起動

```bash
cd your_workspace/your_project/docker
docker-compose up -d
```

### PHPライブラリのインストール

```bash
docker-compose exec --user apache web composer install --no-scripts --no-plugins --no-autoloader --prefer-dist
docker-compose exec --user apache web composer dumpautoload --no-scripts --no-plugins
```

### EC-CUBEのセットアップ

```bash
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更
docker-compose exec web chown -R apache:apache ./var
docker-compose exec web chmod -R 777 ./var

# EC-CUBEの初期化
docker-compose exec --user apache web ./bin/console eccube:install
```

※ `eccube:install` について、内部的には以下と同等（らしい）。

```bash
# (optional) データベース削除
# bin/console doctrine:database:drop --force
# データベース作成
# bin/console doctrine:database:create
# (optional) スキーマ削除
# bin/console doctrine:schema:drop --force
# スキーマ生成
# bin/console doctrine:schema:create
# 初期データ生成
# bin/console eccube:fixtures:load
```

[EC-CUBE 4.0 開発者向けドキュメントサイト > インストール方法 > Windows 環境を使用する場合](https://doc4.ec-cube.net/quickstart_install#windows-%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)


### キャッシュの生成

```bash
docker-compose exec --user apache web ./bin/console cache:warmup
```

:point_up_tone2: キャッシュクリアをする場合

```bash
docker-compose exec --user apache web ./bin/console cache:clear --no-warmup
```

### アクセス確認

`http://localhost` を開いてデフォルトのショップが表示されればOKです。
:no_entry_sign: URLは、利用した docker イメージに依存します。

## :raised_hands_tone1: Docker を使用して他のマシンに開発環境を構築する手順（EC-CUBEプラグイン無し）

### 手順 「[新しく開発環境を構築する手順](https://qiita.com/applexco/items/1fb28de5173721d1e61b#raised_hands_tone1-docker-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%96%B0%E3%81%97%E3%81%8F%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86) 」 で使用したソースコードを用意する

### 環境変数ファイルのコピーと変更

```bash
cd your_workspace/your_project/app
cp -ap .env.dist .env
vi .env
```

### Dockerの起動

```bash
cd your_workspace/your_project/docker
docker-compose up -d
```

### PHPライブラリのインストール

```bash
docker-compose exec --user apache web composer install --no-scripts --no-plugins --no-autoloader --prefer-dist
docker-compose exec --user apache web composer dumpautoload --no-scripts --no-plugins
```

### EC-CUBEのセットアップ

```bash
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更
docker-compose exec web chown -R apache:apache ./var
docker-compose exec web chmod -R 777 ./var

# EC-CUBEの初期化
docker-compose exec --user apache web ./bin/console eccube:install
```

### キャッシュの生成

```bash
docker-compose exec --user apache web ./bin/console cache:warmup
```

:point_up_tone2: キャッシュクリアをする場合

```bash
docker-compose exec --user apache web ./bin/console cache:clear --no-warmup
```

### アクセス確認

`http://localhost` を開いてデフォルトのショップが表示されればOKです。

:no_entry_sign: URLは、利用した docker イメージに依存します。

## :raised_hands_tone1: Docker を使用して他のマシンに開発環境を構築する手順（EC-CUBEプラグイン有り）

### 手順 「[新しく開発環境を構築する手順](https://qiita.com/applexco/items/1fb28de5173721d1e61b#raised_hands_tone1-docker-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%96%B0%E3%81%97%E3%81%8F%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86) 」 で使用したソースコードを用意する

### 環境変数ファイルのコピーと変更

```bash
cd your_workspace/your_project/app
cp -ap .env.dist .env
vi .env
```

### Dockerの起動

```bash
cd your_workspace/your_project/docker
docker-compose up -d
```

### PHPライブラリのインストール

EC-CUBEプラグインをインストール済みの場合は、EC-CUBEプラグインの情報が `composer.json` や `composer.lock` に記載されています。売上集計プラグインは、`ec-cube/SalesReport4` です。
このままでは、 `composer install` ができません… :sob:

回避するには、利用しているEC-CUBEバージョンのオリジナルの `composer.json` と `composer.lock` を用意してコマンドを実行します。

```bash
docker-compose exec --user apache -e COMPOSER=composer_4.0.5.json web composer install --no-scripts --no-plugins --no-autoloader --prefer-dist
docker-compose exec --user apache web composer dumpautoload --no-scripts --no-plugins
```

※ 環境変数 `COMPOSER` を利用して、JSONファイル指定でコマンドを実行します。
　上記の場合、ロックファイルのファイル名は `composer_4.0.5.lock` です。
　https://getcomposer.org/doc/03-cli.md#composer

### EC-CUBEのセットアップ

```bash
# キャッシュやログ出力に使われるディレクトリのパーミッションと所有者を変更
docker-compose exec web chown -R apache:apache ./var
docker-compose exec web chmod -R 777 ./var

# EC-CUBEの初期化
docker-compose exec --user apache web ./bin/console eccube:install
```

### 認証キーを設定

私の場合、案件毎に認証キーを揃えている（開発環境・ステージング環境・本番環境は同一）ので、はじめにインストールした環境で取得した認証キーをここで設定します。

```sql
update dtb_base_info set authentication_key='your_authentication_key';
```

### EC-CUBEプラグインのインストール

```bash
docker-compose exec --user apache web ./bin/console eccube:composer:install
```

`./bin/console eccube:composer:require-already-installed` という別のコマンドもあります。
`require` となっているので、`composer.lock` とは違うバージョンが入る可能性がありますのでここでは使いませんでした。
`eccube:composer:install` は、`dtb_plugin` テーブルを参照しておらず、`eccube:composer:require-already-installed` は、`dtb_plugin` テーブルを参照している
という違いもあるようです。

※ `app/Customize/Entity` に定義した、エンティティ拡張トレイトが 一時フォルダに生成されます。

### EC-CUBEプラグインの有効化

```bash
docker-compose exec --user apache web ./bin/console eccube:plugin:enable --code=SalesReport4
```

※ 他にもインストール済みのプラグインがある場合は、 `SalesReport4` の部分を変えて実行します。
※ `app/Customize/Entity` に定義した、エンティティ拡張トレイトが `app/proxy/entity` に生成されます。

### キャッシュの生成

```bash
docker-compose exec --user apache web ./bin/console cache:warmup
```

:point_up_tone2: キャッシュクリアをする場合

```bash
docker-compose exec --user apache web ./bin/console cache:clear --no-warmup
```

### アクセス確認

`http://localhost` を開いてデフォルトのショップが表示されればOKです。

:no_entry_sign: URLは、利用した docker イメージに依存します。

## 参考リンク

* [EC-CUBE4にオーナーズストアからコマンドでプラグインをインストールする](https://qiita.com/okazy/items/6c8f40b2114480880ae6)
* [EC-CUBE4 独自プラグイン開発　②独自プラグイン開発Tips](https://qiita.com/haruna-nagayoshi/items/27108c75eaf9511f3524)
* [EC-CUBE4系でのプラグインエラーの原因と予防対策](https://qiita.com/nanasess/items/791c9ec98f69ada93ea0)