複数人数で開発を進める時に、開発環境を揃えるというのはとても大事なことです。同じコードを見ていても環境要因で話が通じない、なんてこともよくあることです。
旅するエンジニアの三宅です。来年の3月に1ヶ月ほど台湾に行っていこうと思っています。
TimeCrowdではクライアントサイドでReactを使用しており、それらに付随する開発ライブラリ群はpackage.jsonで管理されています。npmのv5からはpackage-lock.jsonというファイルが作られるようになり、依存関係が固定され一元管理されるようになりました。
TimeCrowdの開発でもこの機能ができるようにしたいのですが、package-lock.jsonがあってもnpmのバージョンが古いと意味がありません。
そこでnpmのバージョンを強制できるようにしてみることにします。
想定する挙動
まずはどのようなフローにするのか考えてみたいと思います。
- リポジトリをクローン
- リポジトリ内でnpm install
- npmのバージョンが5.0.0以上ならインストール
- npmのバージョンが5.0.0より低ければ警告してインストールを中断
やりたいことは至ってシンプルで、特に難しい処理はありません。
実装
npmにはnpm-scriptsという機能があり、それぞれのアクションをフックして前処理、後処理など色々なことができるようです。
https://docs.npmjs.com/misc/scripts
今回はインストール前に処理を挿入したいのでpreinstallを使って実現しようと思います。
まずは試しにpreinstallでバージョン情報を表示してみましょう。
以下の設定をpackage.jsonのscriptセクションに追加してnpm installすると、現在しているnpmのバージョン情報が表示されてからインストールが始まるはずです。
"preinstall": "npm -v | xargs echo",
バージョンチェックの処理を直にpackage.jsonに書けるのですが、今回はシェルスクリプトを書いて、npm installの前に実行させる形にしました。
以下のスクリプトをpreinstallに設定するとnpmのバージョンが5より低い場合には警告メッセージを表示して処理を終了します。
#!/bin/sh
NPM_MAJOR_VERSION=`npm -v | cut -c 1` # 1
if [ $NPM_MAJOR_VERSION -lt 5 ]; then # 2
printf "npm \033[31mERR!\033[0m You must update npm. We needs greater than 5.0.0 version.\n" # 3
exit 1 # 4
fi
特に難しい処理はしていません。
簡単に説明すると以下のような流れになっています。
- npmのメジャーバージョンを設定
- メジャーバージョンが5より低い
- npmのv5以上を使うよう警告
- エラー終了
ちなみにechoではなくprintfを使っているのは、echoの出力に色を付けようとしてうまくいかずに調べたら、どうやらPOSIX的にはechoは環境依存激しいからやめろよっていう雰囲気らしいのでprintfを使っています。
Mac の echo に色がつかない・・・ – Qiita(コメント欄参照)
まとめ
元々持っていない機能だとしても、既に存在している機能を組み合わせることで実現できることは意外とたくさんあります。
必要なら何でも自分で作ってしまうことができるというのはプログラミングの醍醐味です。
必要なもので今無いものなら全て作ってしまえ、というエンジニアをTimeCrowdでは募集しています。興味があればぜひ応募してみて下さい。