在寻找无服务器的 npm 重建上不一致的 ENOENT
Inconsistent ENOENT on npm rebuild looking for serverless
上下文
我有一个 Lambda 函数,它使用需要编译为 运行 的本机节点模块 (node-snowball)。因为我正在运行宁 macOS 运行 在我本地 machine 上编译的代码不会 运行 在 AWS Lambda 的亚马逊 Linux环境。出于这个原因,我正在使用 Docker 和 lambci/lambda:build-nodejs8.10
IMAGE 编译成代码,这些代码将 运行 在 Lambda 上,然后我通过无服务器部署。
问题
在我的项目目录中安装了 mac 节点模块,我 运行 容器使用以下命令。
# To compile native deps in node_modules (runs `npm rebuild`)
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10
9/10 次编译步骤成功完成,但随后在 node postinstall
步骤中出错并出现 ENOENT
错误寻找无服务器(下面的完整输出)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
npm ERR! path /var/task/node_modules/serverless/bin/serverless
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall chmod
npm ERR! enoent ENOENT: no such file or directory, chmod '/var/task/node_modules/serverless/bin/serverless'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2019-02-21T11_46_54_327Z-debug.log
但是在我的项目目录中我可以看到无服务器文件在那里。
my-app-directory/
|__node_modules/
|__serverless/
|__bin/
|__serverless
更令人困惑的是,1/10 次操作将成功完成而不会抛出任何错误(输出如下)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
> serverless@1.37.1 postinstall /var/task/node_modules/serverless
> node ./scripts/postinstall.js
aws-sdk@2.404.0 /var/task/node_modules/aws-sdk
...
serverless@1.37.1 /var/task/node_modules/serverless
async@1.5.2 /var/task/node_modules/serverless/node_modules/async
raven@1.2.1 /var/task/node_modules/raven
uuid@3.0.0 /var/task/node_modules/raven/node_modules/uuid
uuid@2.0.3 /var/task/node_modules/serverless/node_modules/uuid
是什么导致了这种不一致的行为,我该如何解决?
无服务器删除自动完成 (tabtab) 依赖项之前的一个解决方案是 运行 您的 docker 命令仅重建需要它的模块,而不是默认重建所有模块。
所以在你的情况下,如果你只需要重建节点雪球,你可以使用这个命令
# only rebuild node-snowball
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10 npm rebuild node-snowball
上下文
我有一个 Lambda 函数,它使用需要编译为 运行 的本机节点模块 (node-snowball)。因为我正在运行宁 macOS 运行 在我本地 machine 上编译的代码不会 运行 在 AWS Lambda 的亚马逊 Linux环境。出于这个原因,我正在使用 Docker 和 lambci/lambda:build-nodejs8.10
IMAGE 编译成代码,这些代码将 运行 在 Lambda 上,然后我通过无服务器部署。
问题
在我的项目目录中安装了 mac 节点模块,我 运行 容器使用以下命令。
# To compile native deps in node_modules (runs `npm rebuild`)
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10
9/10 次编译步骤成功完成,但随后在 node postinstall
步骤中出错并出现 ENOENT
错误寻找无服务器(下面的完整输出)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
npm ERR! path /var/task/node_modules/serverless/bin/serverless
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall chmod
npm ERR! enoent ENOENT: no such file or directory, chmod '/var/task/node_modules/serverless/bin/serverless'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2019-02-21T11_46_54_327Z-debug.log
但是在我的项目目录中我可以看到无服务器文件在那里。
my-app-directory/
|__node_modules/
|__serverless/
|__bin/
|__serverless
更令人困惑的是,1/10 次操作将成功完成而不会抛出任何错误(输出如下)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
> serverless@1.37.1 postinstall /var/task/node_modules/serverless
> node ./scripts/postinstall.js
aws-sdk@2.404.0 /var/task/node_modules/aws-sdk
...
serverless@1.37.1 /var/task/node_modules/serverless
async@1.5.2 /var/task/node_modules/serverless/node_modules/async
raven@1.2.1 /var/task/node_modules/raven
uuid@3.0.0 /var/task/node_modules/raven/node_modules/uuid
uuid@2.0.3 /var/task/node_modules/serverless/node_modules/uuid
是什么导致了这种不一致的行为,我该如何解决?
无服务器删除自动完成 (tabtab) 依赖项之前的一个解决方案是 运行 您的 docker 命令仅重建需要它的模块,而不是默认重建所有模块。
所以在你的情况下,如果你只需要重建节点雪球,你可以使用这个命令
# only rebuild node-snowball
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10 npm rebuild node-snowball