Автоматическое объединение нескольких зависимостей bower.json

У меня сложная архитектурная проблема с bower. Я создаю онлайн-платформу, где пользователь создает страницы с помощью динамических виджетов, содержащих JS-код. Эти виджеты имеют предопределенный формат, описание, значки и т. д., они будут упакованы в архив (например, apk, war, jar, ear, но с интерфейсным кодом). Пользователи смогут динамически добавлять виджеты, когда веб-сайт уже развернут.

Мы используем bower, и проблема заключается в следующем: виджеты также должны иметь возможность указывать свои bower зависимости.

Упрощенная структура каталога выглядит следующим образом:

  • Bower.json
  • gulpfile.js (используется для создания веб-сайтов)
  • bower_components # собственные зависимости + зависимости от всех виджетов
  • widgets
    • widget1 # any name is possible here
    • виджет2
    • случайный виджет
    • another-widget # for each of the widgets above the layout is the same
      • bower.json (or simplified version like dependencies.json which contains only dependencies list).
      • много других файлов

После загрузки виджета bower.json должен быть объединен со всеми зависимостями от других виджетов, gulp build запустится и перестроит все это.

Как объединить все Bower.json в один? Особенно, когда есть одна и та же зависимость дважды, например. один виджет зависит от "jquery": "<=2.1.0", а другой виджет зависит от "jquery": "^2.1.0". Они оба совместимы, но какую строку мне написать в bower.json? Если я напишу оба, то Bower использует только второй и установит последнюю версию jquery - 2.1.1, которая уже не совместима с первым виджетом. И это более простой вариант использования.

На самом деле мы можем предположить, что будут не все возможные варианты спецификации semver, например, <=. Я также могу заставить авторов виджетов использовать мою собственную спецификацию зависимостей, но я не могу придумать, как ее разработать.

Любая помощь приветствуется!

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

UPD: я знаю о RequireJS и использую его. Но сначала мне нужно скачать саму зависимость, чтобы потом использовать ее с RequreJS.


person sasha.sochka    schedule 24.11.2014    source источник


Ответы (2)


Решение было следующим:

каждый виджет представляет собой пакет Bower с его файлом bower.json; Bower.json проекта переименовывается в bower-base.json, а bower.json генерируется из bower-base.json со всеми виджетами, добавленными в свойство зависимостей. Затем Bower автоматически обрабатывает зависимости виджета.

person sasha.sochka    schedule 01.12.2014
comment
Я новичок в Бауэре. Не могли бы вы объяснить подробно, возможно, на примере, чтобы мы могли извлечь пользу. Спасибо! - person pankajt; 24.04.2016
comment
Решение состоит в том, что каждый виджет сам по себе является пакетом Bower. Bower.json основного проекта имеет зависимость от каждого виджета. - person sasha.sochka; 24.04.2016
comment
Возможно ли, что ваш основной проект динамически выбирает виджеты, например. включая виджет1, виджет2, а не виджет3 без изменения каждый раз Bower.json - person pankajt; 24.04.2016
comment
вы можете написать какой-нибудь скрипт, который будет обновлять Bower.json для вас, у меня нет готового решения для этого - person sasha.sochka; 24.04.2016

Есть ли причина, по которой это нужно делать с беседкой? Bower на самом деле не предназначен для зависимостей времени выполнения. Для этого вы можете использовать что-то вроде RequireJS.

person Jaybill    schedule 24.11.2014
comment
О, ну я уже использую RequireJS! Но как мне сначала загрузить саму зависимость, чтобы я мог использовать ее с RequireJS? - person sasha.sochka; 25.11.2014
comment
О, я понимаю, что вы говорите. Как насчет этого: что, если вы создадите файл Bower.json (и каталог Bower_components) для каждого виджета (и поместите его в подкаталог с указанным виджетом), а затем поместите задачу в свой основной файл Bower.json для запуска установки Bower в этих каталоги? - person Jaybill; 25.11.2014
comment
Как я объяснил в вопросе, это не совсем возможно - если два виджета зависят от jQuery, я в конечном итоге загружу два jqueries одновременно. Это явно проблема. - person sasha.sochka; 25.11.2014