rails how deploy asset heroku asset-pipeline ruby-on-rails-4

how - Heroku NO compila archivos en las tuberías de activos en Rails 4



rails postgresql heroku (16)

Todo va bien en la máquina local con canalización de activos en Rails 4 y Ruby 2.0. Pero cuando se despliega en heroku, se muestra que:

-----> Preparing app for Rails asset pipeline Running: rake assets:precompile I, [2013-03-12T03:28:29.908234 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/rails-2ee5a98f26fbf8c6c461127da73c47eb.png I, [2013-03-12T03:28:29.914096 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/trash-3c3c2861eca3747315d712bcfc182902.png I, [2013-03-12T03:28:33.963234 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-bf2525bd32aa2a7068dbcfaa591b3874.js I, [2013-03-12T03:28:40.362850 #912] INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-13374a65f29a3b4cea6f8da2816ce7ff.css Asset precompilation completed (14.36s)

Heroku parece compilar archivos pero lo coloca en / tmp sin ningún error. Mis preguntas son:

  1. ¿Cómo es que Heroku compila archivos de activos en / tmp?
  2. Mi última solución fue ejecutar RAILS_ENV = activos de ejecución ejecutor del paquete: precompilar localmente, pero esto generó un manifest-xxxxxx.json en public / assets, en lugar de manifest.yml, de modo que heroku no detecta el archivo de manifiesto JSON. Lo resolví creando manualmente un yml del archivo json y heroku se puso feliz. ¿El enfoque de heroku ha quedado obsoleto?


Además de garantizar que tienes la gema ''rails_12factor'' instalada, lo único que tienes que hacer es esto.

# config/application.rb config.assets.paths << Rails.root.join(''vendor'', ''assets'')

Parece que aunque Rails sabe exactamente lo que quiere, Heroku necesita que se le recuerde incluir la carpeta de activos como parte de las rutas de los activos.



Después de horas de búsqueda en Google en las que ninguna de las guías de Heroku o las sugerencias sobre me ayudaron, finalmente me encontré con esta publicación de blog que ofrecía esta pista:

heroku labs:enable user-env-compile --app=YOUR_APP

Sin esto, el inventario de activos siempre tratará de iniciar toda la aplicación y conectarse a la base de datos (a pesar de todo lo que haya leído que rails 4 ahora hace más). Esto expone tu configuración de Heroku a Rails para que pueda iniciarse correctamente y ejecutar tareas de rake como assets: precompilar.


En Rails 4.2.4 su production.rb tiene la línea:

config.serve_static_files = ENV[''RAILS_SERVE_STATIC_FILES''].present?

Eso significa, gem ''rails_12factor'', group: :production no necesita cambiarlo a verdadero, ya que se puede establecer a través de las variables de entorno heroku. También recibirá una advertencia si elimina la gema rails_12factor.

Si tiene problemas con los activos , inicie sesión en la consola heroku run rails console y descubra que la ruta del activo para un archivo puts helper.asset_path("application.js") .

Un comportamiento extraño que noté entre desarrollo y producción, cuando no se proporciona el final del archivo:

Con una imagen /assets/images/image_01.jpg la siguiente salida de asset_paths difiere:

Desarrollo :

development > puts helper.asset_path(''profile_01'') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg development > puts helper.asset_path(''profile_01.jpg'') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

Producción :

development > puts helper.asset_path(''profile_01'') => /profile_01 development > puts helper.asset_path(''profile_01.jpg'') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg

No tiene que ejecutar RAILS_ENV=production rake assets:precompile , heroku lo hace por usted durante la implementación. Además, no es necesario precompilar los activos en desarrollo y llevarlos a heroku.


En mi caso, los activos se compilaron siguiendo las instrucciones anteriores, pero no estaba recogiendo la fuente fontawesome-webfont de los glyphicons de arranque, así que esto funcionó para mí finalmente después de perder tantas horas investigando.

Archivo de gemas

gem ''rails_12factor'', group: :production

paquete de instalación

config / application.rb

config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif, "fontawesome-webfont.ttf", "fontawesome-webfont.eot", "fontawesome-webfont.svg", "fontawesome-webfont.woff") config.assets.precompile << Proc.new do |path| if path =~ //.(css|js)/z/ full_path = Rails.application.assets.resolve(path).to_path app_assets_path = Rails.root.join(''app'', ''assets'').to_path if full_path.starts_with? app_assets_path puts "including asset: " + full_path true else puts "excluding asset: " + full_path false end else false end end

entorno / producción.rb

config.serve_static_assets = true

Entonces, finalmente, ejecuté los rake assets:precompile RAILS_ENV=production y lo empujé a heroku y funcionó.


Es posible que esto no responda a la causa raíz de la pregunta original, pero estaba teniendo un síntoma similar con una causa raíz diferente.

La asset_path("my_image.jpeg") de un archivo JPEG cambia la extensión de archivo a JPG, lo que significa que asset_path("my_image.jpeg") y asset_path("my_image") no funcionó. Retire la "e" de JPEG y listo, funciona.

Otros han descrito el mismo problema aquí https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/

¿Es esto un error? O el comportamiento deseado? Y también es extraño que solo no funcione en mi entorno de producción alojado en Heroku. Quizás tengan algún tipo de configuración.


Este fue un problema con el Heroku Ruby Buildpack, pero hoy se implementó una actualización (2013-05-21). Pruébelo y avísenos.

Para responder tu pregunta:

# 1) Esto es salida de piñones; las cosas se compilan en /tmp y luego se mueven (Ver aquí en Sprockets ). Que yo sepa, esto siempre se ha hecho de esta manera, pero no fue hasta que la versión de Sprockets se actualizó en Rails que obtuvimos este nuevo resultado de tipo de depuración.

# 2) assets:precompile anteriores assets:precompile generó un archivo manifest.json , pero ahora en Rails 4 el archivo de manifiesto tiene una huella digital que no se detectó previamente. Esto fue arreglado con github.com/heroku/heroku-buildpack-ruby/pull/74 .


Lo agregué a la parte superior de uno de mis archivos css.scss en la carpeta assets / stylesheets /.

@import "font-awesome";

luego corrió ..

rake assets:clean

y...

rake assets:precompile RAILS_ENV=production


Los complementos de activos de Heroku ya no funcionan porque Rails 4 no admite complementos. Necesitas usar gemas de activos de Heroku en su lugar. Coloque esto en su Gemfile:

group :production do gem ''rails_log_stdout'', github: ''heroku/rails_log_stdout'' gem ''rails3_serve_static_assets'', github: ''heroku/rails3_serve_static_assets'' end

Sigue la guía de Heroku sobre cómo comenzar con Rails 4.

Actualización (22/07/2013): Heroku ahora proporciona una gema diferente para precompilar los activos.

group :production do gem ''rails_12factor'' end


Me encuentro exactamente en el mismo problema.

Configuré config.serve_static_assets = true en mi archivo environments / production.rb hasta que heroku no sea compatible con el nuevo formato de manifiesto.

Por lo tanto, es una solución temporal hasta que se agregue el soporte heroku.


Necesita configurar Rails para servir activos estáticos en production: config / environments / production.rb

SampleApp::Application.configure do . . . config.serve_static_assets = true . . . end

ACTUALIZAR:

En Rails 4 está en desuso, y ha sido cambiado por:

config.serve_static_files = true


Necesitaba usar esta joya:

gem ''rails_12factor'', group: :production #need this for rails 4 assets on heroku

Y en /config/environments/production.rb necesitaba configurar:

config.assets.compile = true

rails_12_factor gema rails_12_factor establece config.serve_static_assets = true , entre otras cosas.


Si está utilizando activos específicos del controlador como en:

<%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %>

Luego, en producción, tendrá que precompilarlos explícitamente (en los raíles de desarrollo compila archivos sobre la marcha).

Consulte la guía oficial de Rails aquí: http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets

Para precompilar como se explica en las guías (aquí: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets ), deberá agregar lo siguiente a config / application.rb

# config/application.rb config.assets.precompile << Proc.new do |path| if path =~ //.(css|js)/z/ full_path = Rails.application.assets.resolve(path).to_path app_assets_path = Rails.root.join(''app'', ''assets'').to_path if full_path.starts_with? app_assets_path puts "including asset: " + full_path true else puts "excluding asset: " + full_path false end else false end end


Me imagino que agregaré esto como una respuesta ya que esta pregunta está vinculada desde la página de Soporte de Heroku si busca "assets" .

Esto es principalmente para personas que están actualizando su aplicación a Rails 4, pero después de pasar por esto y muchas otras publicaciones SO, lo que finalmente me consiguió fue cambiar lo siguiente en production.rb :

config.action_dispatch.x_sendfile_header = "X-Sendfile"

A:

config.action_dispatch.x_sendfile_header = nil

No había captado esto cuando me actualicé y, como de costumbre, esto me llevó mucho tiempo para descubrirlo. ¡Espero que ayude a alguien más! a que preguntó / contestó lo mismo en su question .


Usar extensiones de imagen

Tuve este mismo problema, pero por una razón diferente.

En lugar de

<%= asset_path ''facebook-link'' %>

Utilizar:

<%= asset_path ''facebook-link.png'' %>

Mientras que el primero funcionó a nivel local, cuando presioné a Heroku mis imágenes se estaban rompiendo y no tenía idea de por qué. Usar la extensión de archivo completa solucionó el problema :)