the rails present not images asset application ruby-on-rails asset-pipeline ruby-on-rails-4 sprockets

ruby on rails - present - rake assets: precompile: nodigest en Rails 4



the asset "application.css" is not present in the asset pipeline. (6)

En Rails 3 había un rastrillo de activos: precompilar: tarea de nodigest que estaba compilando activos y escribirlos sin la parte de resumen en el directorio / public / assets. En Rails 4, esto se ha eliminado y, de forma predeterminada, todos los activos se precompilan con solo resumen. Por varias razones, también necesito una versión no digerida de algunos de los activos. ¿Hay alguna manera fácil de habilitar el comportamiento anterior?


La versión de sprockets-rails utilizada en Rails 4.0.0 ya no admite activos no digeridos.

Léame de Per sprocket-rails :

Solo las compilaciones digieren nombres de archivo. Los activos estáticos no digeridos deberían simplemente vivir en público

Por lo tanto, los activos que deben ser estáticos se pueden poner manualmente en su carpeta public . Si necesita copiar recursos compilados como archivos SCSS, etc., esta tarea de rake puede ayudar ( fuente ):

task non_digested: :environment do assets = Dir.glob(File.join(Rails.root, ''public/assets/**/*'')) regex = /(-{1}[a-z0-9]{32}*/.{1}){1}/ assets.each do |file| next if File.directory?(file) || file !~ regex source = file.split(''/'') source.push(source.pop.gsub(regex, ''.'')) non_digested = File.join(source) FileUtils.cp(file, non_digested) end end


Como sugirió la mejor respuesta, le recomiendo leer el tema primero para comprender completamente la historia de fondo, si no tiene prisa. Me gusta más esta idea, https://github.com/rails/sprockets-rails/issues/49#issuecomment-24837265 .

Y debajo está mi opinión personal, básicamente tomé el código de la respuesta anterior. En mi caso, solo tengo 2 archivos que quiero que no sean digeridos, widget.js y widget.css. Así que utilizo el método de piñones para encontrar los archivos digeridos y luego un enlace simbólico a la carpeta pública.

# config/environments/production.rb config.assets.precompile += %w[v1/widget.js v1/widget.css] # lib/tasks/assets.rake namespace :assets do desc ''symlink digested widget-xxx.js and widget-xxx.css to widget.js and widget.css'' task symlink_widget: :environment do next if Rails.env.development? || Rails.env.test? digested_files = [] # e.g. /webapps/myapp/public/assets assets_path = File.join(Rails.root, ''public'', Rails.configuration.assets.prefix) %w(v1/widget.js v1/widget.css).each do |asset| # e.g. ''v1/widget-b61b9eaaa5ef0d92bd537213138eb0c9.js'' logical_path = Rails.application.assets.find_asset(asset).digest_path digested_files << File.join(assets_path, logical_path) end fingerprint_regex = /(-{1}[a-z0-9]{32}*/.{1}){1}/ digested_files.each do |file| next unless file =~ fingerprint_regex # remove fingerprint & ''/assets'' from file path non_digested = file.gsub(fingerprint_regex, ''.'') .gsub(Rails.configuration.assets.prefix, '''') puts "Symlinking #{file} to #{non_digested}" system "ln -nfs #{file} #{non_digested}" end end end



Mi enorme análisis de todas las opciones disponibles está aquí:

https://bibwild.wordpress.com/2014/10/02/non-digested-asset-names-in-rails-4-your-options/

Decidí agregar una tarea de rake personalizada, utilizando la configuración personalizada para determinar ciertos activos para producir como versiones no digeridas, y utilizando el manifiesto de Piñones para encontrar los activos digeridos y copiarlos con nombres no digeridos.

https://github.com/team-umlaut/umlaut/blob/5edcc609389edf833a79caa6f3ef92982312f0c5/lib/tasks/umlaut_asset_compile.rake

# Rails4 doesn''t create un-fingerprinted assets anymore, but we # need a couple for umlaut''s API. Let''s try to hook in and make # symlinks. # # list of what file(globs) need non-digest-named copies is kept in # Umlaut::Engine.config.non_digest_named_assets # defined in lib/umlaut.rb, but app can modify it if desired. require ''umlaut'' require ''pathname'' # Every time assets:precompile is called, trigger umlaut:create_non_digest_assets afterwards. Rake::Task["assets:precompile"].enhance do Rake::Task["umlaut:create_non_digest_assets"].invoke end namespace :umlaut do # This seems to be basically how ordinary asset precompile # is logging, ugh. logger = Logger.new($stderr) # Based on suggestion at https://github.com/rails/sprockets-rails/issues/49#issuecomment-20535134 # but limited to files in umlaut''s namespaced asset directories. task :create_non_digest_assets => :"assets:environment" do manifest_path = Dir.glob(File.join(Rails.root, ''public/assets/manifest-*.json'')).first manifest_data = JSON.load(File.new(manifest_path)) manifest_data["assets"].each do |logical_path, digested_path| logical_pathname = Pathname.new logical_path if Umlaut::Engine.config.non_digest_named_assets.any? {|testpath| logical_pathname.fnmatch?(testpath, File::FNM_PATHNAME) } full_digested_path = File.join(Rails.root, ''public/assets'', digested_path) full_nondigested_path = File.join(Rails.root, ''public/assets'', logical_path) logger.info "(Umlaut) Copying to #{full_nondigested_path}" # Use FileUtils.copy_file with true third argument to copy # file attributes (eg mtime) too, as opposed to FileUtils.cp # Making symlnks with FileUtils.ln_s would be another option, not # sure if it would have unexpected issues. FileUtils.copy_file full_digested_path, full_nondigested_path, true end end end end


Establezca esta propiedad config.assets.digest = false en el archivo `development.rb ''


Gracias, Dylan Markow, sigo su respuesta, pero descubrí que hay varias versiones de un activo (por ejemplo, aplicación-0a * .css, aplicación-9c * .css, ...) cuando se utiliza Capistrano para que la última sea no digerido Aquí la lógica es:

namespace :my_app do task non_digested: :environment do assets = Dir.glob(File.join(Rails.root, ''public/assets/**/*'')) regex = /(?<!manifest)(-{1}[a-z0-9]{32}/.{1}){1}/ candidates = {} # gather files info assets.each do |file| next if File.directory?(file) || file !~ regex source = file.split(''/'') source.push(source.pop.gsub(regex, ''.'')) non_digested = File.join(source) file_mtime = File.stat(file).mtime c = candidates[non_digested] if c.blank? || file_mtime > c[:mtime] candidates[non_digested] = {orig: file, mtime: file_mtime} end end # genearate for non_digested, val in candidates do FileUtils.cp(val[:orig], non_digested) end end end Rake::Task[''assets:precompile''].enhance do Rake::Task[''my_app:non_digested''].invoke end

Tan bueno como, apliqué el comentario de expresiones regulares de 907th, y add hook, esta tarea se ejecuta después de la precompilación.