ruby-on-rails - rails - the asset is not present in the asset pipeline
Deshabilitar el almacenamiento en caché de activos de Sprockets en desarrollo (3)
Estoy usando Rails 3.2.13 y el Oleoducto de activos de Rails. Quiero usar Asset Pipeline para poder usar SASS y CoffeeScript y ERB para mis activos y hacer que Pipeline los compile automáticamente, por lo que no puedo desactivar el pipeline en desarrollo. No estoy precompilando activos en desarrollo nunca y ni siquiera hay un directorio public/assets/
.
Sin embargo, cuando realizo cambios en un archivo incluido, como en un archivo _partial.html.erb
que se incluye (representa) en un archivo layout.html.erb
, sin cambiar el archivo, incluyéndolo (en este ejemplo de layout.html.erb
), Sprockets no detecta el cambio e invalida el caché, por lo que sigo obteniendo el mismo archivo obsoleto. Cuando hago esto en desarrollo activo, quiero deshabilitar cualquier almacenamiento en caché de activos para poder obtener los cambios en cada solicitud, pero no puedo averiguar cómo hacerlo. He establecido todo lo siguiente en mi development.rb
:
config.action_controller.perform_caching = false
config.action_dispatch.rack_cache = nil
config.middleware.delete Rack::Cache
config.assets.debug = true
config.assets.compress = false
config.cache_classes = false
Aún así, incluso con esto, los archivos se muestran en tmp/cache/assets/
y tmp/cache/sass/
y los cambios no están disponibles en futuras solicitudes. En este momento tengo que eliminar manualmente esos directorios cada vez que quiero ver un cambio.
Desafortunadamente, todo el contenido de la sección Cómo funciona el almacenamiento en caché de la Guía de RoR para el inventario de activos es:
Sprockets utiliza el almacén de caché de Rails predeterminado para almacenar en caché los activos en desarrollo y producción.
TODO: Agregar más sobre el cambio de la tienda por defecto.
Entonces, ¿cómo puedo hacer que Sprockets compile los activos a pedido pero no almacene en caché los resultados?
Aquí está el encantamiento mágico:
config.assets.cache_store = :null_store # Disables the Asset cache
config.sass.cache = false # Disable the SASS compiler cache
La canalización de activos tiene su propia instancia de caché y la configuración de config.assets.cache = false
no hace nada, por lo que debe configurar su caché para que sea el null_store
para deshabilitarlo.
Incluso entonces, el compilador SASS tiene su propio caché, y si necesita deshabilitarlo, debe deshabilitarlo por separado.
Creé el siguiente gist ( https://gist.github.com/metaskills/9028312 ) que hace justamente esto y descubrí que es la única manera que funciona para mí.
# In config/initializers/sprockets.rb
require ''sprockets''
require ''sprockets/server''
Sprockets::Server.class_eval do
private
def headers_with_rails_env_check(*args)
headers_without_rails_env_check(*args).tap do |headers|
if Rails.env.development?
headers["Cache-Control"] = "no-cache"
headers.delete "Last-Modified"
headers.delete "ETag"
end
end
end
alias_method_chain :headers, :rails_env_check
end
La respuesta aceptada no es hacerlo correctamente y degrada el rendimiento en el desarrollo al deshabilitar totalmente la memoria caché. Respondiendo a su pregunta original, desea que se realicen cambios en los archivos de referencia para invalidar la caché de activos, incluso si no se incluyen directamente.
La solución es simplemente declarando tal dependencia, de modo que las ruedas dentadas sepan que la memoria caché debe ser invalidada:
# layout.html.erb
<% depend_on Rails.root.join(''app'').join(''views'').join(''_partial.html.erb'') %>
# replace the above with the correct path, could also be relative but didn''t try