2011-03-22 19 views
5

Actualmente estoy usando Compass con Heroku usando este configuration recomendado en la base de conocimiento de Heroku. Heroku tiene un sistema de archivos de solo lectura, por lo que las hojas de estilo compiladas deben almacenarse en/tmp. Esto funciona bien de forma remota en Heroku; localmente, sin embargo, Rails espera encontrar hojas de estilo en/public/stylesheets (cuando se llama a través del = stylesheet_link_tag 'screen.css', :media => 'screen, projection').Uso de Compass en Heroku:/tmp para hojas de estilo de forma remota y local

Para resolver el problema, he creado enlaces simbólicos en/public/stylesheets usando ln -s tmp/stylesheets/screen.css public/stylesheets/screen.css y eso parece funcionar.

¿Hay alguna manera de resolver este problema sin usar enlaces simbólicos, quizás cambiando alguna configuración en Rails? He hurgado sin mucho éxito.

Aquí es mi config/inicializadores/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") 

Y aquí es mi 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 

Cualquier ayuda sería muy apreciada.

Respuesta

5

Estaba a punto de configurar Compass con nuestra aplicación Rails, que está alojada en Heroku, así que aplausos por darme una excusa para trabajar en esto. :)

La respuesta es sencilla:

Modificar '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 

a continuación, modificar 'config/inicializadores/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 

... y voila, estás bien.

+0

¿Funciona esto con rails3? – anka

+0

Sí, estoy en Rails 3.0.5. – jdc

+2

Una cosa que no entiendo en esta solución es por qué está cambiando el "sass_dir" basado en el entorno. ¿No es aquí donde están almacenados los archivos de origen? ¿Por qué sería diferente en prod/heroku que en dev? Además, está llamando a Compass :: AppIntegration :: Rails.initialize! dos veces. –

3

bien, soy un gran fan heroku y una brújula, así que yo he pasado por esto muchas veces

documentos de Heroku, mientras que da la información correcta, ofrecer consejos pobres en este caso.

Al usar la brújula, lo mejor que puede hacer, 99.999% del tiempo es apagarlo en modo de producción.

Esto significa que compila sus hojas de estilo en su máquina de desarrollo y luego las agrega a su repositorio de git antes de pasar a heroku.

Sufrirá un rendimiento razonablemente considerable si permite que compás compile en el servidor.

Así que aquí es lo que hago:

Usted debe tener un archivo config.ru en la base de su aplicación. Abrirla y añadir lo siguiente:

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

entonces usted puede quitar mucho del código de su inicializador (especialmente la parte donde se descargue Sass :: Plugin :: Rack). Además, querrá eliminar la instrucción if de compass.rb en la carpeta de configuración

Piénselo, ¿por qué quiere que Sass compile una hoja de estilo en el servidor? Simplemente consume la potencia de procesamiento.Espero que esto ayude,

EDITAR :: PS - Debo añadir que tendrá que ejecutar compass watch desde la línea de comandos ahora con el fin de obtener sus hojas de estilo para compilar en su entorno de desarrollo

+0

No compilar en el servidor parece ser una estrategia razonable, dado que los archivos css nunca cambian una vez en el servidor (¿se compila solo una vez o cada vez que se ejecuta?). En cualquier caso, traté de implementar su solución (gracias por sugerirlo), pero terminé con un bloqueo genérico (código E10). ¿Te importaría mostrarme tu config.ru y los demás elementos que deberían cambiar para implementar tu solución? – CuriousYogurt

+0

Esta es una idea interesante; pero no estoy seguro, en el análisis final, de cómo lograrlo. Si alguien lo hace, házmelo saber. – CuriousYogurt

+0

Esto funcionó para nosotros. Utilizamos Jammit para empacar activos, por lo que no necesitamos compilación sass en absoluto. Añadimos la sugerencia anterior a un if (ENV ['RACK_ENV'] || 'development')! = 'Development') y la colocamos en config.ru. –

0

La configuración recomendada Heroku también trabajo localmente

  1. Se ha eliminado el segundo 'Compass :: AppIntegration :: Rails.initialize!' desde config/initializers/compass.rb, solo lo necesita una vez.
  2. Asegúrese de que sus archivos SCSS están en 'app/views/hojas de estilo'

en ambos servidores locales y de producción de las hojas de estilo se compilan a TMP/hojas de estilo, y una petición a/hojas de estilo se resolverán en tmp/stylesheest . No hay necesidad de dos configuraciones separadas.

Cuestiones relacionadas