npm package.json ОС конкретная зависимость
Есть ли способ указать специфичные для ОС зависимости в файле npm package.json?
Например, я бы хотел установить 'dbus' ( https://npmjs.org/package/dbus) в качестве зависимости для моего модуля, если пользователь работает под управлением Linux. У меня была бы другая зависимость для Mac и Windows.
4 ответа
Есть хороший способ сделать это, в зависимости от ваших настроек.
npm package.json поддерживает ключ os,
а также необязательные зависимости
os
может использоваться для указания, на какую ОС может быть установлен модуль.optionalDependencies
являются зависимостями модулей, которые, если они не могут быть установлены, npm пропускает и продолжает установку.
Таким образом, у вашего модуля может быть необязательная зависимость для каждой ОС, и только тот, который работает, будет загружен / установлен ^.^
РЕДАКТИРОВАТЬ: Как @Sebastien упоминает ниже, этот подход опасен. Для любой данной ОС, по крайней мере, одна из ваших зависимостей является "обязательной", а остальные "необязательной". Если сделать все версии зависимости необязательными, это означает, что если ваша установка закончилась неудачей по уважительной причине, она автоматически пропустит установку, и вы потеряете зависимость, которая вам действительно нужна.
Я думаю, что короткий ответ - нет. Однако я могу придумать пару обходных путей - самое простое - просто добавить все в package.json независимо от ОС, а затем require()
правильный во время выполнения.
Если это не работает для вас, вы можете использовать скрипт установки, чтобы получить результат, к которому вы стремитесь - https://docs.npmjs.com/misc/scripts
Я не проверял это, но я думаю, что это будет работать:
Добавьте что-то вроде этого в ваш package.json:
,"scripts": {
"install": "node install_dependencies.js"
}
А затем добавить install_dependencies.js
файл, который проверяет ОС и запускает соответствующий npm install ...
команды.
Цитирование @npm_support по адресу:
https://twitter.com/npm_support/status/968195526989512705
2/2 Если вы хотите избежать проблем установки, связанных с зависимостями, один из способов - написать оболочку, которая требуется в качестве обычной зависимости, и убедиться, что она имеет
optionalDeps
(а также убедитесь, что оболочка проверяет, есть ли у вас все необходимое для работы).
Но ИМХО это больше похоже на обходной путь, чем на решение проблемы по-настоящему.
Я могу понять, что npm хочет сохранить переносимость и избежать работы со спецификой платформы, но это нужно делать в любом случае, и IMHO делать это во время выполнения не оптимально (особенно, если кто-то хочет оптимизировать размер кода).
Поэтому сегодня у меня нет оптимального решения, которым можно поделиться, но открытое обсуждение предложения.
Разве "условные зависимости" не поддерживаются в npm?
Первое, что пришло мне в голову, это добавить раздел "переопределить", который изменит (+add, -remove, =replace) текущие проанализированные разделы.
Например:
dependencies: { "common-stuff": "*" }
overrides: {
"os: { linux: { dependencies: { "+best-linux-module" } } }
}
Другой вариант, предложенный разработчиком, которого я знаю, заключается в том, чтобы ввести ключевое слово provide, тогда несколько модулей могли бы обеспечить одинаковую семантику, которая была бы удовлетворена resolver (а-ля debian), но он генерирует аналогичные накладные расходы.
Я ищу общий подход, ориентированный не только на поддержку ОС, но и на другие варианты пакетов (например, в зависимости от движков).
Знаете ли вы какие-либо проблемы в трекере NPM? если нет, то я рассматриваю сообщение об ошибке, которую нужно отследить:
https://github.com/npm/npm/issues?q=dependencies+conditional
Отзывы приветствуются по этой идее.
Также есть модуль bindings-shyp:
https://www.npmjs.com/package/bindings-shyp
Вспомогательный модуль для загрузки.node файла вашего нативного модуля
Это вспомогательный модуль для авторов собственных модулей дополнений Node.js. По сути, это "швейцарский армейский нож" require() файла.node вашего нативного модуля.
На протяжении всей истории собственных дополнений Node дополнения в конечном итоге компилировались в разных местах, в зависимости от того, какой инструмент сборки и какая версия узла использовались. Что еще хуже, теперь инструмент сборки gyp может производить сборку Release или Debug, каждая из которых собирается в разных местах.
Этот модуль проверяет все возможные местоположения, в которых будет построен собственный аддон, и возвращает первое, успешно загруженное.