我目前正在使用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
非常感谢任何帮助。
答案 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的文档在提供正确信息的同时,在这种情况下提供了不好的建议。
使用罗盘时,最好的办法是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配置也可以在本地使用。
在本地和生产服务器上,样式表将编译为tmp / stylesheets,对/ stylesheets的请求将解析为tmp / stylesheest。无需两个单独的配置。