スマレジエンジニアyushiのブログ

スマレジエンジニアのブログ

Composerを高速化する

こんにちは、株式会社スマレジのエンジニアのyushiです。

アクタージュの最新刊が発売されていたので早速読みました。

2020/07/15まで1巻の丸々試し読みができるようなので、未読の方はぜひに。

さて、今回は技術系記事です。

課題

Composerが遅い!

Composer(https://getcomposer.org/)といえばPHPのパッケージマネージャーで、Laravelを使った開発においても必須の仕組みとなります。

しかし、Laravelのプロジェクト生成コマンドを実行しても、10分経っても終わらないわけです。

composer create-project --prefer-dist laravel/laravel [ProjectName]

Dockerを利用している影響も大きそうです。正確なコマンドはこれ。

docker run --rm \
    --volume $(PWD):/app \
    composer:latest create-project --prefer-dist laravel/laravel [ProjectName]

composer:latestイメージの/appにCurrent Directoryをマウントしてcreate-projectを実行することで、 Docker上のComposerを利用してホストPCにLaravelプロジェクトを生成しています。

本記事では、この改善に取り組みます。 本当は別の内容の記事を書こうとしてたけど、プロジェクト生成が遅すぎて挫折した。

改善策1 cached configuration

DockerのVolumesを使っていると速度に影響が出るようです。しかし、これを改善する設定があります。cachedです。

docs.docker.com

ホスト->コンテナ内の更新の反映を遅延させる(即時に反映させない)ことによって高速化するようです。 その分発生する非一貫性は、composerの用途を考えると影響は少なそうです。

docker run --rm \
    --volume $(PWD):/app:cached \
    composer:latest create-project --prefer-dist laravel/laravel [ProjectName]

しかし思ったより速くならず...。

改善策2 packagist.jpの利用

-vvvオプションで様子を見てみます。

docker run --rm \
    --volume $(PWD):/app:cached \
    composer:latest create-project --prefer-dist laravel/laravel [ProjectName] -vvv

どうも依存ライブラリのダウンロードに時間がかかっているようです。

調べてみると、個人的に日本にミラーサイトを作ってくださっている方がいるそうです。

packagist.jp

blog.tojiru.net

こちらを利用してみます。個人管理とのことですが、Dockerなら簡単にオリジナルのサイトへの参照に戻せるし、大丈夫かな。

docker run --rm \
    --volume $(PWD):/app:cached \
    composer:latest sh -c "composer config -g repos.packagist composer https://packagist.jp \
  && composer create-project --prefer-dist laravel/laravel=6.x backend -vvv"

これで、数倍速くなりました! 僕の環境だと5分かからずに終わります。

コマンドはちょっと汚いけど、もう少し綺麗に書けないかな...。

composer create-project--repositoryオプションでミラーサイトのURLを指定する方法も試したんですが、 続いて実行されるcomposer isntallでは本家サイト(packagist.org)が利用されてしまったので、composer configを利用しています。

まとめ

初めてブログ記事にソースコードを埋め込みましたが、「見たまま」モードではできないんですね...。 エンジニア的にはMarkdownは慣れているのでこちらを使いました。

あと、プレビューへの切り替えが遅いのが少し難点。Qiitaみたいに同時表示してくれないかな?