Запуск приложения с использованием узла работает, но не пряжа или нпм - PullRequest
7 голосов
/ 27 марта 2019

Вероятно, есть очевидный ответ для кого-то, кто более знаком с NodeJS, чем я, но:

При запуске приложения, использующего пакет node-gyp, оно без проблем запускается с помощью node ./src/index.js

Однако, запустив его с помощью очень простого package.json start-script:

"scripts": {
    "start": "node ./src/index.js"
  }

в нпм:

npm start

npm info it worked if it ends with ok
npm info using npm@6.9.0
npm info using node@v11.10.1
npm info lifecycle rosbag2@0.1.0~prestart: rosbag2@0.1.0
npm info lifecycle rosbag2@0.1.0~start: rosbag2@0.1.0

> rosbag2@0.1.0 start /Users/andreasklintberg/personal/xviz/examples/converters/rosbag2
> node ./src/index.js "./src/index.js"

internal/modules/cjs/loader.js:779
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: dlopen(/Users/andreasklintberg/personal/xviz/examples/converters/rosbag2/node_modules/rosbags2_nodejs/build/Release/rosbags2_nodejs.node, 1): Library not loaded: @rpath/librosidl_typesupport_cpp.dylib
  Referenced from: /Users/andreasklintberg/personal/xviz/examples/converters/rosbag2/node_modules/rosbags2_nodejs/build/Release/rosbags2_nodejs.node
  Reason: image not found

и аналогично в пряже yarn start

yarn run v1.13.0
warning package.json: No license field
$ node ./src/index.js ./src/index.js -d ../../../data/rosbag2/rosbag2_2019_03_09-21_54_44 -o ../../xviz-data/rosbag2/rosbag2_2019_03_09-21_54_44/
internal/modules/cjs/loader.js:779
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: dlopen(/Users/andreasklintberg/personal/xviz/examples/converters/rosbag2/node_modules/rosbags2_nodejs/build/Release/rosbags2_nodejs.node, 1): Library not loaded: @rpath/librosidl_typesupport_cpp.dylib
  Referenced from: /Users/andreasklintberg/personal/xviz/examples/converters/rosbag2/node_modules/rosbags2_nodejs/build/Release/rosbags2_nodejs.node
  Reason: image not found

Я знаю, что ошибка в том, что динамическая ссылка / @ rpath испорчена, и я думал, что это потому, что npm/yarn портится с переменными env или что-то в этом роде, но при запуске yarn env кажется, что все правильно.

Так что, я думаю, мне интересно, кто-нибудь знает, в чем разница - запускать его в нативном узле и использовать сценарий npm/yarn для переноса начала? И почему эта разница портит @ rpath / dynamic linking?

Редактировать:

Мой index.js файл очень прост, просто импортирует встроенный пакет node-gyp:

let RosbagDeserializer = require('../build/Release/rosbags2_nodejs.node');


const deserializer = new RosbagDeserializer.Rosbag2Wrapper();

Это рассматриваемый проект, https://github.com/klintan/rosbag2_nodejs

1 Ответ

0 голосов
/ 09 апреля 2019

Мне бы хотелось получить более полный ответ, но, по крайней мере, я решил его с помощью множества замечательных комментаторов:

@rpath не установлен на Mac, но с DYLD_LIBRARY_PATH он работает, потому что этоодин из путей поиска во время выполнения, кажется (https://superuser.com/questions/282450/where-do-i-set-dyld-library-path-on-mac-os-x-and-is-it-a-good-idea). Однако по какой-то причине NPM удаляет это, я предполагаю, что это связано с SIP на Mac, или, возможно, с другой мерой безопасности, которая удаляет эту переменную env.

DYLD_LIBRARY_PATH доступен, если вы запускаете node index.js, но НЕ, если вы запускаете его, используя npm start (node index.js start script).

Оба @Michal Kapracki и @Avik намекали на это (Я пропустил отсутствующие переменные env при сравнении в первый раз)

То, что я сделал для ее решения, было похоже на dyld: Библиотека не загружена ... Причина: изображение не найдено вопрос как @Связанный с Avik, мне пришлось добавить несколько библиотек, которые были зависимы (это было автоматически разрешено ранее) и скрипт post_install.sh, который использует install_name_tool для изменения @rpathsна правильный путь.

Это довольно уродливое решение https://github.com/klintan/rosbag2_nodejs/blob/master/post_install.sh, но оно работает.Но только для Mac, поэтому необходимо обобщить.

Итак, в общем, я думаю, что проблема заключается в следующем:

NPM по какой-то причине не может использовать или удаляет переменную env DYLD_LIBRARY_PATH, которая используется для поиска динамически связанных библиотек во время выполнения.Это делает необходимым связать их вручную с помощью инструмента Mac install_name_tool.

...