Capistrano 3 + Sprockets 3 + Rails 4.2.1 不会部署?

Capistrano 3 + Sprockets 3 + Rails 4.2.1 won't deploy?

我 运行 bundle update 并将 sprockets 更新为 3.0.0.

当我尝试通过 Capist运行o 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 deploy@xx.xxx.xxx.xx
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 deploy@xx.xxx.xxx.xxx: 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 deploy@xx.xxx.xxx.xxx: 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

我四处寻找可能有同样问题的人,似乎没有任何问题或评论...

老实说,我什至不确定 sprocketssprockets-rails 与 rails 有何关系。这让我很困惑......例如,默认的 Gemfile 附带一个新的 Rails 4.2.1 应用程序说 Gemfile.lock 允许 sprockets 3.0.0,但是当你去链轮 2->3 升级指南,它显示 //= include 已被删除,但它就在 application.js 文件中。

所以,也许我遗漏了什么,但我不太确定如何解决这个问题。

这个问题很容易解决,但我认为首先我们应该解决其他一些问题。

sprockets 是一个 ruby 库,可自动管理 Web 前端资产(CSS、JS、图像等)。

它基于在开发中保持您的资产文件逻辑组织,然后在部署之前链接和缩小它们的想法生产。 Sprockets 使这个过程自动化。

Rails 3.1(很久以前,现在)发布了一个名为 "Asset Pipeline" 的新功能,可以自动管理 Web 资产。 Rails' Asset Pipeline 过去和现在都由 sprockets 提供支持。

sprocketsrails 都是积极维护和开发的库。发布了具有新功能和重大更改的新版本。
我相信 Rails 默认情况下不使用最新版本的 sprockets。没关系,我们这里说的是编译CSS和JS,而不是和一些外部交互API;即使是旧版本的 sprockets 也能胜任。
这意味着更新 sprockets 不是一个好主意。 Rails 的每个版本都声明了 sprockets 的特定(最小-最大)版本,这是有充分理由的:这是当前资产管道所依赖的版本。更新它可能会破坏事情。

然后,让我们转到清单文件。
默认情况下,在 预编译 资产(解析引用,包括一些文件到其他文件,链接和缩小它们)之后,编译的资产被复制到 RAILS_ROOT/public/assets 中。使用它们,Rails 生成一个 manifest 文件,其中包含所有预编译资产的列表。在你的 Rails 版本中,它应该是 manifest.json,但它曾经是 manifest.yml

现在,最后一块拼图是 capistrano,我想您知道如何使用它。

行:

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

表示 capistrano 试图在您的 RAILS_ROOT/public/assets 目录中找到一个 manifest 文件。存在通配符是因为它可能是 manifest.jsonmanifest.yml,具体取决于 Rails.
的版本 此外,stat 意味着 capistrano 正在尝试从文件中获取一些信息,可能是为了弄清楚它是最近的。

问题是文件不存在。
您应该 precompile the assets,然后 提交生成的文件 并再次尝试部署。

如果您正在使用 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

根据评论,我通过从 1.1.2 -> 1.1.3

升级 capistrano-rails 来解决这个问题
# Gemfile
'capistrano-rails', '~> 1.1.3'