Как указать собственному модулю узла, где хранятся необходимые библиотеки 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;