使用 Capistrano 3 设置默认阶段

Posted

技术标签:

【中文标题】使用 Capistrano 3 设置默认阶段【英文标题】:Set default stage with Capistrano 3 【发布时间】:2014-01-27 05:11:10 【问题描述】:

有没有办法在 Capistrano 3 中设置默认阶段?

我尝试将set :stage, :production 放入 deploy.rb 中,但没有成功,它给出了错误:

Stage not set, please call something such as `cap production deploy`,
where production is a stage you have defined

我现在只有一个阶段,所以我希望能够运行 cap deploy 并让它在默认情况下执行。

【问题讨论】:

我今天要添加同样的问题,但我想我找不到一些基本的、明显的选项,不幸的是,它似乎不是那么明显(真的很奇怪),而且几乎没有关于 v3 的文档。 【参考方案1】:

capistrano 3.6+ 的新答案: 最好使用invoke :production unless Rake.application.options.show_tasks 来避免使用cap -T 时会收到的警告

【讨论】:

必须将其添加到 Capfile 的末尾而不是开头。【参考方案2】:

旧的解决方案在 Capistrano 3 中适用于我:

cap --version
#=> Capistrano Version: 3.3.5 (Rake Version: 10.4.2)

在这些行之后的Capfile 的最顶部

# Load DSL and Setup Up Stages
require 'capistrano/setup'

添加:

set :stage, :production

然后在没有指定阶段的情况下照常运行您的任务:

cap foo:bar

【讨论】:

cap foo:bar 是什么意思? 这只是一个任务的示例名称。例如示例 (!),它可以是 cap deploy:migratecap cache:clear【参考方案3】:

您可以将以下行添加到您的 deploy.rb,这将阻止 Capistrano 期待一个阶段:

set :stages, ["production"]

【讨论】:

【参考方案4】:

cd进入RAILS根目录后,发出命令:

cap development deploy

似乎有效。早些时候我在 app/models 文件夹中,发出命令时返回此错误:

Stage not set, please call something such as cap production deploy, where production is a stage you have defined.

【讨论】:

【参考方案5】:

Capistrano v3 在某种程度上是 Rake 的封装,因此您需要意识到真正发生的事情是首先运行 production 任务,然后是 deploy 任务。

如果你稍微调试一下,你会发现deploy.rb 在你不输入阶段时不会被加载。这是因为阶段的任务是加载deploy.rb 的位置:查看lib/setup.rb,为每个阶段定义了一个任务。运行时,stage 的任务设置 :stage,加载 capistrano 默认值,最后加载您的 deploy.rb 文件。

因此,一个简单的技巧是告诉 Capistrano 在您每次运行 cap 时调用舞台任务,方法是将其添加到您的 Capfile 的末尾(不是您的 deploy.rb) :

Rake::Task[:production].invoke

或者,使用 Capistrano 的 DSL 中的 invoke 方法:

invoke :production

如果您确实使用了多个阶段,这可能会产生一些意想不到的后果,但如果您只使用过production 阶段,它应该可以正常工作。

另一个简单的解决方案可能是一个简单的 shell 别名,例如 alias cap='cap production',但如果您有多个具有不同阶段名称的项目,它可能效果不佳。

【讨论】:

谢谢,这很有帮助。我以前从未使用过 Rake,但认为阅读 Rake 文档以更好地理解 capistrano 3 可能会有所帮助。

以上是关于使用 Capistrano 3 设置默认阶段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 为 capistrano 3.8.0 运行“cap production deploy”时不知道如何构建任务“start”

Capistrano多服务器配置

如何从 Capistrano 运行 rake 任务?

捆绑安装不适用于 capistrano

Rails 3 -- Bundler/Capistrano 错误

/usr/bin/env ruby​​ 没有这样的文件或目录:使用 capistrano 3、capistrano/rbenv、capistrano/bundler 和 capistrano/rail