CakePHP3プロジェクトを複数人で共有するための準備手順

# はじめに

[Cookbook](http://book.cakephp.org/3.0/ja/)や各ブログなどに点在する情報を探し直しながら準備するのは手間なので、自分が行う手順をひと通りまとめました。
ほぼ自分用の手順の備忘録としてまとめましたが、誰かの役に立てば幸いです。

## 作業環境

* OS : `macOS`
* ローカル環境 : `MAMP PRO 3.5.2 (PHP 7.0.8)`
* 作業ディレクトリ : `~/Sites/`
* ローカルURL : `http://localhost/`


# セットアップ編

CakePHP3のインストールだけでなく、プロジェクトとして複数人で共有することを前提とした準備手順になります。

## 前提条件

* データベースサーバ
    * MySQL 5.1+
    * SQLite 3
    * PostgreSQL 8+
    * SQLServer 2008+
    * Oracle ([コミュニティプラグイン](https://github.com/CakeDC/cakephp-oracle-driver)経由)
* Webサーバ
    * PHP 7 (CLI) 以上推奨 (最低 PHP 5.5.9 以上)
        * mbstring extension
        * openssl extension
        * intl extension
        * あとは開発する機能によりけり


## インストール

### 下準備

事前にPHPのバージョンを確認しておきます。

> `php -v`

```shell-session:実行結果
PHP 7.0.8 (cli) (built: Jul 11 2016 11:30:15) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
```

プロジェクトのディレクトリを作成してGitの初期化を行います。
以下、`%PROJECT_NAME%`は適宜変更してください。

> `mkdir -p ~/Sites/%PROJECT_NAME%`
> `cd ~/Sites/%PROJECT_NAME%`
> `git init`

```shell-session:実行結果
Initialized empty Git repository in ~/Sites/%PROJECT_NAME%/.git/
```

```text:現在のディレクトリ構成
Sites/
└─%PROJECT_NAME%/ (Current)
  └─.git/
```

Gitの初期化完了後、`README.md`を簡単に準備します。
私の場合、最初はプロジェクト名を書いておき、仕様が固まり次第、採用ブランチモデルやリポジトリのクローン直後のセットアップ方法、プロジェクトの開発ルールなどを追記するようにしています。

> `vim README.md`

```diff:~/Sites/%PROJECT_NAME%/README.md
+ # %PROJECT_NAME%
```

```text:現在のディレクトリ構成
Sites/
└─%PROJECT_NAME%/ (Current)
  ├─.git/
  └─README.md
```

`README.md`の準備が完了したら初回コミットを行います。

> `git add README.md`
> `git commit -m "Initial commit."`

```shell-session:実行結果
[master (root-commit) xxxxxxx] Initial commit.
 1 file changed, 2 insertions(+)
 create mode xxxxxx README.md
```

初回コミット完了後、必要に応じてブランチモデルの適用などを行います。
また、リモートリポジトリを登録し、プッシュしておきましょう。
以下、`%REMOTE_REPOSITORY_URL%`は適宜変更してください。

> `git remote add origin %REMOTE_REPOSITORY_URL%`
> `git push -u origin master`

```shell-session:実行結果
Counting objects: 3, done.
Writing objects: 100% (3/3), xxx bytes | xxx bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To %REMOTE_REPOSITORY_URL%
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```

以上で下準備は完了になります。

### CakePHP3のインストール

下準備が完了したら、プロジェクトのディレクトリにComposerをインストールします。

> `curl -s https://getcomposer.org/installer | php`

```shell-session:実行結果
Downloading 1.x.x...

Composer successfully installed to: ~/Sites/project/composer.phar
Use it: php composer.phar
Some settings on your machine may cause stability issues with Composer.
If you encounter issues, try to change the following:

The xdebug extension is loaded, this can slow down Composer a little.
Disabling it when using Composer is recommended.
```

```text:現在のディレクトリ構成
Sites/
└─%PROJECT_NAME%/ (Current)
  ├─.git/
  ├─composer.phar
  └─README.md
```

次に、Composerを通してCakePHP3のインストールを行います。
正しいパーミッションの設定や、設定ファイルの自動生成などのセットアップも自動で行ってくれます。
以下、`%APP_NAME%`は適宜変更してください。

> `php ./composer.phar create-project --prefer-dist cakephp/app %APP_NAME%`
> `cd ~/Sites/%PROJECT_NAME%/%APP_NAME%`

```shell-session:実行結果
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Installing cakephp/app (3.x.x)
  - Installing cakephp/app (3.x.x)
    Loading from cache

Created project in %APP_NAME%
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing aura/installer-default (x.x.x)
    Loading from cache

  : (省略)

  - Installing cakephp/bake (x.x.x)
    Loading from cache

cakephp/app suggests installing markstory/asset_compress (An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.)
  : (省略)
Set Folder Permissions ? (Default to Y) [Y,n]? Y (←パーミッションの設定を行うかどうか)
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/cache
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/cache/models
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/cache/persistent
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/cache/views
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/sessions
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp/tests
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/tmp
Permissions set on ~/Sites/%PROJECT_NAME%/%APP_NAME%/logs
Updated Security.salt value in config/app.php
```

```text:現在のディレクトリ構成
Sites/
└─%PROJECT_NAME%/
  ├─.git/
  ├─%APP_NAME%/ (Current)
  │ ├─bin/
  │ ├─config/
  │ ├─logs/
  │ ├─plugins/
  │ ├─src/
  │ │ ├─Console/
  │ │ ├─Controller/
  │ │ │ └─Component/
  │ │ ├─Model/
  │ │ │ ├─Behavior/
  │ │ │ ├─Entity/
  │ │ │ └─Table/
  │ │ ├─Shell/
  │ │ ├─Template/
  │ │ └─View/
  │ │   └─Helper/
  │ ├─tests/
  │ │ ├─Fixture/
  │ │ └─TestCase/
  │ ├─tmp/
  │ ├─vendor/
  │ ├─webroot/ (DocumentRoot)
  │ │ ├─css/
  │ │ ├─img/
  │ │ └─js/
  │ ├─.gitattributes
  │ ├─.gitignore
  │ ├─.htaccess
  │ ├─composer.json
  │ ├─composer.lock
  │ └─index.php
  ├─composer.phar
  └─README.md
```

この状態でドキュメントルートである`webroot`(`http://localhost/%PROJECT_NAME%/%APP_NAME%/`)へアクセスし、正常に**Get the Ovens Ready**画面が表示されればインストールは完了です。(初期状態では`.htaccess`により`webroot`へのRewriteがかかっています。)
ローカルのドキュメントルートにバーチャルホストを設定するなどはお好みで。
テストサーバーや本番サーバーではドキュメントルートにドメインを割り当てましょう。

### 初期状態コミット前の調整

あわせて、CakePHP3の初期状態をコミットする前に`.gitignore`の調整を行います。
環境設定ファイル`/config/app.php`はコミットから除外するようになっていますが、共有させておきたい設定などもあると思います。(言語設定やセッションの保存方法、ログの管理など…)
その場合は`/config/app.default.php`にも同じ設定を施しておけばよいでしょう。

```diff:~/Sites/%PROJECT_NAME%/%APP_NAME%/.gitignore
+ # Ignore files #
+ ################
  /vendor/*
  /config/app.php
+ /config/Migrations/*.lock
  /tmp/*
  /logs/*
+ 
+ # Unignore files #
+ ##################
+ !empty
+ 
+ # Cache files #
+ ###############
+ .sass-cache
+ .codekit-cache
+ 
+ # Configuration files #
+ #######################
+ *.sublime-project
+ *.sublime-workspace
+ config.rb
+ config.codekit
+ .idea
+ 
+ # OS generated files #
+ ######################
+ .DS_Store
+ .DS_Store?
+ ._*
+ .Spotlight-V100
+ .Trashes
+ Icon?
+ ehthumbs.db
+ Thumbs.db
```

上記の**Unignore files**の設定を正しく認識させるには`Git`の`v2.7`以降を利用してください。
参照: [Git 2.7 で .gitignore が便利になっている](http://www.tam-tam.co.jp/tipsnote/program/post8318.html)

また、フォントファイル等のバイナリファイルがリポジトリ管理下に置かれた場合に、Gitがバイナリ内改行コードを書き換えてファイルが破損してしまう問題があります。
これを回避するため、あらかじめフォントファイルはバイナリファイルであると正しく認識するように調整しなければいけません。
参照: [アイコンフォントをgit管理するとファイルが破損するときの対応方法](http://jmatsuzaki.com/archives/18371)

CakePHP3もインストール時点で`.gitattribute`の設定はされていますが、フォントファイルの設定は抜けているので追加しておきます。

```diff:~/Sites/%PROJECT_NAME%/%APP_NAME%/.gitattributes
  # Denote all files that are truly binary and should not be modified.
  *.png binary
  *.jpg binary
  *.gif binary
  *.ico binary
  *.mo binary
  *.pdf binary
  *.phar binary
+ *.otf binary
+ *.eot binary
+ *.svg binary
+ *.ttf binary
+ *.woff binary
```

ここまで終了したら、リポジトリにコミットしてリモートリポジトリへプッシュしておきましょう。
リモートリポジトリへのプッシュが完了した段階で、セットアップ編は完了になります。


# クローン編

セットアップ編の手順で作成されたリモートリポジトリから、別の環境でクローンしてから開発に入るための準備をするための手順になります。

## リポジトリのクローン

まずは、リモートリポジトリからプロジェクトをクローンします。

> `cd ~/Sites/`
> `git clone %REMOTE_REPOSITORY_URL%`

```shell-session:実行結果
Cloning into '%PROJECT_NAME%'...
remote: Counting objects: xxx, done.
remote: Total xxx (delta xxx), reused xxx (delta xxx)
Receiving objects: 100% (xxx/xxx), done.
Checking connectivity... done.
```

## クローン後のセットアップ

クローンが完了したら、`composer.json`のあるディレクトリに移動してComposerを実行します。

> `cd ~/Sites/%PROJECT_NAME%/%APP_NAME%/` (`composer.json`のあるディレクトリ)
> `php ../composer.phar install`

`composer.json`の記述通りにプロジェクトがセットアップされ、クローンした環境で実行できるようになります。
セットアップ後、`webroot`(`http://localhost/%PROJECT_NAME%/%APP_NAME%/`)へアクセスし、正常に**Get the Ovens Ready**画面が表示されればクローン環境でのセットアップは完了です。


# アレンジ

上記の準備手順は一例に過ぎません。
上記のように`%PROJECT_NAME%`ディレクトリの一段下に`%APP_NAME%`ディレクトリを持ってくるのが苦手なひともいると思うので、その場合は`Sites`ディレクトリに汎用的に使うComposerを入れておくか、そもそもグローバルComposerをインストールしておいて、そこから`%APP_NAME%`でCakePHP3をインストールし、そのままプロジェクトとしてGitリポジトリ管理する場合も考えられます。
自分に合った管理方法を模索してみてください。


# まとめ

CakePHP3はComposerの恩恵をかなり受けているので、パッケージ管理のしやすさもプロジェクトの共有も格段によくなっており、非常に使い勝手がよいです。
事実、実務に導入してからCakePHP2時代より遥かに仕事がしやすいように感じます。

ただし、セットアップに関してはやはり黒い画面をメインに作業することになるので、プロジェクトにコーダーさんやデザイナーさんなど黒い画面が苦手な人が加わる前にプロジェクトの管理者が`README.md`などの手順の資料を出来るだけ用意しておくと良いように思います。
また、コーダーさんがフォントデータが追加されたときにGitのバイナリバグが発生すると後々大変なので、その辺りも先んじて設定しておくのもお忘れなく。(経験談)