У меня есть похожий вопрос к этому , но не совсем то же самое.
Я хотел бы, чтобы пользователь моего приложения установил его с любыми зависимостями, необходимыми для его использования. Так, например, если они хотят сохранить в MongoDB, будут установлены только библиотеки, связанные с Mongo, но если они хотят сохранить в Redis, будут установлены только библиотеки, связанные с Redis. Я не хочу заставлять их загружать и устанавливать библиотеки, которые они не будут использовать.
Я знаю, что могу сделать это для целей разработки devDependencies
, но это идет еще дальше. Как говорится в ответе на вопрос выше, это более тесно связано с профилями Python setuptools
extras_require
и Clojure leiningen
. Что-нибудь подобное в npm? Я действительно чувствую, что devDependencies
должен быть dev
профиль более универсального способа определения зависимостей.
источник
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
и т. д. во многом люди делают модули, предназначенные для расширения angularjs .package.json
, которое было решено в других менеджерах пакетов.Ответы:
codependency может быть тем, что вы ищете, или всем, что делает что-то похожее на:
package.json
этом которые не устанавливаются автоматическиnpm install
, скажем,optionalPeerDependencies
require
функция стиля, которая знает оoptionalPeerDependencies
правильных вещах и делает их правильно, включая выдачу / предупреждение, когда ничего не найдено, что соответствует требуемому классу модулей (например, ниredis
, ниmongo
, ниmysql
, и т.д. не установлены).Один из вариантов будет, если основные функциональные возможности модуля работают без каких-либо необязательных зависимостей (например, шаблон плагина), без ошибок / предупреждений, когда не найдено ничего, что соответствует зависимости от однорангового узла.
Другим вариантом является приведенный выше список с учетом зависимости производства от развития, то есть аналог
dependencies
иdevDependencies
.Возможно в сочетании с требованием по требованию , так что дополнительные модули требуются лениво, например:
источник
codependency
предоставляет модуль в случае, если модуль испаряется из NPM и потому что ссылки без выдержек имеют плохую форму SO.Если вам нужны простые необязательные зависимости, такие как плагины, например, если вы установите foo, вы запустите его красочно, но если он не установлен, у вас нет проблем и вы увидите его серым, тогда вы можете использовать необязательные атрибутыDependecies в package.json :
И в коде:
Извлечено из документации package.json .
источник
Что я делаю, так это настраиваю скрипт установки в моем package.json внутри
scripts
, вот так:Он запустится сразу после
npm install
финиша. Я использую его в основном для автоматического создания.env
файла со значениями по умолчанию.my-install.js
Сценарий может выполнять различные команды, создавать файлы, задать для ввода данных пользователя, так что вы могли бы сказать : «Хочет Redis или Монго?»:Это очень быстрый ответ, проверьте readline для правильного чтения пользовательского ввода и дочернего процесса для запуска команд и обработки вывода и т. Д.
Также обратите внимание, что скрипт установки может быть любым, что вы пожелаете (python, bash и т. Д.)
источник
npm install
запуск внутри сценария установки также может вызвать непреднамеренное поведение. Я не рекомендую это решение.npm действительно не был разработан для этого, так как одна из самых сложных частей управления зависимостями - обеспечение быстрых, воспроизводимых сборок, которые просты и относительно безопасны. Но я считаю, что есть вариант использования, и, безусловно, был для меня. Поэтому я написал пакет, чтобы сделать именно то, что вы просите.
Мой пакет есть
install-subset
и может быть установлен глобально сnpm install -g install-subset
https://www.npmjs.com/package/install-subset
Во-первых, вы создаете белые и черные списки для именованных поднаборов установки в вашем package.json следующим образом:
Затем назовите это, например,
install-subset test
Это временно перезапишет ваш package.json, чтобы не устанавливать эти пакеты в черный список, а затем восстановить его, что в зависимости от пакетов может сэкономить много времени и пропускную способность.
Также работает с пряжей, с открытым исходным кодом и вопросы / PR приветствуются.
Во многих случаях я использую это на нашем ci-сервере, чтобы сократить время сборки, а в нашем последнем проекте React Native наша обычная установка для нового разработчика заняла от 72 до примерно 20 секунд.
источник