Модуль узла кросс-компиляции с собственными привязками с помощью node-gyp

Я использую AWS Lambda, который включает в себя создание архива моего сценария node.js, включая папку node_modules, и загрузку его в их инфраструктуру для запуска.

Это прекрасно работает, за исключением случаев, когда речь идет о модулях узлов с собственными привязками (с использованием node-gyp). Поскольку привязка была выполнена, а проект заархивирован на моем локальном компьютере (OS X), он несовместим с серверами AWS (Amazon Linux).

Как я могу кросс-компилировать/установить модуль узла (в частности, node-sqlite3), поэтому, когда я загрузить его на другую серверную арку, на которой он работает?


person Josh Hunt    schedule 20.05.2015    source источник
comment
Вы пробовали использовать node-pre-gyp? node-sqlit3 уже использует его, так что вы впереди игры. IIRC, он должен перенести сборку в Amazon S3, чтобы вы могли скомпилировать ее для Amazon Linux (ОС AWS Lambda).   -  person zamnuts    schedule 23.05.2015
comment
Да, я видел, что node-sqlite3 использует node-pre-gyp, но я действительно не понимал, что это значит для меня или как его использовать для достижения того, чего я хочу.   -  person Josh Hunt    schedule 23.05.2015
comment
Я знаю, что это связано с дополнительными затратами, но я бы предложил упаковать рекламную сборку на другую коробку s3. Затем перенесите его в производственную среду. Обратите внимание, что если вы сделаете npm i из своей среды Linux, все будет работать нормально из коробки, если у вас есть необходимые инструменты сборки.   -  person mh-cbon    schedule 23.05.2015
comment
Помогает ли это? stackoverflow.com/questions/25797424 / По сути, он говорит, что вам нужны правильные переменные среды, чтобы он знал, какой компилятор использовать.   -  person Randy    schedule 23.05.2015
comment
Да, это начало, но я понятия не имею, какие компиляторы мне нужны или что нужно установить для env vars. Я пытался искать и находить то, что мне нужно, но обнаружил, что это слишком сложно сделать.   -  person Josh Hunt    schedule 25.05.2015


Ответы (4)


Хотя на самом деле это не решение вашей проблемы, очень простой обходной путь может состоять в том, чтобы просто скомпилировать собственные дополнения на машине с Linux.

В вашей конкретной ситуации я бы использовал Vagrant. Vagrant может создавать виртуальные машины и настраивать их за считанные секунды.

  1. Найдите образ ОС, напоминающий дистрибутив Linux от Amazon (Fedora, CentOS, другие, которые используют yum в качестве менеджера пакетов — см. Wiki )
  2. Используйте простой сценарий настройки, который при запуске Vagrant при запуске компьютера запустит npm install (при желании он также может удалить папку node_modules перед тем, как обеспечить чистую установку)
  3. Для дополнительного удобства скрипт также может создавать zip-файл для развертывания.
  4. После завершения установки скрипт выключит виртуальную машину, чтобы избежать ненужного потребления системных ресурсов.
  5. Развертывать!

Это может потребовать некоторой настройки, если связанные библиотеки не находятся в одном и том же месте на целевой машине, но в целом это кажется мне лучшим и самым быстрым решением.

person Robert Rossmann    schedule 25.05.2015
comment
Хотя это не может быть решением моего вопроса, оно решает мою проблему. Спасибо - я посмотрю на это - person Josh Hunt; 26.05.2015
comment
Я хотел бы увидеть реальное решение этой проблемы; Я хотел бы установить node-sqlite на Raspberry Pi. - person Richard Turner; 06.11.2015
comment
@RichardTurner С этим не должно быть проблем - просто npm install на целевой машине. - person Robert Rossmann; 06.11.2015
comment
@rossman Да, вы правы, мне просто нужно было добавить своп, чтобы преодолеть нехватку оперативной памяти. - person Richard Turner; 06.11.2015

Хотя в некоторых случаях может быть достаточно установки приложения с помощью Vagrant, я счел необходимым создать приложение на Linux, которое как можно ближе к AMI Amazon Linux для Lambda.

Вы можете прочитать исходный ответ здесь: https://stackoverflow.com/a/34019739/303184

Шаги, чтобы заставить его работать:

  1. Создайте новый экземпляр EC2. Убедитесь, что он основан на точно таком же образе, что и ваша среда выполнения AWS Lambda. Вы можете просмотреть подробную информацию об окружении Lambda здесь: http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html. В нашем случае это был Amazon Linux AMI с именем amzn-ami-hvm-2015.03.0.x86_64-gp2.

  2. Установите nvm и используйте его для установки той же версии Node.js, что и на AWS Lambda. На момент написания этой статьи это была v0.10.36. Вы можете обратиться к http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html еще раз, чтобы узнать.

  3. Вам, вероятно, потребуется установить компилятор git и g++ на EC2. Вы можете сделать это бегом

    sudo yum install git gcc-c++
  4. Наконец, клонируйте свое приложение в новый EC2 и установите зависимости вашего приложения:

    nvm use 0.10.36
    npm install --production
    
  5. Затем вы можете легко загрузить node_modules, используя scp или что-то подобное.

person xaralis    schedule 01.12.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Eloims; 01.12.2015
comment
@Eloims Я приложил полное решение по запросу. - person xaralis; 02.12.2015

Те же строки, что и в ответе Роберта, когда мне приходилось работать на своем MAC в другой ОС, я использую vm ware, например бесплатный виртуализатор Oracle VirtualBox установить Linux на мой Mac бесплатно. Или зарегистрируйте новую учетную запись AWS, и вы получите микро на год бесплатно. Используйте это, чтобы получить свой ящик Linux, делайте там все, что вам нужно.

person tgkprog    schedule 25.05.2015

У AWS есть страница, описывающая, как работать с собственными модулями NPM: https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

person bspates    schedule 29.05.2015