在Heroku上使用Compass:/ tmp远程和本地使用样式表

时间:2011-03-22 20:37:48

标签: ruby-on-rails-3 heroku compass-sass

我目前正在使用Heroku知识库中推荐的configuration使用Compass和Heroku。 Heroku有一个只读文件系统,因此编译好的样式表需要存储在/ tmp中。这在Heroku上工作得很好;但是,在本地,Rails希望在/ public / stylesheets中找到样式表(通过= stylesheet_link_tag 'screen.css', :media => 'screen, projection'调用时)。

为了解决这个问题,我使用ln -s tmp/stylesheets/screen.css public/stylesheets/screen.css在/ public / stylesheets中创建了符号链接,这似乎有效。

有没有办法在不使用符号链接的情况下解决此问题,可能是通过更改Rails中的某些配置?我没有取得太大的成功,我已经四处寻找。

这是我的config / initializers / compass.rb:

require 'compass'
require 'compass/app_integration/rails'
Compass::AppIntegration::Rails.initialize!

# Required for Heroku:
require 'fileutils'
FileUtils.mkdir_p(Rails.root.join("tmp", "stylesheets"))

Compass::AppIntegration::Rails.initialize!

Rails.configuration.middleware.delete('Sass::Plugin::Rack')
Rails.configuration.middleware.insert_before('Rack::Sendfile', 'Sass::Plugin::Rack')

Rails.configuration.middleware.insert_before('Rack::Sendfile', 'Rack::Static',
    :urls => ['/stylesheets'],
    :root => "#{Rails.root}/tmp")

这是我的config / compass.rb:

project_type = :rails
project_path = Compass::AppIntegration::Rails.root

# Set this to the root of your project when deployed:
http_path = "/"

# Necessary for Heroku (original commented out:
css_dir   = 'tmp/stylesheets'
#css_dir = "public/stylesheets/compiled"

sass_dir  = 'app/views/stylesheets'

environment = Compass::AppIntegration::Rails.env

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

我实际上正准备使用我们的Rails应用程序设置Compass,这个应用程序是在Heroku上托管的,所以欢呼为我提供借口来解决这个问题。 :)

答案很简单:

修改'config / compass.rb':

project_type = :rails
project_path = Compass::AppIntegration::Rails.root

http_path = "/"

environment = Compass::AppIntegration::Rails.env
if environment == 'production'
  css_dir = "tmp/stylesheets"
  sass_dir = "app/views/stylesheets"
else
  css_dir = "public/stylesheets"
  sass_dir = "app/stylesheets"
end

然后修改'config / initializers / compass.rb':

require 'compass'
require 'compass/app_integration/rails'
Compass::AppIntegration::Rails.initialize!

require 'fileutils'
FileUtils.mkdir_p(Rails.root.join("tmp", "stylesheets"))

environment = Compass::AppIntegration::Rails.env
if environment == 'production'
  Compass::AppIntegration::Rails.initialize!

  Rails.configuration.middleware.delete('Sass::Plugin::Rack')
  Rails.configuration.middleware.insert_before('Rack::Sendfile', 'Sass::Plugin::Rack')

  Rails.configuration.middleware.insert_before('Rack::Sendfile', 'Rack::Static',
      :urls => ['/stylesheets'],
      :root => "#{Rails.root}/tmp")
end

......瞧,你很好。

答案 1 :(得分:3)

好吧,我自己是一个很大的heroku和指南针迷,所以我经历了很多次

Heroku的文档在提供正确信息的同时,在这种情况下提供了不好的建议。

使用罗盘时,最好的办法是99.999%的时间在生产模式下关闭。

这意味着您在开发计算机上编译样式表,然后在推送到heroku之前将它们添加到您的git仓库。

如果您允许在服务器上编译指南针,您将遭受相当大的性能损失。

所以这就是我的所作所为:

您应该在应用的基础上有一个 config.ru 文件。打开它并添加以下内容:

require 'sass/plugin/rack'
use Sass::Plugin::Rack
Sass::Plugin.options[:never_update] = true

然后,您可以从初始化程序中删除相当多的代码(尤其是卸载Sass :: Plugin :: Rack的部分)。此外,您还需要从config文件夹

中的compass.rb中删除if语句

想一想,为什么要让Sass在服务器上编译样式表?它只会消耗处理能力。希望这会有所帮助,

EDIT :: PS - 我应该补充一点,你现在需要从命令行运行compass watch,以便在你的开发环境中编译你的样式表

答案 2 :(得分:0)

推荐的Heroku配置也可以在本地使用。

  1. 删除了第二个'Compass :: AppIntegration :: Rails.initialize!'来自config / initializers / compass.rb,你只需要一次。
  2. 确保您的scss文件位于“app / views / stylesheets”
  3. 在本地和生产服务器上,样式表将编译为tmp / stylesheets,对/ stylesheets的请求将解析为tmp / stylesheest。无需两个单独的配置。