Почему существует разница между решимостью(«./../….») и разрешить («foo»)

#node.js #typescript

#node.js #машинописный текст #typescript

Вопрос:

Из-за разных версий узлов и разных несовместимостей ABI мне нужно загрузить аддон C относительно, потому что они расположены с разными версиями ABI в разных местах.

Но проблема, с которой я столкнулся, объясняется еще проще. Почему 2 следующих вызова отличаются друг от друга?

 const nodegit = require("./../path/to/nodegit.node");
const nodegit = require("nodegit");
  

Afaik оба вызова загружают одну и ту же библиотеку. Но есть и разница. В качестве примера я хочу использовать Repository.init, который имеет следующий заголовок функции:

 Repository.init(repo_path, 0).then(function(repository) {
  // Use repository
});
  

Если я назову это сейчас с:

 nodegit.Repository.init("/path/to/randm/dir", 0);
  

Я получаю это исключение:

 Callback is required and must be a Function.
  

Похоже, что возвращенное обещание стало аргументом функции init. Я что-то упускаю или require интерпретирую эту библиотеку по-другому, если она родственна?

Комментарии:

1. Почему вам нужно использовать относительный путь?

2. Потому что у меня разные версии ABI и разные версии узлов для моего проекта

3. Должно происходить что-то еще. Вы думаете, что получаете одну и ту же библиотеку, но, возможно, это не так.

4. Я тоже так думал, но я использовал Xcode Instruments и в Windows Process Monitor, чтобы проверить, загружен ли тот же nodegit.node файл. И вызов require также выполняется успешно, но вызов Repository.init завершается неудачно и отличается

Ответ №1:

Вызовы отличаются, потому require('nodegit') что entrypoint переносит require("./../path/to/nodegit.node") и обеспечивает лучшее взаимодействие с JavaScript. Вы можете увидеть это здесь: https://github.com/nodegit/nodegit/blob/master/generate/templates/templates/nodegit.js#L11-L23 . Было намного проще написать API на JavaScript, чем на C , и в конечном итоге именно поэтому он работает таким образом. Вы все равно можете использовать собственный двоичный файл напрямую, но вы получите опыт ближе к libgit2 без NodeGit API.

Ответ №2:

  • «nodegit» является основной точкой входа пакета
  • «./../path/to/nodegit.node» только собственное расширение

Комментарии:

1. Спасибо! Это очень помогло! Таким образом, я могу переместить все расширение C отдельно в другой каталог и загрузить это вместо этого?