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

Tal*_*boy 14 ruby capistrano ruby-on-rails ruby-on-rails-4 capistrano3

我跑了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 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
Run Code Online (Sandbox Code Playgroud)

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

老实说,我甚至不确定如何sprockets,sprockets-rails与铁轨有关.这对我来说非常困惑......例如,GemfileRails 4.2.1应用程序附带的默认值表示允许使用链轮3.0.0 Gemfile.lock,但是当您转到链轮2-> 3升级指南时,它会显示//= include已删除,但它就在application.js文件中.

所以,也许我错过了一些东西,但我不太清楚如何解决这个问题.

max*_*gry 22

如果您正在使用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
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!!!对于像我这样的其他假人 - 在gemfile中设置版本直接为宝石'capistrano-rails','〜> 1.1.3' (3认同)

tom*_*ave 7

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

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

它基于这样的想法:在开发过程中保持资产文件的逻辑组织,然后在部署到生产之前对它们进行链接和缩小.链轮使这个过程自动化.

Rails 3.1(很久以前,现在)发布了一个名为"Asset Pipeline"的新功能,它可以自动管理Web资产.Rails的资产管道曾经并且仍然是由sprockets.

双方sprocketsrails积极维护和开发库.新版本发布了新功能和重大变化.
我相信Rails默认不使用最新版本的sprockets.没关系,我们在这里讨论编译CSS和JS,而不是与一些外部API交互; 即使是旧版本也sprockets可以完成这项工作.
这意味着更新sprockets不是一个好主意.每个版本的Rails都声明了一个特定的(最小 - 最大)版本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*’
Run Code Online (Sandbox Code Playgroud)

意味着capistrano尝试manifestRAILS_ROOT/public/assets目录中查找文件.通配符在那里因为它可能是manifest.json或者manifest.yml,取决于Rails的版本.
此外,stat意味着capistrano试图从文件中获取一些信息,可能是为了弄清楚它是最近的.

问题是该文件不存在.
您应该预编译资产,然后提交生成的文件并尝试再次部署.

  • 实际上,您不需要在本地预编译资产,然后将它们提交到存储库.这是一个错误,capistrano-rails的人现在正在研究它:https://github.com/capistrano/rails/pull/112&https://github.com/capistrano/rails/issues/111无论如何,拇指得到这样详细的答案! (12认同)
  • 为了扩展@mid的评论,发生了什么是sprocket 3.0.0 [引入了一个更改](https://github.com/rails/sprockets/commit/ce6508e8540f829c6221afa39fdf718e4dded096),它将manifest.json中的清单文件重命名为.sprockets-的manifest.json.我们正在更新capistrano-rails以检查两个文件名并使用它找到的任何一个. (4认同)