2011-11-04 41 views
48

Tôi thích không phải để ghép các tệp JavaScript ở chế độ phát triển, nhưng phân phối chúng dưới dạng tệp riêng lẻ. Vì vậy, tôi cấu hình:Làm thế nào để tránh các tài sản biên dịch trước được phục vụ trong chế độ phát triển?

development.rb:

config.assets.compress = false 
config.assets.debug = true 
config.assets.compile = true 

Trong tôi/app/tài sản/javascript thư mục tôi có:

  • reviews.js
  • đánh giá/
    • foo.js
    • bar.js

reviews.js:

//= require jquery 
//= require jquery_ujs 
//= require_tree ./reviews 

tôi bao gồm JavaScript sử dụng <%= javascript_include_tag "reviews" %> trong cách bố trí của tôi. Trang được tạo sẽ tham chiếu chính xác ba tập lệnh riêng lẻ và reviews.js về cơ bản là trống. Càng xa càng tốt.

Bây giờ khi tôi biên dịch trước tài sản của mình cho sản xuất bằng cách sử dụng rake assets:precompile ba tệp JavaScript được nối vào reviews.js. Điều này là tất cả tốt cho sản xuất nhưng bây giờ, trong chế độ phát triển, ghép nối reviews.js được phục vụ ngoài vào hai tệp riêng lẻ.

Tất nhiên, điều này dẫn đến tất cả các loại lỗi khó chịu khi phát triển bởi vì bây giờ, nội dung của foo.jsbar.js được phân phát hai lần, một trong số đó có phiên bản cũ hơn có thể ở reviews.js.

Làm cách nào để đảm bảo Rails không sử dụng các tài sản biên dịch sẵn trong chế độ phát triển?

Trả lời

52

Có vẻ như bạn đang biên dịch trước tại địa phương. Bởi vì các tệp tồn tại ở vị trí mong đợi, chúng đang được máy chủ dev của bạn phục vụ và các yêu cầu sẽ không đến Sprockets.

Cách duy nhất để ngăn chặn điều này là xóa các tệp được biên dịch.

Thông thường bạn không cần phải biên dịch cục bộ. Dự kiến ​​trong hầu hết các trường hợp, nhiệm vụ biên dịch trước sẽ được chạy trong khi triển khai ứng dụng. Có một công thức Capistrano cho điều này trên trang hướng dẫn đường dẫn nội dung.

Nếu bạn cần phải có các tệp đó được cam kết cục bộ với repo của mình, bạn có thể sử dụng chi nhánh để tránh sự cố. Đặt chi nhánh chính của bạn cho mã sản xuất và tạo nhánh thứ hai cho dev. Chỉ biên dịch và commit tài sản trên master. Khi bạn chuyển sang dev, chúng sẽ biến mất. Hợp nhất dev thành master theo yêu cầu.

Chỉnh sửa: Đảm bảo bạn buộc trình duyệt cập nhật (control + F5) hoặc bạn có thể tìm thấy nội dung cũ được sử dụng từ bộ nhớ cache của trình duyệt!

+0

Cám ơn những lời khuyên, tôi đã xóa các tập tin biên soạn tại địa phương và cấu hình để có họ biên soạn trên git push to Heroku. –

+1

Đó là câu trả lời tôi cần. Đúng là tôi không cần những tài sản biên dịch trước đó trong khi tôi đang phát triển, nhưng khi tôi đang học cách cấu hình đường dẫn nội dung, tôi thực sự cần chúng để kiểm tra chế độ sản xuất của mình, thay vì chờ sự ngạc nhiên trên Heroku! Bây giờ tôi sẽ thay đổi tên thư mục (hoặc đặt chúng vào một nhánh git), nhưng nó vẫn là một điều đáng tiếc, đó là một điều nữa tôi cần suy nghĩ, thay vì một tùy chọn cấu hình trong env phát triển để nói "bỏ qua công chúng/tài sản thư mục "mà tôi đã hy vọng. – Phantomwhale

+1

Bạn có thể không quên xóa bộ nhớ cache của trình duyệt để trình duyệt không sử dụng ứng dụng mà bạn vô tình tải trước khi bạn rm -rf'd public/asset –

1

Tôi đã thử cách này và hoạt động.rake assets:precompile RAILS_ENV=production

tôi quan sát thấy rằng phiên bản mới của đường ống dẫn tài sản thực hiện điều này khi bạn chạy rake assets:precompile không rake assets:precompile:all

80

Trong config/environments/development.rb thiết lập:

config.assets.prefix = "/assets_dev" 

để trong phát triển Rails chế độ sẽ xem xét có (nhưng nó sẽ không tìm thấy bất cứ điều gì, vì bạn sẽ không biên dịch tài sản trong phát triển (điều này thực sự là những gì bạn đang cố gắng làm - không biên dịch tài sản)).

Khi precompiling cho sản xuất, sử dụng

RAILS_ENV=production rake assets:precompile 

nên nó biên dịch vào thư mục nội dung mặc định, public/assets.

+15

Đây phải là câu trả lời đã chọn. Tốt tìm. –

+1

Cần lưu ý rằng thay đổi này sẽ thay đổi đường dẫn "tài sản /" mà Rails sử dụng trong URL của nó, để bạn có được hình ảnh như 'http: //127.0.0.1: 3000/assets_dev/favicon.ico' –

+0

Đôi khi bạn có để biên dịch trước tài sản. Vì vậy, đây là câu trả lời tốt nhất. Nếu không, bạn sẽ cần phải tiếp tục xóa và tạo lại nội dung. –

15

trong config/environments/development.rb thiết lập:

config.serve_static_assets = false 

và không có tập tin từ /public sẽ được phục vụ

+3

lưu ý rằng mọi tệp được tải lên trong thư mục công khai sẽ không được phân phát vì vậy tốt nhất nên tránh điều này. –

+1

Trong phiên bản sau này đã được thay đổi thành 'config.serve_static_files' –

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