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 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 ' /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 ' /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
我四处寻找可能遇到同样问题的人,似乎在任何地方都没有任何问题或意见……
老实说,我甚至不确定sprockets
, sprockets-rails
是如何sprockets-rails
相关的。 这对我来说非常困惑……例如,新的Rails 4.2.1
应用程序附带的默认Gemfile
说Gemfile.lock
允许使用sprockets 3.0.0,但是当你转到链轮2-> 3升级指南时,它表明//= include
已被删除,但它正好在application.js
文件中。
所以,也许我错过了一些东西,但我不太清楚如何解决这个问题。
问题很容易解决,但我认为首先我们应该解决其他一些问题。
sprockets
是一个ruby库,可以自动管理Web前端资产(CSS,JS,图像等)。
它基于这样的想法:在开发过程中保持资源文件的逻辑组织 ,然后在部署到生产之前对它们进行链接和缩小 。 链轮使这个过程自动化。
Rails 3.1(很久以前,现在)发布了一个名为“Asset Pipeline”的新function,它可以自动管理Web资产。 Rails的资产管道过去是,现在仍然是由sprockets
提供动力。
sprockets
和rails
都是主动维护和开发的库。 新版本发布了新function和重大变化。
我相信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*'
意味着capistrano
试图在RAILS_ROOT/public/assets
目录中找到manifest
文件。 通配符在那里因为它可能是manifest.json
或manifest.yml
,具体取决于Rails的版本。
此外, stat
意味着capistrano
正试图从文件中获取一些信息,可能是为了弄清楚它是最近的。
问题是该文件不存在。
您应该预编译资产 ,然后提交生成的文件并尝试再次部署。
如果您使用的是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'