Несовместимый ENOENT для npm rebuild ищет без сервера - PullRequest
0 голосов
/ 21 февраля 2019

Контекст

У меня есть лямбда-функция, которая использует собственный модуль узла (узел-снежный ком), который требует компиляции для запуска.поскольку я использую macOS, скомпилированный код, который выполняется на моей локальной машине, не будет работать в среде Amazon Linux AWS Lambda.По этой причине я использую 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 голосов
/ 27 февраля 2019

Одно решение, пока без сервера не удалит зависимость автозаполнения (tabtab), - это запустить команду docker, чтобы перестроить только те модули, которые в ней нуждаются, вместо того, чтобы по умолчанию перестраивать их все.

Так что в вашем случае, если вам просто нужно перестроить узел-снежный ком, вы можете использовать эту команду

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