2015-04-14 20 views
14

Tôi chạy bundle update và cập nhật sprockets thành 3.0.0.Capistrano 3 + Sprockets 3 + Rails 4.2.1 sẽ không triển khai?

Khi tôi cố gắng triển khai qua Capistrano 3 tôi nhận được lỗi sau:

INFO [e54ac5ca] Running /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup as [email protected] 
DEBUG [e54ac5ca] Command: cd /var/www/testapp/releases/20150414002210 && /usr/bin/env cp /var/www/testapp/releases/20150414002210/public/assets/manifest* /var/www/testapp/releases/20150414002210/assets_manifest_backup 
DEBUG [e54ac5ca] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [e54ac5ca] : No such file or directory 
DEBUG [d2c5a990] cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 
DEBUG [d2c5a990] : No such file or directory 
cap aborted! 
SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:16:in `rescue in block (2 levels) in execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute' 
SSHKit::Command::Failed: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/command.rb:95:in `exit_status=' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:179:in `block in _execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `tap' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:133:in `_execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:66:in `execute' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:68:in `block (5 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/abstract.rb:77:in `within' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/capistrano-rails-1.1.2/lib/capistrano/tasks/assets.rake:67:in `block (4 levels) in <top (required)>' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `instance_exec' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/backends/netssh.rb:54:in `run' 
/Users/HomeHome/.rvm/gems/ruby-2.1.3/gems/sshkit-1.7.1/lib/sshkit/runners/parallel.rb:13:in `block (2 levels) in execute' 
Tasks: TOP => deploy:assets:backup_manifest 
(See full trace by running task with --trace) 
The deploy has failed with an error: #<SSHKit::Runner::ExecuteError: Exception while executing as [email protected]: cp exit status: 1 
cp stdout: Nothing written 
cp stderr: cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’: No such file or directory 

Tôi đã nhìn khắp nơi để mọi người có thể có vấn đề tương tự và có vẻ như không có vấn đề hoặc ý kiến ​​về nó bất cứ nơi nào ...

Thành thật mà nói, tôi thậm chí không chắc chắn cách sprockets, sprockets-rails có liên quan đến đường ray. Đó là tất cả khá khó hiểu với tôi ... ví dụ, mặc định Gemfile mà đi kèm với một ứng dụng Rails 4.2.1 tươi nói sprockets 3.0.0 được cho phép trong Gemfile.lock, nhưng khi bạn đi đến sprockets 2-> 3 hướng dẫn nâng cấp, nó cho thấy rằng //= include đã bị xóa, nhưng nó nằm ngay trong tệp application.js.

Vì vậy, có thể tôi thiếu điều gì đó, nhưng tôi không hoàn toàn chắc chắn cách giải quyết vấn đề này.

Trả lời

7

Vấn đề rất dễ khắc phục, nhưng tôi nghĩ rằng trước tiên chúng ta nên giải quyết một số câu hỏi khác.

sprockets là thư viện ruby ​​tự động hóa quản lý nội dung giao diện người dùng web (CSS, JS, hình ảnh, v.v.).

Nó được dựa trên ý tưởng của việc giữ tệp nội dung của bạn logic tổ chức trong phát triển, và sau đó chuỗi và rút gọn họ trước khi triển khai vào sản xuất. Sprockets làm cho quá trình này tự động.

Đường ray 3.1 (một thời gian dài trước đây, bây giờ) đã phát hành một tính năng mới có tên "Đường ống tài sản", tự động quản lý nội dung web. Đường ống tài sản của Rails đã và vẫn được hỗ trợ bởi sprockets.

Cả sprocketsrails đều được duy trì và phát triển các thư viện. Các phiên bản mới được phát hành với các tính năng mới và thay đổi đột phá.
Tôi tin rằng Rails không sử dụng, theo mặc định, phiên bản mới nhất của sprockets. OK, chúng ta đang nói về việc biên dịch CSS và JS ở đây, không tương tác với một số API bên ngoài; ngay cả một phiên bản cũ của sprockets có thể thực hiện công việc.
Điều này có nghĩa là việc cập nhật sprockets không phải là một ý tưởng hay. Mỗi phiên bản Rails tuyên bố phiên bản cụ thể (tối thiểu) của sprockets, vì lý do chính đáng: đó là phiên bản mà Đường ống tài sản hiện tại dựa vào. Cập nhật nó có thể phá vỡ mọi thứ.

Sau đó, hãy chuyển sang tệp kê khai.
Theo mặc định, sau biên dịch trước nội dung (giải quyết tham chiếu, bao gồm một số tệp vào người khác, chuỗi và rút gọn chúng), tài sản đã biên dịch được sao chép trong RAILS_ROOT/public/assets. Với chúng, Rails tạo ra một tệp manifest chứa danh sách tất cả các tài sản biên dịch sẵn. Trong phiên bản Rails của bạn, nó phải là manifest.json nhưng đã từng là manifest.yml.

Bây giờ, phần cuối cùng của câu đố là capistrano, mà tôi tưởng tượng bạn biết cách sử dụng.

Dòng:

cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’ 

nghĩa là capistrano cố gắng để tìm một tập tin trong thư mục manifestRAILS_ROOT/public/assets của bạn. Ký tự đại diện có ở đó vì có thể là manifest.json hoặc manifest.yml, tùy thuộc vào phiên bản Rails.
Ngoài ra, stat có nghĩa là capistrano đang cố gắng lấy một số thông tin từ tệp, có thể để tìm hiểu xem nó gần đây như thế nào.

Vấn đề là tệp không có mặt.
Bạn nên precompile the assets, sau đó cam kết các tệp được tạo và cố triển khai lại.

+11

Trên thực tế bạn không cần phải tiền biên dịch tài sản tại địa phương và cam kết chúng vào kho sau đó. Đó là một lỗi và những tên tuổi capistrano đang làm việc với nó ngay bây giờ: https://github.com/capistrano/rails/pull/112 & https://github.com/capistrano/rails/issues/111 anyway , đưa ra câu trả lời chi tiết như vậy! –

+1

Ồ, thông tin tốt, cảm ơn. Khi triển khai với capistrano, tôi luôn thích chiến lược triển khai sử dụng _deploy branch_ hơn, để "các cam kết nội dung được biên dịch" sẽ không gây ô nhiễm _master_ của bạn. Ngoài ra, thường xuyên hơn không bạn sẽ triển khai vào một cụm máy chủ, và tôi thấy nó không hiệu quả để biên dịch chúng một lần nữa và một lần nữa trên mỗi máy chủ mà bạn triển khai. Ngoài ra, biên dịch trước chúng cục bộ giúp dễ dàng tự động hóa (trong nhiệm vụ triển khai giới hạn) tải chúng lên CDN. – tompave

+4

Để mở rộng nhận xét từ @mid, điều đã xảy ra là xích 3.0.0 [đã giới thiệu thay đổi] (https://github.com/rails/sprockets/commit/ce6508e8540f829c6221afa39fdf718e4dded096) nơi đổi tên tệp kê khai từ manifest.json tới .sprockets-manifest.json. Chúng tôi đang trong quá trình cập nhật capistrano-ray để kiểm tra cả tên tệp và sử dụng bất kỳ tên tệp nào tìm thấy. –

22

Nếu bạn đang sử dụng capistrano-rails, hãy thử cập nhật thành 1.1.3. Điều này đã khắc phục vấn đề cho tôi.

capistrano-rails CHANGELOG:

1.1.3 (Apr 18 2015) 
- Fixed no_release behaviour (https://github.com/capistrano/rails/pull/95) 
- Allow assets manifest backup with folder "manifests" (https://github.com/capistrano/rails/pull/92) 
- Handle Sprocket 3 manifest filename 
+3

cảm ơn bạn rất nhiều !!! cho những người giả khác như tôi - trong phiên bản gemfile đặt trực tiếp gem 'capistrano-rails', '~> 1.1.3' – kpblc

4

mỗi bình luận, tôi cố định này bằng cách nâng cấp capistrano-ray từ 1.1.2 -> 1.1.3

# Gemfile 
'capistrano-rails', '~> 1.1.3' 
Các vấn đề liên quan