资产管道缓存CSS?

时间:2011-10-05 02:08:10

标签: ruby-on-rails css ruby-on-rails-3.1 sass asset-pipeline

我正在开发Rails 3.1应用程序。我创建了一个application.css.scss.erb文件。 .erb到底是因为我想从配置文件中加载一个变量作为css中的颜色变量:

$highlight1: #<%= COLOR.highlight1 %>;
$highlight2: #<%= COLOR.highlight2 %>;

一切正常,但我遇到的问题是每当我更改COLOR.highlight1中的值时,它都不会反映更改,直到我进入我的css文件并更改某些内容(我通常添加一些空格和保存)。那是我看到变化的时候。显然,rails正在查看文件是否已更改以更新更改。

有没有办法,至少在开发过程中,这可以关闭,我可以看到更改,而不必修改css文件?

对我的技术的任何批评/意见也欢迎

5 个答案:

答案 0 :(得分:7)

Sprockets depend_on指令用于声明这些类型的依赖项。因此,在css.scss.erb文件的顶部,使用其他指令(require和friends),输入如下内容:

//= depend_on "/path/to/colors.rb"

然后,当文件/path/to/colors.rb发生变化时,它将强制css更新。

不幸的是,我从来没有使用相对路径来处理其中一个资产目录(javascripts / stylesheets / images)的文件 ,因此Sprockets可能会解决这个问题阻止这种情况的路径,否则我会遗漏一些东西。这使您可以选择指定绝对路径,这几乎肯定不适用于所有应用程序环境,或者将常量文件放入资产目录(例如app / assets / stylesheets / colors.rb)。 / p>

供参考,这里是Sprockets(2.0.3)源代码中depend_on指令的文档,位于sprockets / directive_processor.rb

  # Allows you to state a dependency on a file without
  # including it.
  #
  # This is used for caching purposes. Any changes made to
  # the dependency file will invalidate the cache of the
  # source file.
  #
  # This is useful if you are using ERB and File.read to pull
  # in contents from another file.
  #
  #     //= depend_on "foo.png"
  #

如果有人知道指定其他地方(如配置/初始化程序或其他地方)的相对路径,请告诉我们!

答案 1 :(得分:3)

除了David Faber的回答。我也需要使用相对路径。

我想生成一个带有语言环境字典的js文件,如果语言环境文件被更改,它将更新:

//= depend_on "../../../config/locales/en.yml"
//= depend_on "../../../config/locales/ja.yml"

var locales = <%= locales.to_json %>;

事实证明,当相对路径也在资产路径中时,当前(Rails 3.2.3)相对路径才有效!

所以丑陋的解决方案是在config/application.rb中添加路径:

config.assets.paths.unshift Rails.root.join("config", "locales").to_s

答案 2 :(得分:0)

也许试试:

config.assets.digest = true

在您的开发配置文件

答案 3 :(得分:0)

http://guides.rubyonrails.org/configuring.html

  
      
  • config.assets.compile是一个布尔值,可用于在生产中打开实时Sprockets编译。
  •   

可能想尝试一下,我不确定它是否实时编译,至少它应该禁用缓存。

答案 4 :(得分:0)

我试试这个,它有用吗

在application.rb

config.autoload_paths += %W(#{config.root}/lib/assets_variables)
config.assets.paths << File.join(Rails.root, 'lib', 'assets_variables')

在lib / assets_variables / color.rb

module Color
  def self.default
    'blue'
  end
end
app / assets / stylesheets / color.css.scss.erb

中的

//= depend_on "color.rb"
$default_color: <%= Color::default %>;
.content {
  color: $default_color;
}