Как настроить приложение узла для конкретной платформы

#node.js #npm #dependencies

#node.js #npm #зависимости

Вопрос:

У меня есть приложение node, которое работает на небольшом устройстве Linux с процессором ARM. Я разрабатываю в macOS, и в приложении есть некоторые зависимости от платформы. Прямо сейчас я просто запускаю npm install на mac и копирую всю кодовую node_modules базу и все остальное на устройство Linux. Кажется, все работает нормально, но я не уверен, будет ли это продолжаться. Возможно, он просто еще не прошел по пути выполнения, который опирается на специфичный для mac код.

Я полагаю, что я мог бы работать npm install на устройстве Linux, но это означало бы, что у нас должен быть один доступный для использования конвейер CI / CD, а это будет головной болью и, вероятно, нереалистичным решением в долгосрочной перспективе.

Какие еще есть варианты? Есть ли какой-нибудь способ заставить npm устанавливать зависимости, как если бы это было в linux ARM box? Я знаю, что вы можете сделать это с электронными приложениями, используя electron-packager. Можно ли это сделать для приложений, не связанных с электронными узлами?

К вашему сведению, я использую следующую команду, чтобы определить, существуют ли зависимости от macOS:

 find node_modules -name "*.node" | xargs file
 

который возвращает

 node_modules/snappy/build/Release/binding.node: Mach-O 64-bit bundle x86_64
 

Комментарии:

1. Если вы хотите создать только один исполняемый файл, возможно, pkg — это то, что вам нужно

2. @BraveButter Я видел этот модуль, но вверху есть отказ от ответственности, в котором говорится Disclaimer: pkg was created for use within containers and is not intended for use in serverless environments. , что я не запускаю это внутри контейнера.

Ответ №1:

Вы упоминаете в комментариях, что pkg это выглядело как возможное решение, но вы обеспокоены тем, что оно зависит от контейнера. Честно говоря, это, вероятно, нормально, если вы не находитесь в бессерверной среде, такой как AWS Lambda.

Помимо этого или аналогичного пакета, ваши очевидные варианты — скомпилировать на устройстве Linux ARM (которое вы исключили) или каким-то образом избавиться от зависимостей, зависящих от платформы. Вам действительно нужно snappy ? Можете ли вы жить без сжатия или с более медленной библиотекой сжатия? Что касается fsevents , я считаю, что это только для macOS и не повлияет на другие платформы. Вы, вероятно, получаете его как зависимость от chokidar ? Кажется вероятным, что вы можете игнорировать это.

РЕДАКТИРОВАТЬ: Комментарий указывает snappy , что устанавливается как зависимость от kafka-node . snappy является необязательным kafka-node . Если вы сами не указываете быстрое сжатие, то оно, вероятно, не используется. Вы можете установить kafka-node без snappy использования --no-optional флага: npm install kafka-node --no-optional попытка использовать snappy сжатие в этом случае приведет к ошибке времени выполнения. Это потенциально может позволить вам проверять локально на вашем компьютере macOS, который snappy не используется.

Комментарии:

1. Спасибо за информацию. Зависимости от snappy обусловлены прямой зависимостью от kafka-node , которая должна иметь его где-то в своем дереве зависимостей. Оказывается, зависимость от fsevents was, от mocha которой зависит только разработка, так что все в порядке. Я обновлю вопрос, чтобы удалить это.

2. Можно ли было бы загрузить kafka-node один раз на устройство ARM, а затем сохранить результат в кодовой базе приложения? Что-то вроде локального репозитория только для этого одного пакета. Тогда, я думаю, вам придется как-то ссылаться на локальный файл package.json . Если бы нам нужно было только один раз загрузить и скомпилировать зависимости Кафки, это было бы прекрасно.

3. snappy является необязательным в kafka-node . Если вы не указываете быстрое сжатие, оно, вероятно, не используется. Вы можете установить kafka-node без snappy использования --no-optional флага: npm install kafka-node --no-optional попытка использовать snappy сжатие в этом случае приведет к ошибке времени выполнения. Это потенциально может позволить вам проверять локально на вашем компьютере macOS, который snappy не используется.

4. Понял. установка с --no-optional помощью удаляет snappy, и в этот момент попытка использовать сжатие приводит к ошибке, как вы сказали. Я думаю, что я установлю kafka без snappy и не буду использовать сжатие при отправке сообщений. Спасибо за помощь.