背景:我有一个包含Angular(5.0.0,Dart 2.0.0)组件的软件包(我们称其为 my_components ),我在许多客户项目( app_1 中使用>, app_2 ,...)。这些应用必须覆盖我必须反映客户公司身份的几乎每个组件的一些CSS属性(例如颜色)。显而易见,这里的选择是在 app_n 包的_variables.scss
文件中将值定义为SASS变量。 (我不能使用CSS自定义属性,因为需要IE支持(我知道Angular不会正式支持IE)。)这里的问题是,组件scss文件必须导入_variables.scss
文件,所以 my_components 将需要依赖于 app_n ,这是不可能的。
我尝试通过以下方法解决此问题:在 my_components 中,我有一个文件lib/_variable.default.scss
。组件scss文件仍包含行@import package:my_components/_variables.scss
。我写了InjectAssetsBuilder
,它在.default.scss文件扩展名上运行并生成.scss文件。该构建器是可配置的,并且期望在 app_n 的build.yaml配置中映射'my_components|lib/_variables.scss': 'app_n|web/variables.scss'
。
该生成器应该由.default.scss文件触发,然后将自定义文件放在其旁边,以便组件导入可以找到它。
但是,我无法正常工作。如果我将auto_apply
设置为all_packages
(在 my_components 的构建器定义中),则构建器不会收到映射配置(来自 app_n中的“构建目标”部分) )。如果我将auto_apply
设置为none
,则构建器不再将 my_components 作为输入,因此它无法看到.default.scss文件并被其触发。 / p>
如果以前有人解决过类似的问题(或者有其他想法
auto_apply: all_packages
构建器看不到 app_n 中的配置?如果您认为我的配置有误,可以尝试提取一个最小的示例。
答案 0 :(得分:1)
我认为在构建系统中完全不支持将源生成到您依赖的包中。
在angular_components程序包中,我们对在不同客户端应用程序中共享的组件采取了另一种方法。我们已经确定了可用于更改外观的覆盖样式的系统。
使用一组良好的默认样式构建共享组件。共享组件还提供了一个_mixins.scss
文件,其中包含一组供客户端应用程序导入的Sass mixins。 mixins旨在正确覆盖更改组件主题所需的所有样式。
例如,这里的mixin允许您更改单选按钮的样式。
答案 1 :(得分:0)
事实证明,我的build.yaml配置和构建器本身存在一些错误,但最终使它运行了。我在酒吧发布了我的解决方案:https://pub.dartlang.org/packages/inject_assets_builder
自述文件包含完整示例的说明。
如果您在应用程序的多个位置中使用相同的组件,而只想对其中一些进行样式设置,那么nshanans答案是更好的选择。