我显然必须在这里做错事。我正在与资产管道(再次)搏斗。我有一个自定义字体,在我看来,要正确编译所有内容我需要在多个地方使用asset_path()
,但它会产生意想不到的效果。
我意识到有几种方法可以做到这一点,但这就是我目前所拥有的:
在application.css.scss.erb
中:
@import "<%= asset_path("my-font.css") %>";
my-font.css
的源文件为app/assets/stylesheets/my-font.css.erb
(它必须是.erb
,因为我也在那里使用asset_path()
。
在application.rb
中,我将my-font.css
添加到预编译列表中。
config.assets.precompile << 'my-font.css'
当我清理public/assets
并使用摘要运行rake assets:precompile
所有内容都已编译时,但应用于实际文件的摘要与计算的摘要不同,并放入{{1} }。
生成的文件是
application.css
但在public/assets/my-font-2f25682a1ea904a866ef9f44101a5a2e.css
中,对它的引用是:
public/assets/application-bba2edaee36771f4bdb5c89b8ec90aaf.css
我意识到我可能比我应该使用
@import url(/assets/my-font-ed843d3b174ca427edf963e473ad9e9b.css);
更多,并且还通过url()导入文件而不是要求它们,但这让我最接近让事情发挥作用。
我怀疑其中一个摘要是在my-font.css 上计算之前它通过ERB,另一个之后是,但我不明白为什么以及如何解决它。< / p>
建议?
答案 0 :(得分:6)
我猜你只是通过清空public/assets
来清理你的资产。这还不够,您还需要清空tmp/cache/assets
,或者只需运行rake assets:clobber
即可。{/ p>
答案 1 :(得分:0)
我通过将要捆绑的资产的原始内容注入到application.scss.erb
等复合资产中来解决此类依赖关系。您需要显式声明依赖项(以便my-fonts.css
中的更改导致application.css
的重新生成)然后注入内容:
application.scss.erb
:
// Should be at Top of File
//= depend_on_asset my-fonts.css
//... wherever in the file you want the contents injected:
<%= environment['my-fonts.css'] %>
这是如何工作的?在资产管道编译期间,此处的环境具有所有预编译资产内容的哈希值。这允许您将已编译的内容从my-fonts.css
注入到复合资产中。由于我们手动注入了值,因此我们需要显式创建依赖关系,以便通过depend_on_asset
跟踪此关系。
要记住的一件事是,多个资产预处理器(SCSS,ERB等)是从&#34;外部处理的,因此my-fonts.css
资产的内容将是在ERB处理期间编译/注入为CSS输出。在SCSS处理之前,它们将包含在资产中。这不应该造成问题,因为如果这是一个SCSS资产,任何SCSS引用都将在注入父资产之前编译。