在生产中重新编译Sass资产

时间:2012-03-16 15:34:15

标签: ruby-on-rails sass compass-sass sprockets

我正在使用rails应用,我们希望允许用户使用管理工具来创建新主题。管理工具是一个单独的应用程序,通过数据库与我们的主应用程序通信。我的问题是我编写了自定义Sass扩展来将我们的数据加载到我们的样式表中,但是一旦完成,我就无法在生产环境中重新编译资产。

到目前为止,我已经看到了两种可能性:

1.增加config.assets.version的版本。所以我有这个代码:

MyApp::Application.assets.version = 
       (MyApp::Application.config.assets.version.to_i + .1)

从我读过的内容来看,这会导致资产重新编译,但它似乎只有在手动增加并重新启动服务器时才会起作用。

2.创建编译器并告诉它清理旧资产并重新编译它们:

compiler = Compass::Compiler.new(
                    Rails.root.to_s,
                    Compass.configuration.sass_path,
                    Compass.configuration.css_path,
                    {:sass => Compass.sass_engine_options} )
compiler.clean!
compiler.run

然而,使用这种方法,我遇到了Sprockets :: Index.expire_index的问题!我尝试创建新编译器时会引发错误。

是的,我确实理解我可以将资产设置为在每个请求上重新编译,但性能损失不是我们想要的。此外,由于这是一个主题,数据不应经常更改,因此我们只需要在管理员选择保存新主题时重新编译。

所以,最后,我的问题是:有没有其他可能的方法来做我想要的?或者我走的是正确的道路,如果是的话,我哪里出错了?

编辑: 我忘了提到因为我们使用Sass函数来改变样式表的值,即使我打开了在生产中编译的选项,它也行不通。因为实际的样式表永远不会改变。

1 个答案:

答案 0 :(得分:4)

Rails有一个Rake任务,可以为您进行资产编译。每次将应用程序部署到生产环境时都应该运行一次。

rake assets:precompile

已编译的资产输出到public/assets。有关详细信息,请查看Rails Asset Pipeline Guide