5

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

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

有没有办法在不使用符号链接的情况下解决这个问题,也许是通过更改 Rails 中的一些配置?我四处寻找,但没有取得多大成功。

这是我的配置/初始化程序/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")

这是我的配置/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

任何帮助将不胜感激。

4

3 回答 3

5

实际上,我正准备使用托管在 Heroku 上的 Rails 应用程序设置 Compass,所以很高兴给我一个解决这个问题的借口。:)

答案很简单:

修改'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

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

于 2011-03-24T00:33:19.420 回答
3

好的,我自己是 Heroku 和指南针的忠实粉丝,所以我经历过很多次

Heroku 的文档虽然提供了正确的信息,但在这种情况下提供了糟糕的建议。

使用指南针时,最好的办法是在 99.999% 的情况下在生产模式下将其关闭。

这意味着您在开发机器上编译样式表,然后将它们添加到您的 git 存储库中,然后再推送到 heroku。

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

所以这就是我所做的:

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

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

然后,您可以从初始化程序中删除大量代码(尤其是卸载 Sass::Plugin::Rack 的部分)。此外,您需要从 config 文件夹中的 compass.rb 中删除 if 语句

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

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

于 2011-03-24T00:47:18.540 回答
0

推荐的 Heroku 配置也可以在本地工作。

  1. 删除了第二个 'Compass::AppIntegration::Rails.initialize!' 从 config/initializers/compass.rb,你只需要一次。
  2. 确保您的 scss 文件位于“app/views/stylesheets”中

在本地和生产服务器上,样式表将被编译为 tmp/stylesheets,对 /stylesheets 的请求将解析为 tmp/stylesheest。不需要两个单独的配置。

于 2011-03-29T08:57:03.263 回答