有没有办法在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
并让它在默认情况下执行。
答案 0 :(得分:32)
Capistrano v3在某种程度上是Rake的包装器,所以你需要意识到真正发生的事情是先运行production
任务,然后执行deploy
任务。
如果稍微调试一下,当你没有输入某个阶段时,你会发现deploy.rb
没有被加载。这是因为阶段的任务是加载deploy.rb
:查看lib/setup.rb
,为每个阶段定义一个任务。运行时,舞台的任务集:stage
,加载capistrano默认值,然后最终加载deploy.rb
文件。
所以,一个简单的伎俩就是告诉Capistrano每次运行cap
时调用阶段任务,将其添加到Capfile
的末尾(不你的deploy.rb
):
Rake::Task[:production].invoke
或者,使用Capistrano的DSL中的invoke
方法:
invoke :production
如果您确实使用多个阶段,这可能会产生一些意想不到的后果,但如果您只使用production
阶段,它应该可以正常工作。
另一个简单的解决方案可能是一个简单的shell别名,例如alias cap='cap production'
,但如果您有多个具有不同阶段名称的项目,它可能不会很好。
答案 1 :(得分:3)
在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.
答案 2 :(得分: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
答案 3 :(得分:1)
capistrano 3.6+的新答案:
最好使用<Marker
title={marker.id}
id={marker.id}
position={marker.position}
isOpen={marker.isOpen}
onClick={
() => {
props.handleMarkerTap(marker)
console.log(marker.id+" is "+marker.isOpen);
// Call the setState method to cause a re-render. Pass a
// copy (achieved via [... ] syntax) of the markers array
// to setState to ensure that react sees the markers array
// as a new array rather than a reference to the same array
// (this also encourages react to re-render)
this.setState({ markers : [...this.state.markers] })
}
}>
来避免使用invoke :production unless Rake.application.options.show_tasks
答案 4 :(得分:-1)
您可以将以下行添加到deploy.rb中,这会阻止Capistrano预期某个阶段:
set :stages, ["production"]