У меня сложная архитектурная проблема с 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.