我在 Google Cloud Function(Node v10(中遇到了原生模块依赖项(特别是 IBM MQ for js(的问题,并且在任何地方都没有找到我需要的信息,所以我打开了这个问题并回答了自己,以便其他人将来找到它。
它在 Node v8 引擎中运行良好,但现在已弃用。将引擎升级到 v10 并提升一些软件包后(遵循有关我的依赖项的所有迁移指南(,ffi-napi 软件包在yarn install
期间会引发异常,如下所示:
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: ...s status = napi_get_instance_data(env, &d);
^~~~~~~~~~~~~~~~~~~~~~
../src/ffi.cc:11:24: note: suggested alternative: 'napi_new_instance'
napi_status status = napi_get_instance_data(env, &d);
^~~~~~~~~~~~~~~~~~~~~~
napi_new_instance
../src/ffi.cc: In function 'Napi::Object BindingHook(Napi::Env, Napi::Object)':
../src/ffi.cc:347:24: error: 'napi_set_instance_data' was not declared in this scope
napi_status status = napi_set_instance_data(
^~~~~~~~~~~~~~~~~~~~~~
../src/ffi.cc:347:24: note: suggested alternative: 'napi_new_instance'
napi_status status = napi_set_instance_data(
^~~~~~~~~~~~~~~~~~~~~~
napi_new_instance
In file included from ../src/ffi.cc:3:0:
../src/ffi.h: At global scope:
../src/ffi.h:148:19: warning: mangled name for 'Napi::TypedArray FFI::WrapPointer(Napi::Env, T*, size_t) [with T = char*() throw ()]' will change in C++17 because the exception specification is part of a function type [-Wnoexcept-type]
inline TypedArray WrapPointer(Env env, T* ptr, size_t length = 0) {
^~~~~~~~~~~
../src/ffi.h:148:19: warning: mangled name for 'Napi::TypedArray FFI::WrapPointer(Napi::Env, T*, size_t) [with T = void*(void*, const char*) throw ()]' will change in C++17 because the exception specification is part of a function type [-Wnoexcept-type]
../src/ffi.h:148:19: warning: mangled name for 'Napi::TypedArray FFI::WrapPointer(Napi::Env, T*, size_t) [with T = int(void*) throw ()]' will change in C++17 because the exception specification is part of a function type [-Wnoexcept-type]
../src/ffi.h:148:19: warning: mangled name for 'Napi::TypedArray FFI::WrapPointer(Napi::Env, T*, size_t) [with T = void*(const char*, int) throw ()]' will change in C++17 because the exception specification is part of a function type [-Wnoexcept-type]
make: *** [Release/obj.target/ffi_bindings/src/ffi.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:191:23)
gyp ERR! stack at ChildProcess.emit (events.js:198:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
gyp ERR! System Linux 5.3.0-1020-gcp
gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /workspace/node_modules/ffi-napi
gyp ERR! node -v v10.19.0
gyp ERR! node-gyp -v v5.0.5
gyp ERR! not ok
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! ffi-napi@3.0.1 install: `node-gyp-build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the ffi-napi@3.0.1 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /builder/home/.npm/_logs/2020-06-12T17_47_25_766Z-debug.log; Error ID: c4475859
它在本地(OSX Catalina节点10.21(和Docker(在基于高山的节点10和12主要标签中测试(中都可以正常工作。
TLDR:尚不支持。
我刚刚发现 IBM MQ 包依赖项(特别是 ffi-napi(的一些所需的本机 API 是在Node v10.20
中引入的(napi_get_instance_data
在 v10.20.0 中添加的(,但 Google Cloud Functions 基于Node v10.18.1
。
到目前为止,我发现的唯一解决方法是使用纱线分辨率或自定义分叉将ffi-napi
降级为v2.4.7
。没有关于云函数引擎中 Node v10.20 的预期版本的公开信息。