Capistrano 3 + Sprockets 3 + Rails 4.2.1 не будет использоваться?
Я запустил bundle update
и обновил sprockets
до 3.0.0.
Когда я пытаюсь развернуть через Capistrano 3, я получаю следующую ошибку:
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
Я искал все вокруг, чтобы люди, возможно, имели одинаковые проблемы, и кажется, что в нем нет никаких проблем или комментариев...
Честно говоря, я даже не уверен, как sprockets
, sprockets-rails
связаны с рельсами. Все это довольно запутанно для меня... например, по умолчанию Gemfile
, который поставляется со свежим Rails 4.2.1
приложением, говорит, что sprockets 3.0.0 разрешено в Gemfile.lock
, но когда вы переходите на звездочки 2- > 3 обновления guide, он показывает, что //= include
был удален, но он находится прямо в файле application.js
.
Итак, может быть, я что-то упустил, но я не совсем уверен, как это решить.
Ответы
Ответ 1
Проблема легко исправить, но я думаю, что сначала мы должны рассмотреть некоторые другие вопросы.
sprockets
- это рубиновая библиотека, которая автоматизирует управление основными компонентами веб-интерфейса (CSS, JS, изображения и т.д.).
Он основан на идее сохранения логических элементов ваших активов в процессе разработки, а затем для их цепочки и минимизации перед развертыванием в производство. Sprockets делает этот процесс автоматическим.
Rails 3.1 (давным-давно, теперь) выпустила новую функцию под названием "Asset Pipeline", которая автоматизировала управление сетевыми ресурсами. Консолидация ресурсов Rails была и остается на питание от sprockets
.
Оба sprockets
и rails
активно поддерживают и развивают библиотеки. Новые версии выпущены с новыми функциями и нарушением изменений.
Я считаю, что Rails по умолчанию не использует последнюю версию sprockets
. Это нормально, мы говорим о компиляции CSS и JS здесь, не взаимодействуя с каким-то внешним API; даже старая версия sprockets
может выполнить эту работу.
Это означает, что обновление sprockets
не является хорошей идеей. Каждая версия Rails объявляет конкретную (min-max) версию sprockets
по уважительной причине: это версия, на которую опирается текущая линия Asset Pipeline. Обновление этого может нарушить ситуацию.
Затем перейдите в файл манифеста.
По умолчанию, после предварительной компиляции активов (разрешение ссылок, включая некоторые файлы в другие, их объединение и их минимизация), скомпилированные активы копируются в RAILS_ROOT/public/assets
. С ними Rails генерирует файл manifest
, который содержит список всех предварительно скомпилированных активов. В вашей версии Rails она должна быть manifest.json
, но она была manifest.yml
.
Теперь последний фрагмент головоломки - capistrano
, который, я думаю, вы знаете, как использовать.
Строка:
cp: cannot stat ‘/var/www/testapp/releases/20150414002210/public/assets/manifest*’
означает, что capistrano
попытался найти файл manifest
в вашем каталоге RAILS_ROOT/public/assets
. Подстановочный шаблон там, потому что он может быть либо manifest.json
, либо manifest.yml
, в зависимости от версии Rails.
Кроме того, stat
означает, что capistrano
пытается получить некоторую информацию из файла, возможно, чтобы выяснить, насколько она известна.
Проблема в том, что файл отсутствует.
Вы должны прекомпилировать активы, затем зафиксировать сгенерированные файлы и попробуйте снова установить.
Ответ 2
Если вы используете capistrano-rails
, попробуйте обновить до 1.1.3
. Это исправило проблему для меня.
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
за комментарий, я исправил это, обновив capistrano-rails от 1.1.2 -> 1.1.3
# Gemfile
'capistrano-rails', '~> 1.1.3'