dart build: необходимо внедрить ресурс из приложения в пакет зависимостей
Предыстория: у меня есть пакет с компонентами Angular (5.0.0, Dart 2.0.0) (назовем его my_components), который я использую во многих проектах клиентов (app_1, app_2,...). Эти приложения должны переопределять некоторые свойства CSS (например, цвета) почти каждого компонента, который должен отражать фирменный стиль клиентов. Очевидным выбором здесь было бы определить значения как переменные SASS в _variables.scss
файл в пакетах app_n. (Я не могу использовать пользовательские свойства CSS, потому что требуется поддержка IE (я знаю, что IE официально не поддерживается Angular)) Проблема в том, что файлы scss компонента должны импортировать _variables.scss
файл, поэтому my_components потребуется зависимость от app_n, что невозможно.
Я попытался решить это следующим образом: в my_components у меня есть файл lib/_variable.default.scss
, Файлы scss компонента все еще содержат строку @import package:my_components/_variables.scss
, Я написал InjectAssetsBuilder
который работает с расширением.default.scss и производит файлы.scss. Строитель настраивается и ожидает сопоставление 'my_components|lib/_variables.scss': 'app_n|web/variables.scss'
в конфигурации build.yaml app_n. Предполагается, что построитель запускается файлом.default.scss, а затем помещает настроенный файл рядом с ним, чтобы его можно было найти при импорте компонента.
Тем не менее, я не могу заставить его работать. Если я установлю auto_apply
в all_packages
(в определениях компоновщика my_components) компоновщик не получает конфигурацию отображения (из раздела целей компоновки в app_n). Если я установлю auto_apply
в none
, строитель больше не принимает my_components в качестве входных данных, поэтому он не может видеть и запускаться файлом.default.scss.
Если кто-то работал над подобной проблемой раньше (или имеет другую идею, как app_n может вводить переменные SASS в зависимость my_components), я бы хотел услышать их мысли. В противном случае, я был бы признателен, если бы кто-нибудь мог объяснить мне, как ограничены конфигурации сборки:
- Почему не
auto_apply: all_packages
строитель видит конфигурацию в app_n? - Почему сборщик из определения цели в app_n не может видеть ресурсы в my_components?
Если вы считаете, что я допустил ошибку в конфигурации, я могу попытаться извлечь минимальный пример.
2 ответа
Оказалось, у меня были некоторые ошибки в моей конфигурации build.yaml и в самом сборщике, но я наконец запустил его. Я опубликовал свое решение в пабе: https://pub.dartlang.org/packages/inject_assets_builder
README содержит инструкции для полного рабочего примера.
Если вы используете один и тот же компонент в нескольких местах своего приложения и хотите использовать только некоторые из них, ответ nshanans - лучший выбор.
Я не верю, что генерация исходников в пакет, от которого вы зависите, является полностью поддерживаемой опцией в системе сборки.
В пакете angular_components мы выбрали альтернативный подход для компонентов, которые мы разделяем в разных клиентских приложениях. Мы остановились на системе основных стилей, которые можно применять для изменения внешнего вида.
Общий компонент построен с набором хороших стилей по умолчанию. Общий компонент также предлагает _mixins.scss
файл, содержащий набор миксов Sass для импорта клиентских приложений. Миксины предназначены для корректного переопределения всех стилей, необходимых для изменения темы компонента.
Например, вот миксин, который позволяет изменить стиль переключателя.