composer で Laravelをダウンロードしようとしたら詰まった話 @ CentOS7

composer を利用して Laravelをインストールしようとしたら盛大に詰まったので、解決方法を記載しておきます。

私の環境とバージョンは下記の通りです。

```bash
[hoge@hoge ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[hoge@hoge ~]# php -v
PHP 7.2.14 (cli) (built: Jan  8 2019 14:05:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```

# Composerの導入

ここら辺は公式ドキュメントを参照しつつ、問題なく進んだ。
https://getcomposer.org/download/

composer-setup.phpを引っ張ってくる

```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```
`-r`コマンドはスクリプトタグ`<?..?>`なしにPHPを実行(run)してくれるオプション。
`copy`関数の定義は`copy([コピー元], [コピー先])`。
http://php.net/manual/ja/function.copy.php


```bash
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
```

`48e3236262b...`というのはcomposer-setup.phpのハッシュ値のようです。これで、ファイルの確からしさを確認しているんですね。
詳しくはこちらに書いてあります。
https://composer.github.io/pubkeys.html

あとは、

```bash
php composer-setup.php
```

実行したのちに

```bash
php -r "unlink('composer-setup.php');"
```

削除したらひと段落です。
cf) unlink() http://php.net/manual/ja/function.unlink.php

`composer.phar`ファイルが生成されるので、どのユーザーもcomposerを利用できるように場所を移動します。

pharはPHP Archive  File の略で、複数の処理を１つのファイルにまとめたもの、だそうです。
https://www.weblio.jp/content/Phar

```
mv composer.phar /usr/local/bin/composer
composer
```

`composer`コマンドを叩いて、なんか色々出てきたら成功です。

## Laravelをインストールしようとすると...

ここからが長かった。

`composer global require "laravel/installer"`
を叩いてみる。

すると...

```bash
[hoge@hoge ~]# sudo composer global require "laravel/installer"
Changed current directory to /root/.config/composer
Using version ^2.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v2.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v2.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^2.0 -> satisfiable by laravel/installer[v2.0.0, v2.0.1].

  To enable extensions, verify that they are enabled in your .ini files:
    - /etc/php.ini
    - /etc/php.d/20-bz2.ini
    - /etc/php.d/20-calendar.ini
    - /etc/php.d/20-ctype.ini
    - /etc/php.d/20-curl.ini
    - /etc/php.d/20-exif.ini
    - /etc/php.d/20-fileinfo.ini
    - /etc/php.d/20-ftp.ini
    - /etc/php.d/20-gettext.ini
    - /etc/php.d/20-iconv.ini
    - /etc/php.d/20-json.ini
    - /etc/php.d/20-mysqlnd.ini
    - /etc/php.d/20-pdo.ini
    - /etc/php.d/20-phar.ini
    - /etc/php.d/20-sockets.ini
    - /etc/php.d/20-sqlite3.ini
    - /etc/php.d/20-tokenizer.ini
    - /etc/php.d/30-mysqli.ini
    - /etc/php.d/30-pdo_mysql.ini
    - /etc/php.d/30-pdo_sqlite.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

```

どうやら zip が開けないと言われているようだ。
確認してみる。

```bash
[hoge@hoge ~]# php --ri zip
Extension 'zip' not present.
```
...確かにない。
ちなみに、`--ri`はエクステンションの構成を表示してくれるオプションだ。
cf) https://teratail.com/questions/121649

## 試行錯誤した結果

私の場合、対応しなければならない問題が3つあった。
先に入力したコマンドを書いちゃいます。

```bash
[hoge@hoge ~]# sudo yum install --enablerepo=remi,remi-php72 php-pecl-zip
```

私はこれでうまく認識されるようになりました。

```bash
[hoge@hoge ~]# php --ri zip

zip

Zip => enabled
Zip version => 1.15.4
Libzip headers version => 1.5.1
Libzip library version => 1.5.1
```

以下、必要だったことと詰まったポイント。

### 1. `php-pecl-zip`のインストール

実は、zipファイルを使えるようにしようと`yum install php-zip`を叩いてみたが、エラーが解消されなかったのだ。

情報を探し回った結果、以下のStack Overflowを発見。
https://stackoverflow.com/questions/46058457/cant-install-laravel-installer-via-composer

>On centos 7 I have used:
>
>`yum install php-pecl-zip`
>because any other solution didn't work for me.

`pecl`を知らなかったのだが、PHP Extention Community Libraryのことで、PHPの拡張ライブラリを提供してくれているサービスらしい。
https://ja.wikipedia.org/wiki/PECL

なぜ`php-zip`ではダメだったのかの謎が解明していないので少しもやもやする。


### 2. `remi`を利用してインストールしなければならない

これが詰まりポイント２つ目。
私の環境下では`yum install php-pecl zip`だけでは不十分でした。

というのも、以前にCentOSのPHP環境を構築した際に、PHP7.2をインストールしてくるために、`remi`を利用していたのです。だからオプションをつける必要があったみたい。

ここらへん、自分の中でも曖昧だったので、せっかくの機会なので、`remi`について調べておきました。

https://akamist.com/blog/archives/648
こちらの記事が大変わかりやすいです。

remiとはRemiさんが管理しているリポジトリの1種です。centOSでは`yum`コマンドを利用してインストールを行いますが、`yum`が参照するパッケージのインストール元のことです。

記事にあるように、`yum repolist`コマンドを叩いてみましょう。

```bash
[hoge@hoge ~]# yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
...
リポジトリー ID           リポジトリー名                                          状態
base/7/x86_64             CentOS-7 - Base                                         10,019
epel/x86_64               Extra Packages for Enterprise Linux 7 - x86_64          12,900
extras/7/x86_64           CentOS-7 - Extras                                          322
...
remi-safe                 Safe Remi's RPM repository for Enterprise Linux 7 - x86  3,142
updates/7/x86_64          CentOS-7 - Updates                                       1,057
```

`remi ...` というコマンドを打った覚えのあるひとは、`remi-safe`がいるはずです。

しかし、`yum`はデフォルトではremiリポジトリを参照してくれません。何故ならば、remiリポジトリは

```bash
yum -y install epel-release
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

のコマンドを使って**後から追加された外部のリポジトリ**という扱いになるためです。

なので、

```
--enablerepo=remi,remi-php72
```

こいつをオプションとして書き加えてあげる必要があるわけです。repoはリポジトリ(Repository)の略だったんですね！

### 3.`unzip`コマンドのインストール

私はこれでもう一回怒られました笑

```bash
As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.
This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost.
Installing 'unzip' may remediate them.
```

該当する人はこっそり入れておいてあげてください。これはphpとは無関係なので`remi`オプションは不要です。

```bash
[hoge@hoge ~]# yum install unzip -y
```

---
以上でとりあえずLaravelをインストールするまでの"前段階"が終わりました。。。
(VPSでやろうとするんじゃなかった)

また詰まりポイントが出てきたらシェアしようと思います！

ちなみに、`yum`は
**Yellowdog Updater Modified**
の略らしいですよ。

---
# 追記

後の工程でここら辺も必要になりました！

```bash
yum install --enablerepo=remi,remi-php72 php-devel php-mbstring php-pdo php-gd php-xml
```