Trong Rails 3 có một tài sản cào: biên dịch trước: nhiệm vụ nodigest được biên dịch tài sản và viết chúng mà không có phần tiêu hóa trong/public/assets directory. Trong Rails 4, điều này đã được gỡ bỏ, và theo mặc định, tất cả các tài sản được biên dịch trước chỉ với thông báo. Vì nhiều lý do tôi cần phiên bản không được tiêu hóa của một số nội dung. Có cách nào dễ dàng để kích hoạt lại hành vi cũ?tài sản cào: biên dịch: nodigest trong Rails 4
Trả lời
Phiên bản sprockets-rails
được sử dụng trong Rails 4.0.0 không còn hỗ trợ nội dung không tiêu hóa nữa.
Chỉ biên dịch tiêu hóa tên tập tin. Nội dung không phân loại tĩnh chỉ đơn giản là nên được hiển thị ở chế độ công khai
Vì vậy, bất kỳ nội dung nào cần tĩnh đều có thể được đưa vào thư mục public
của bạn theo cách thủ công. Nếu bạn cần phải sao chép tài sản biên soạn như file SCSS vv, nhiệm vụ cào này có thể giúp (source):
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
Như câu trả lời tốt nhất đề nghị, tôi khuyên bạn nên đi đọc vấn đề đầu tiên để hiểu đầy đủ những câu chuyện nền , nếu bạn không vội vàng. Tôi thích ý tưởng này nhất, https://github.com/rails/sprockets-rails/issues/49#issuecomment-24837265.
Và dưới đây là cá nhân của tôi, về cơ bản tôi đã lấy mã từ câu trả lời ở trên. Trong trường hợp của tôi, tôi chỉ có 2 tệp mà tôi muốn không được tiêu hóa, widget.js và widget.css. Vì vậy, tôi sử dụng phương pháp sprockets để tìm tệp được phân tích và sau đó liên kết nó với thư mục công cộng.
# 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
Cảm ơn vì điều này. Tôi đã để cho Rails.configuration.assets.prefix những thứ ở cuối nhiệm vụ của bạn để làm cho nó làm việc cho tôi. – phyzalis
Ngoài ra còn có một viên ngọc để làm điều này cho bạn: hơi khiêu khích tên non-stupid-digest-assets.
gem "non-stupid-digest-assets"
phân tích rất lớn của tôi về tất cả các tùy chọn có sẵn ở đây:
https://bibwild.wordpress.com/2014/10/02/non-digested-asset-names-in-rails-4-your-options/
tôi quyết định thêm một nhiệm vụ tùy chỉnh cào, sử dụng cấu hình tùy chỉnh để xác định tài sản nhất định để sản xuất các phiên bản như phi tiêu hóa và sử dụng biểu thức Sprockets để tìm các tài sản đã được phân tích và sao chép chúng bằng các tên không được tiêu hóa.
# 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
Thiết lập thuộc tính config.assets.digest = false
này trong `development.rb' tập tin
Cảm ơn bạn Dylan Markow, tôi làm theo câu trả lời của mình, nhưng tôi thấy rằng có một số phiên bản của một tài sản (ví dụ ứng dụng-0a * .css, ứng dụng-9c * .css, ...) khi sử dụng Capistrano sao cho mới nhất không được tiêu hóa. Tại đây, logic là:
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
Cũng như, tôi đã áp dụng nhận xét regex của 907 và thêm móc để tác vụ này thực thi sau khi biên dịch trước.
Trong Rails 4.2, thông báo của tôi là 64 ký tự, do đó cụm từ thông dụng sẽ là 'regex =/(?
- 1. tài sản cào: biên dịch trước chậm
- 2. tài sản cào biên dịch không thành công
- 3. Rails 4 Tài sản Biên dịch ngược với nhiều tệp kê khai
- 4. tài sản cào: biên dịch trước phương pháp không xác định `[] 'cho nil: NilClass
- 5. tài sản cào: biên dịch trước không hoạt động trên heroku
- 6. RoR Precompiling Tài sản thất bại trong khi tài sản cào: tiền biên dịch - trên application.js cơ bản trống
- 7. Rails Tài sản tiền biên dịch chỉ không làm việc
- 8. Rails tài sản: biên dịch trước hành vi kỳ lạ
- 9. Ruby on Rails Tài sản Rake: lỗi biên dịch
- 10. Rails 3.2.1 tài sản Heroku tiền biên dịch lỗi
- 11. ray 3.1 không thể biên dịch tài sản trên sản do tài sản chủ cấu hình
- 12. nơi nào các tài sản cào của "đường ray": biên dịch trước "mã nguồn sống?
- 13. tài sản cào: biên dịch trước cho tệp JS cụ thể
- 14. Đường dẫn tải I18n không được đặt khi chạy "tài sản bin/cào: biên dịch trước"!
- 15. Heroku luôn chạy tài sản: biên dịch trước môi trường sản xuất cho Rails 3.2
- 16. Lỗi nội dung biên dịch của Capistrano - tài sản: biên dịch trước: nondigest?
- 17. Rails biên dịch trước liên tục uninitialized
- 18. Lỗi để precompile tài sản với cào 10.1.0
- 19. Rails javascript_include_tag 4 tạo "/ javascript /" thay vì "/ tài sản" trong sản xuất
- 20. Rails 3.1 biên dịch tài sản - bao gồm tất cả các tập tin javascript
- 21. Ruby on Rails 3.1 tài sản: biên dịch trước và hình ảnh
- 22. Rails biên dịch tài sản cả khi có và không có md5 băm, tại sao?
- 23. tài sản bó exec rake: biên dịch trước
- 24. Nâng cấp lên Rails 3.1.0 từ RC6, tiền biên dịch tài sản không
- 25. đường ray 4 hình ảnh tài sản nhà cung cấp đường ống nội dung không được biên dịch trước
- 26. Rails 3.2.1, tài sản được biên dịch trước hai lần khi triển khai?
- 27. Đường dẫn tài sản Rails: biên dịch thành nhiều bảng định kiểu
- 28. Hiệu suất kém thời gian của 'tài sản cào: precompile'
- 29. Xung đột Heroku giữa các nội dung gzipping và biên dịch trước các tài sản
- 30. điểm IMAGE_TAG tài sản/trong Rails 3
Chỉ cần thử điều này và hoạt động như một sự quyến rũ. Cảm ơn rất nhiều! – Zbyszek
Tôi khuyên bạn nên sử dụng regex: /(? 907th