使用 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:migrate
或 cap 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”
Rails 3 -- Bundler/Capistrano 错误
/usr/bin/env ruby 没有这样的文件或目录:使用 capistrano 3、capistrano/rbenv、capistrano/bundler 和 capistrano/rail