起きた問題
MacBook ProのメンテナンスのついでにNode.jsのバージョンアップを行ったところ、旧環境で実行できていたgulpが下記のようにクラッシュして正常に動作しなくなってしまいました。
gulp[28017]: ../src/node_contextify.cc:631:static void node::contextify::ContextifyScript::New(const FunctionCallbackInfo<v8::Value> &): Assertion `args[1]->IsString()' failed.
1: node::Abort() [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
2: node::InternalCallbackScope::~InternalCallbackScope() [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
3: node::contextify::ContextifyScript::New(v8::FunctionCallbackInfo<v8::Value> const&) [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
4: v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo*) [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
5: v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<true>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
6: v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) [/Users/yokokoujiyoshihito/.nodebrew/current/bin/node]
7: 0x8ad5688427d
8: 0x8ad5688f755
9: 0x8ad5690bc20
10: 0x8ad568944f7
11: 0x8ad568944f7
Abort trap: 6
環境
- macOS High Sierra 10.13.4
- node.js 10.0.0
- nodebrew 8.9.4
- npm 6.0.1
- gulp 3.9.1
解決
プロジェクトフォルダ内のnode_modulesフォルダとpackage-lock.jsonを削除してから、npm install
を実行します。
原因
不用意にOSのバージョンを上げたりnodeのバージョンを上げてしまったことが問題かと考え、旧環境に戻すことを検討していましたが、
(※幸いiMacも並行使用していたため、同一環境は残っていました。)
調べてみると下記のようにGitでも問題が上がっていました。
- Native crash in Node 10
https://github.com/gulpjs/gulp/issues/2162 - node asserts in node_contextify.cc:631 Assertion `args[1]->IsString()' failed
https://github.com/nodejs/node/issues/20325
上段のページのコメントに答えがありました。
Find natives@^1.1.0 in your lock file
Change it to natives@^1.1.3
nativesのバージョンが古いことが原因でした。
package-lock.jsonを新旧で比較してみたところ、
"natives": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
"integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==",
"dev": true
},
"natives": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz",
"integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==",
"dev": true
},
このようにバージョンが上がっていました。
これを見つけるために時間がかかりましたが、無事解決してgulpも起動するようになりました。
未解決
gulpのクラッシュは解決しましたが、原因を探る過程で下記のような相違点が見つかりました。
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"dev": true,
"requires": {
"natives": "^1.1.3"
}
}
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"dev": true,
"requires": {
"natives": "^1.1.0"
}
}
nativesの推奨バージョンが新旧で異なっています。
今のところ全体は問題なく動いていますので、別の機会に探ってみたいと思います。
補足
Dropboxでプロジェクトフォルダをそのまま同期して複数台で環境を共有しているため、旧環境を引き継ぐことを優先していました。
とはいえ、スッキリと新しい環境にしたかったこともあり削除 → 再インストールを試しましたが、原因を探ってみることで仕組みも理解できてきたので、エラーから学ぶことも多いと実感しています。