npm重建中不一致的ENOENT正在寻找无服务器

时间:2019-02-21 12:26:00

标签: node.js docker npm serverless-framework

上下文

我有一个Lambda函数,该函数使用需要编译才能运行的本机节点模块(node-snowball)。当我运行macOS时,在本地计算机上运行的已编译代码将无法在AWS Lambda的Amazon Linux环境中运行。因此,我使用Docker和lambci/lambda:build-nodejs8.10 IMAGE编译为将在Lambda上运行的代码,然后通过Serverless进行部署。

问题

在装有用于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

是什么原因导致这种不一致的行为,我该如何解决?

1 个答案:

答案 0 :(得分:2)

直到无服务器删除自动完成(tabtab)依赖项之前,一种解决方案是运行docker命令以仅重建需要它的模块,而不是重建所有模块的默认模块。

因此,在您的情况下,如果您只需要重建节点-雪球,则可以使用此命令

# only rebuild node-snowball
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10 npm rebuild node-snowball