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
También hay una gema para hacer esto por ti: los activos no estúpidos de resumen, algo provocativamente nombrados.
gem "non-stupid-digest-assets"
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.
# 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.