如何告诉本机节点模块所需的dll存储在哪里?

How to tell a native node module where the needed dlls are stored?

本文关键字:dll 存储 在哪里 何告诉 本机 节点 模块      更新时间:2023-10-16

我目前正在开发一个用于Node.Js和Electron的本机节点模块,需要额外的dll才能工作(以及Linux和Mac上的等效物(。 我并不是真的喜欢C++开发,也没有在互联网上找到这个问题的解决方案,所以我可能需要你的一些支持:)

因此,当所有内容都存储在同一个(工作(目录中时,它运行良好,但从长远来看,这不是您可以长期使用的东西。 特别是当我将所有内容打包到可以使用 NPM 加载的模块中时,带有 dll 的模块存储在像"./node_modules/native-module/build/Release/adddon.node[or dll]"这样的子文件夹中。

我可以轻松地将模块包含在 require 中,但它不再找到任何 dll,因为如果我正确理解C++行为,它只会在 PATH 中查找并执行当前工作目录(即电子或节点.js执行(的 dll。

我的第一个解决方法是将 cwd 更改为所有 dll 所在的"发布"文件夹。 但是当你喜欢使用 webpack 的热重载功能时,更改 cwd 会变得非常混乱,我将其用于开发目的。 您始终必须检查cwd是否已更改,它不再正确显示页面,我真的认为这不是这样做的方法。

所以我的问题是动态告诉节点模块 dll 存储位置的相关方法是什么? 提前谢谢。

PS:如果这很重要,我正在使用 cmake-js 进行构建过程。

我通过在运行时使用 node.js API 扩展 Path 环境变量来"修复"这个问题。至少在Windows下,本机C++程序的默认行为是在路径和CWD中查找Dlls。

这是我的代码,如果有人感兴趣的话:

let currentPath = process.env.Path; 
let dllDirectory = path.dirname( path.resolve(require.resolve('your-package-name/package.json'))) + `${path.sep}build${path.sep}Release` 
process.env.Path = currentPath + dllDirectory;