2011-03-22 11 views
5

我目前在Heroku中使用Compaoku,使用Heroku知識庫中推薦的configuration。 Heroku有一個只讀文件系統,因此編譯的樣式表需要存儲在/ tmp中。這在Heroku上可以很好地工作。然而,本地Rails希望在/ public/stylesheets中找到樣式表(當通過= stylesheet_link_tag 'screen.css', :media => 'screen, projection'調用時)。在Heroku上使用Compass:/ tmp用於遠程和本地樣式表

爲了解決這個問題,我已經在/ 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 

任何幫助將不勝感激。

回答

5

我實際上正準備用我們的Heroku託管的Rails應用程序來設置Compass,所以我很高興能夠給我一個藉口來解決這個問題。 :)

答案很簡單:

修改 '配置/ 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 

然後修改 '配置/初始化/ 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 

...和瞧,你很好。

+0

這是否與rails3一起工作? – anka 2011-03-24 23:29:05

+0

是的 - 我在Rails 3.0.5上。 – jdc 2011-03-25 16:50:14

+2

在這個解決方案中我不明白的一件事就是爲什麼你要改變基於環境的「sass_dir」。這不是你存放源文件的地方嗎?爲什麼它在prod/heroku中會比在dev中有所不同?另外,你正在調用Compass :: AppIntegration :: Rails.initialize!兩次。 – 2011-06-02 14:27:13

3

好吧,我是一個大的Heroku和指南針扇自己,所以我經歷過很多次

Heroku的文檔,同時給予正確的信息,在這種情況下提供好的建議。

使用指南針時,最好的辦法是在生產模式下關閉99.999%的時間。

這意味着你可以在你的開發機器上編譯你的樣式表,然後在推送到heroku之前將它們添加到你的git倉庫中。

如果您允許指南針在服務器上編譯,那麼您將遭受相當大的性能差異。

因此,這裏是我做的:

你應該有一個config.ru文件在您的應用程序的基礎。打開它,並添加以下內容:

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

然後,您可以從您的初始化(尤其是在你卸載薩斯::插件::架的部分)除去相當多的代碼。此外,您將要從config文件夾中的compass.rb中刪除if語句

想一想,爲什麼要Sass在服務器上編譯樣式表?它只是增加了處理能力。希望這有助於

編輯:: PS - 我要補充一點,你需要運行在命令行compass watch現在爲了讓您的樣式表在你的開發環境

+0

考慮到css文件在服務器上永遠不會改變一次(僅編譯一次,或者每次運行它),在服務器上編譯似乎是一個合理的策略。無論如何,我試圖實現你的解決方案(謝謝你提出這個建議),但最終會出現一個通用的崩潰(代碼E10)。你介意告訴我你的config.ru和其他應該改變以實現你的解決方案的元素嗎? – CuriousYogurt 2011-03-24 04:23:47

+0

這是一個有趣的想法;但歸根結底,我不確定如何實現它。如果有人這樣做,讓我知道。 – CuriousYogurt 2011-03-28 23:27:50

+0

這對我們有效。我們使用Jammit來打包資產,所以我們根本不需要sass編譯。我們將上面的建議封裝到if(ENV ['RACK_ENV'] ||'development')!='development')中並將其放入config.ru中。 – 2011-05-05 22:59:53

0

推薦Heroku的配置將編譯也在當地工作。

  1. 刪除了第二個'Compass :: AppIntegration :: Rails.initialize!'從config/initializers/compass.rb,你只需要它一次。
  2. 確保您的SCSS文件在「應用程序/視圖/樣式」

本地和生產服務器的樣式表將被編譯到TMP /樣式表,並請求/樣式表將解析爲TMP/stylesheest 。不需要兩個單獨的配置。

相關問題