Yarnを導入しました!
こんにちは、エンジニアの井戸田です。
弊社が運用しているmamanokoはRuby on Railsで実装しております。
以前まではnpmを使用していたのですが、先日Yarnに移行しました。
今回はYarnのメリットやnpmからYarnへの移行方法をDockerおよびDocker Composeを使用して書いていきます。
Yarnの特徴
厳密にバージョンを固定
Yarnの場合パッケージのインストール時にデフォルトで yarn.lock
というファイルが生成されます。これによって複数人の開発時でも同じパッケージがインストールされるので、バージョンの違いで1人だけエラーが出るということが無くなります。
この機能はnpm v4までの shrinkwrap
にあたります。ただ shrinkwrap
の場合、package.json
に手動でパッケージを追加後、それを削除すると追従することが出来ずエラーが発生し、結局 npm-shrinkwrap.json
を削除して再インストールするなどの問題が発生していたようです。Yarnの場合そのようにnpmで悩んでいた依存性の問題も解決しております。
ただこの前リリースされたnpm v5ではバージョンを固定するようになったようです。
高速なインストール
npmの場合直列で1つ1つのパッケージをインストールしていたのに対して、Yarnの場合は並列でパッケージのインストールをしています。これにより高速にインストールすることができます。
また一度インストールするとキャッシュするので2回目以降のインストールはオフラインでも可能になります。
下記のURLを見てみると、スピードは Yarn > npm v5 > npm v4 の順に速いみたいです。npm v5でスピードが改善されたようですが、Yarnの方がまだまだ高速です。
よりセキュアに
パッケージのインストール前にチェックサムで整合性を確認しており、誤りがないかをチェックできるため信頼性が高まります。
本番運用するにあたって
弊社で運用しているmamanokoは、これまで本番環境にはAWSのEC2を使用していましたが、今年の3月にAWSのECS+EC2によるDockerでのサーバー運用にインフラを全面移行しました。
開発環境もDocker及びDocker Composeで管理しており、本番環境との差異が以前に比べて格段に減りました。 またDockerfileとyamlで管理することにより、移行にあたって今までサーバーの中に入って作業しなければいけなかったのが、常にコードでインフラ環境を管理するようになりラクになりました。
導入方法
Docker Hubで配布されているnodeのコンテナを利用していきます。
https://hub.docker.com/_/node/
nodeコンテナのv8.1のコードを見てみるとYarnをインストールする記述があります。なのでDockerファイルにYarnをインストールするコードを書かなくても、すぐに使用することが出来ます。
ちなみにnpmをインストールする記述もあるのですぐに利用可能です。
# ~~~~~ ENV YARN_VERSION 0.24.6 RUN set -ex \ && for key in \ 6A010C5166006599AA17F08146C2130DFD2497F5 \ ; do \ gpg --keyserver pgp.mit.edu --recv-keys "$key" || \ gpg --keyserver keyserver.pgp.com --recv-keys "$key" || \ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" ; \ done \ && curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ && curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ && mkdir -p /opt/yarn \ && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/yarn --strip-components=1 \ && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \ && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarnpkg \ && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz # ~~~~~
https://github.com/nodejs/docker-node/blob/31cfb8b96b69351b3552592dd1e2d62e73a5c5b9/8.1/Dockerfile
Dockerfileを作成して必要なコードを記述していきます。
docker/node/Dockerfile
# node v8.1のイメージを指定 FROM node:8.1 # コンテナに `/var/www/client/node_modules` ディレクトリを作成 RUN mkdir -p /var/www/client/node_modules # `./client` を `/var/www/client` にコピー # `./client/` はcss, javascriptなどasset部分の必要なファイルが入っているディレクトリ COPY ./client/ /var/www/client/ # `/var/www/client` に移動 WORKDIR /var/www/client/ # `/var/www/client/package.json` を元に'Yarnを使用してインストール RUN yarn install # ローカルで配信するためのコード、本番にrelaseするためのコードなどを書いていく
npmとYarnでは、コマンドが少しずつ変わっているので注意が必要です。
下記のnpmとYarnのコマンドを比較した表を参考にしてみてください。
npm | Yarn |
---|---|
npm install | yarn install |
(N/A) | yarn install –flat |
(N/A) | yarn install –har |
(N/A) | yarn install –no-lockfile |
(N/A) | yarn install –pure-lockfile |
npm install [package] | (N/A) |
npm install –save [package] | yarn add [package] |
npm install –save-dev [package] | yarn add [package] [–dev/-D] |
(N/A) | yarn add [package] [–peer/-P] |
npm install –save-optional [package] | yarn add [package] [–optional/-O] |
npm install –save-exact [package] | yarn add [package] [–exact/-E] |
(N/A) | yarn add [package] [–tilde/-T] |
npm install –global [package] | yarn global add [package] |
npm update –global | yarn global upgrade |
npm rebuild | yarn install –force |
npm uninstall [package] | (N/A) |
npm uninstall –save [package] | yarn remove [package] |
npm uninstall –save-dev [package] | yarn remove [package] |
npm uninstall –save-optional [package] | yarn remove [package] |
npm cache clean | yarn cache clean |
rm -rf node_modules && npm install | yarn upgrade |
まとめ
Yarnの特徴、移行についてをまとめてみました。
npmからYarnの移行に関して、npmのコマンドをYarnのコマンドに変更するだけで済んだのでとても手軽に出来ました。
またnpm v5からはYarnのlockファイルなどを取り入れており、Yarnもnpmもこれから発展していきそうです。
We’re hiring!!
Cluexではエンジニアサイド、ビジネスサイド共にメンバーを募集しています! お気軽にご連絡下さいませ!エンジニアの方、ぜひ情報交換しましょう!