Windows OS 上で SPA を開発していてのお話。
先日、しばらく前に構築した、とある Web アプリ (SPA) プロジェクトを保守する必要が出てきた。
久しぶりに当該プロジェクトをリモートリポジトリからローカル開発環境に git clone し、とりあえず npm install を実行したところ、いきなりエラーになってしまった。
npm ERR! Exit status 1
npm ERR!
どうやら、SaSS を CSS へ変換する Node.js 用ライブラリ node-sass のパッケージインストールでこけたっぽい。
使用している node-sass のバージョンは
v.4.7.2
。
開発当時はちゃんとクリーンビルド成功してたのに、なんで?
Node.js のバージョンが当時と今とで違う
当該プロジェクトの開発当時と、今回とで環境で変っていたのは Node.js のバージョンだった。
開発当時、インストールされていたのは、たしか
Node.js の v.8 系
。
現在は
Node.js を v.10.15.3
にアップデートしたあとの環境である。
どうも、この Node.js のバージョン違いが、開発当時は問題なくて、現在だと npm install できなくなる原因らしい。
さて、この npm install できなくなる問題をどうにかしないと、本題の保守作業に入ることもままならない。
どうしたものか。
Python や C/C++ の環境が必要?
インターネット検索した感じだと、どうやら、node-sass のバイナリビルドのために、Python 2.x や C/C++ の環境が必要らしい。
で、macOS や Linux 系列だと、だいたい Python や gcc 入ってたりするので、すんなり node-sass のバイナリビルドが済んでしまう模様 (あくまでもネットで聞きかじった情報であるが)。
ところが Windows OS ではそのあたりでひっかかって、node-sass のバイナリビルドができずに npm install がコケて終わり、となるらしい。
たしかに自分の場合も、それっぽいログが表示されていた。
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
gyp ERR! stack at PythonFinder.failNoPython (C:\Work\app1\node_modules\node-gyp\lib\configure.js:484:19)
gyp ERR! stack at PythonFinder.<anonymous> (C:\Work\app1\node_modules\node-gyp\lib\configure.js:509:16)
gyp ERR! stack at C:\Work\app1\node_modules\graceful-fs\polyfills.js:282:31
このような場合の定番の解決方法は、「npm install --global windows-build-tools」を実行して、Windows OS 上でもそれらビルドに必要な環境を npm でインストールしてしまえばよいようだ。
でもちょっと待て欲しい。
開発当時は、
そのようなビルドツールが未インストールでも、すんなり npm install できていた
のだ。
なんでだろう?
ビルド済みバイナリが GitHub 上にある!
いろいろ調べていくうちにだんだんとわかってきた。
まず、node-sass の Node パッケージスクリプトは、常にはバイナリビルドを実行しようとはしない。
まずは node-sass の GitHub リポジトリに登録されている、ビルド済みバイナリのダウンロードを試みるようだ。
そして、ダウンロードしようとしている node-sass のビルド済みバイナリのファイル名の末尾には、対応している Node.js 実行環境の "モジュールバージョン" が含まれていた。
具体的には、Windows OS 用バイナリの場合、
「win32-x64-
{ここにモジュールバージョン}
_binding.node」
というファイル名になる。
node-sass の GitHub リポジトリで調べてみると、node-sass v.4.7.2 のビルド済みバイナリは、
モジュールバージョン 57 まで
登録がある。
しかし今回の開発環境 Node.js v.10.15.3 の
モジュールバージョンは 64
であった。
ということで、node-sass の GitHub リポジトリには登録のない、
"v.4.7.2 で、且つモジュールバージョンが 64"
であるビルド済みバイナリのダウンロードを試みて失敗 (HTTP 404 Not Found) となっていたようだ。
(下記はその証拠の npm install ログ表示。)
> node scripts/install.js
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.7.2/win32-x64-64_binding.node
Cannot download "https://github.com/sass/node-sass/releases/download/v4.7.2/win32-x64-64_binding.node":
HTTP error 404 Not Found
なお、node-sass の Node パッケージスクリプトは次なる手段としてローカル環境でのバイナリビルドを開始する。
だがしかし自分の環境ではビルド用のツールの整備がなっていないので、これもコケてしまい結局エラーで終了、ということだったらしい。
さて、改めて node-sass の GitHub リポジトリの Release ページを見てみると、ちゃんとビルド済みバイナリが用意済みの、対応されている Node.js バージョンが明記されている。
これを頼りに今回は node-sass v.4.9.0 以降を使用するよう packages.json を更新した。
その結果、自分のローカル環境にビルドツール類をインストールすることなく、無事 npm install が成功するようになった。
まとめ
ということで、Windows OS 上で、必ずしも windows-build-tools Node パッケージの利用をはじめビルドツールの整備をしなくても、node-sass のバージョンを適切にアップデートしていけば、すんなり npm install を通すことはできる、という話。
なお、Node.js のいつのバージョンからかよく覚えていないが、最近の Node.js Windows 版のインストーラーでは、ビルドツールも一緒にインストールするかどうかの選択肢が出てきてるっぽい。
この選択肢を有効にして Node.js をインストールしてある環境ならば、このような node-sass を npm install できない問題は起きないのだろうか。
検証したことはないが、気になるところである。
Node.js
node-sass
みんなのNode.jsをまとめ読み