2013-07-08 28 views
11

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

25

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.

mỗi sprocket-rails's Readme:

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 
+0

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

+3

Tôi khuyên bạn nên sử dụng regex: /(? 907th

2

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 
+0

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

8

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" 
+1

Đây phải là câu trả lời được chấp nhận. Cảm ơn @AlexC. –

+0

ngay cả sau khi cài đặt đá quý này tôi đã nhận được tài sản tiêu hóa. – vipin8169

+0

đặt config.assets.digest = false này trong tệp development.rb – vipin8169

1

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.

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 
0

Thiết lập thuộc tính config.assets.digest = false này trong `development.rb' tập tin

1

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.

+1

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 =/(?

Các vấn đề liên quan