【问题标题】:Starting application using node works but not yarn or npm使用 node 启动应用程序可以工作,但不能使用 yarn 或 npm
【发布时间】:2019-08-17 15:24:12
【问题描述】:

对于比我更熟悉 NodeJS 的人可能有一个明显的答案,但是:

当运行一个使用 node-gyp 包的应用程序时,它运行没有问题 node ./src/index.js

但是使用一个非常简单的package.json start-script 运行它:

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

在 npm 中:

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 与环境变量或其他东西混淆,但运行 yarn env 似乎一切都是正确的。

所以我想我想知道是否有人知道在本机节点中运行它并使用npm/yarnscript 包装开始有什么区别?为什么这种差异会破坏@rpath/dynamic 链接?

编辑:

我的index.js文件很简单,只导入构建好的node-gyp包:

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


const deserializer = new RosbagDeserializer.Rosbag2Wrapper();

这是有问题的项目,https://github.com/klintan/rosbag2_nodejs

【问题讨论】:

  • 您可以尝试删除 node_modules 文件夹并运行npm update。我认为这个问题可能是由于从某个版本的节点构建的,您可能需要从源代码重建某些包。
  • 不幸的是:/
  • 你使用的是哪个节点版本?
  • @AndreasKlintberg 动态链接可能会受到环境变量的影响 - 我相信您可能正在观察这种影响。 npm start 将启动应用程序并进行一些环境清理(例如 LD_LIBRARY_PATH)。尝试将scripts.start 设置为:node -e 'console.log(process.env) 并查看从命令行运行它的区别。
  • 你可以通过这个帖子,我对 Mac 不太熟悉,但我想这会有所帮助。 stackoverflow.com/questions/17703510/…

标签: node.js npm yarnpkg node-gyp


【解决方案1】:

我希望得到更全面的答案,但至少我在很多出色的评论者的帮助下解决了这个问题:

@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 删除了这个,我猜它与 Mac 上的 SIP 有关,或者可能是其他一些删除这个 env 变量的安全措施。

DYLD_LIBRARY_PATH 如果您运行 node index.js 可用,但如果您使用 npm start(node index.js start 脚本)运行它则不可用。

@Michal Kapracki 和 @Avik 都暗示了这一点(我在第一次比较时错过了缺少的 env 变量)

我为解决它所做的类似于@Avik 链接的dyld: Library not loaded ... Reason: Image not found 问题,我必须添加一堆依赖的库(之前已自动解决)和一个使用@的 post_install.sh 脚本987654326@ 将@rpaths 更改为正确的路径。

这是一个非常丑陋的解决方案https://github.com/klintan/rosbag2_nodejs/blob/master/post_install.sh,但它有效。 仅适用于 Mac,因此需要概括。

总之,我认为是问题所在:

NPM 出于某种原因无法使用或删除环境变量DYLD_LIBRARY_PATH,该变量用于在运行时搜索动态链接的库。这使得有必要使用 mac 工具 install_name_tool 手动链接这些。

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 2019-09-29
    • 2017-01-12
    • 2011-06-19
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2021-02-27
    相关资源
    最近更新 更多