Как указать собственному модулю узла, где хранятся необходимые библиотеки DLL?

В настоящее время я разрабатываю собственный модуль node для использования в Node.Js и Electron, которому для работы требуются дополнительные библиотеки DLL (и любой эквивалент в Linux и Mac). Я не особо занимаюсь разработкой на C++, и я не нашел решения этого вопроса в Интернете, поэтому мне может понадобиться ваша поддержка:)

Таким образом, все работает хорошо, когда все хранится в одном (рабочем) каталоге, но это не то, с чем вы можете работать в долгосрочной перспективе. Особенно, когда я упаковываю все в модуль, который можно загрузить с помощью NPM, модуль с его dll хранится в подпапке типа "./node_modules/native-module/build/Release/adddon.node[или dll]".

Я могу легко включить модуль с помощью require, но он больше не находит никаких dll, потому что, если я правильно понимаю поведение C++, он просто смотрит в PATH и текущий рабочий каталог (где выполняется Electron или Node.js) для библиотеки DLL.

Моя первая идея для обходного пути заключалась в том, чтобы просто изменить cwd на папку "Release", где находятся все библиотеки dll. Но изменение cwd становится действительно беспорядочным, если вам нравится использовать функцию горячей перезагрузки webpack, которую я использую для целей разработки. Вы всегда должны проверять, был ли уже изменен cwd, он больше не отображает страницу правильно, и я действительно думаю, что это не способ сделать.

Итак, мой вопрос: каков был бы способ корректировки динамически сообщать модулю узла, где хранятся библиотеки DLL? Заранее спасибо.

PS: Я использую cmake-js для процесса сборки, если это важно.

1 ответ

Я "исправил" эту проблему, расширив переменную среды Path во время выполнения с помощью API-интерфейсов node.js. По крайней мере, под Windows поведение собственных программ на C++ по умолчанию - искать в Path и CWD файлы DLL.

Вот мой код, если кому интересно:

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;
Другие вопросы по тегам