Rails 4资产 - 生成两个不同的摘要

时间:2014-02-28 20:39:39

标签: ruby-on-rails asset-pipeline

我显然必须在这里做错事。我正在与资产管道(再次)搏斗。我有一个自定义字体,在我看来,要正确编译所有内容我需要在多个地方使用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>

建议?

2 个答案:

答案 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引用都将在注入父资产之前编译。