2012-07-10 30 views

Trả lời

5

Ngắn: Bạn không thể.

Trong khi biên dịch trước Rails đi qua tệp Application.js và hợp nhất tất cả các lần nhập thành một tệp để chỉ thay đổi một tệp đơn giản là không thể do nén đi vào đó. (Nó không làm bất cứ điều gì với các tệp không được tham chiếu từ application.js)

Tiếp theo: Bạn không cần phải chạy tài sản rake: biên dịch trước trong quá trình phát triển khi thực hiện sửa lỗi nhanh. Chỉ khi triển khai ở đâu (tùy thuộc vào sự kiên nhẫn của bạn), sẽ không có vấn đề gì khi chạy nhiệm vụ 5 phút.

Bạn nên sử dụng môi trường phát triển trong quá trình phát triển nơi biên dịch tài sản là không cần thiết vì Rails sẽ phân phát nội dung chưa được rút gọn và chưa được rút gọn. Nếu bạn đang chạy Rails xây dựng trong máy chủ web thông qua rails s này nên theo mặc định, nhưng bạn có thể bắt đầu một cách rõ ràng server ray sử dụng:

rails s RAILS_ENV=development

Nếu tài sản vẫn không được hiển thị một cách chính xác hoặc bạn nhìn thấy lỗi đảm bảo bạn có config.assets.debug = true

+0

cách tránh sự cần thiết phải chạy tài sản rake: biên dịch trước? – Paul

5

@Tigraine là một phần chính xác. Các tài sản Rails 3.1+ được Rails và quản lý hoàn toàn theo mặc định tất cả nội dung sẽ được biên dịch xuống một js và một nội dung css.

TUY NHIÊN ...

Biên soạn xuống đến một tài sản duy nhất dựa trên việc sử dụng một biểu hiện tài sản (application.js và application.css) được xử lý bởi các đá quý Bánh răng. Theo mặc định, các tệp kê khai này bao gồm chỉ thị require_tree và đó là chỉ thị bao gồm tất cả các tệp. Nếu bạn loại bỏ chỉ thị đó, bạn phải làm nhiều hơn một chút để có được tài sản của bạn được biên dịch.

Nếu bạn muốn xây dựng các tài sản riêng biệt, bạn có thể đặt tùy chọn cấu hình trong application.rb.

config.assets.precompile += %w(additional/asset.css funky/stuff.js) 

Dòng trên sẽ thêm các tập tin bổ sung/asset.css và funky/stuff.js đến danh sách của file sẽ được tạo ra khi các tài sản này được biên dịch sẵn (Lưu ý rằng '+ =' là đang được sử dụng để mở rộng danh sách mặc định). Để rõ ràng nhất có thể, điều này có nghĩa là bạn sẽ có bốn phần tử được biên dịch trước: application.js, funky/stuff.js, application.css và các tệp bổ sung/asset.css.

Điều đó nói rằng, bạn có thể muốn xem đá quý the guard-rails-assets. Đá quý linh hoạt theo cách nó hỗ trợ biên dịch trước; biên dịch trước tài sản chỉ thay đổi là có thể. Tôi đã nghe một số phản hồi tốt về nó nhưng không sử dụng nó bản thân mình.

+0

Cảm ơn, đã giải quyết được vấn đề của tôi với RefineryCMS không sử dụng application.js. http://stackoverflow.com/q/24023256/148844 – Chloe

3

@Tigraine không chính xác.

Có thể, bạn chỉ cần tạo thư mục và đặt các tệp css vào chúng và nhập tệp đó vào các tệp khác nhau trong thư mục nội dung.

Giống như

application.css 
*= require_self 
*= require foundation_and_overrides 
*= require reset 
*= require_tree ./screen 

đâu Screen là một thư mục tôi đã đặt bên trong thư mục stylesheet. như assets/stylesheets/screen/. Tôi gọi application.css với

<%= stylesheet_link_tag "application", media: "screen, projection" %> 

Bây giờ, nếu bạn muốn tạo một tập tin css duy nhất cho một bố trí bạn tạo rằng dưới assets/stylesheets

Giống như xxx.css

Nếu bạn cần nhiều file cho xxx bạn làm theo các bước tương tự như trên nhưng phần quan trọng ở đây là bạn thêm dòng này vào

production.rb

config.assets.precompile += %w(xxx.css) 

Sau đó, bên trong bố trí bạn thêm:

<%= stylesheet_link_tag "xxx", media: "screen, projection" %> 
+0

Làm thế nào để bạn sử dụng config.assets.precompile nếu bạn có scss liên quan. Cũng là một đường dẫn thư mục cần thiết, nó ở đâu? Chúng tôi có một css email cụ thể mà chúng tôi muốn không được bao gồm trong application.css làm phong cách của nó chỉ dành cho tất cả các email. Chúng tôi có một email.css.scss trong ~/app/assets/stylesheets/thư mục bằng cách sử dụng Rails 3.2 và đường dẫn nội dung. Chúng tôi có thiết lập sẵn và cdn cho sản xuất. Tôi đã thử thêm dòng này tuy nhiên nó không hoạt động, không biên dịch email. Ngoài ra có vẻ như capistrano chỉ làm tài sản biên dịch trên máy web, nhưng email chạy trên máy công việc bị trì hoãn ... – bjm88

12

Nếu bạn muốn precompile chỉ là một tập tin, bạn có thể làm một công việc tùy chỉnh cào để làm như vậy khá dễ dàng.

namespace :assets do 

    desc "compile one js file" 

    task :compile_one_file => :environment do 
    dest = "#{Rails.root}/vendor/assets/javascripts/compiled/" 
    js_asset = "your_jsfile.js" 
    File.write(dest + js_asset, Uglifier.compile(Rails.application.assets.find_asset(js_asset).to_s)) 
    end 

end 

sau đó từ dòng lệnh

rake assets:compile_one_file 

Hope this helps, tôi thấy hữu ích này cho nhà cung cấp js file mà tôi không thay đổi thường xuyên như jquery và jquery plugin. Bằng cách đó khi im trong phát triển nó tăng tốc độ tải trang của tôi giữ đường ống tài sản từ việc phải định tuyến tất cả các yêu cầu riêng biệt cho các tập tin nhà cung cấp của tôi. Nó chỉ phục vụ một tập tin js được rút gọn của tất cả các js nhà cung cấp của tôi.

+0

Tôi nhận được unglialized hằng số Uglifier – bjm88

+0

bạn sẽ cần phải cài đặt đá quý, và sau đó yêu cầu nó trong tập tin rake của bạn để sử dụng thư viện Uglifier. –

2

Bạn có thể thực hiện việc này hoàn toàn mà không cần Rails. Điều này có thể làm cho mọi thứ chạy nhanh hơn tùy thuộc vào môi trường của bạn.

quick_compile.rb

require 'sprockets' 

sprocket = Sprockets::Environment.new 
sprocket.js_compressor = :uglifier # or read off config yml 
sprocket.append_path('app/assets/javascripts') # the directory that holds you js src. 

file = File.new('test_min.js','w+') # the output file path. 
file.puts(sprocket.find_asset('test.js')) # the file to complie 
file.close 

Nếu bạn chỉ muốn evalute các // = yêu cầu tuyên bố, bạn có thể xóa các thiết lập js_compressor. Sprocket sẽ ghép các tập tin cần thiết.

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