Capistrano中current_path与release_path的区别?

时间:2014-06-18 00:41:59

标签: ruby-on-rails capistrano

Capistrano中current_pathrelease_path路径变量之间的区别是什么,如

task :path do
    on roles :app do
        puts "Release path: #{release_path}"
        puts "Current path: #{current_path}"
    end
end

current_path是否始终包含最新代码?

2 个答案:

答案 0 :(得分:3)

由于这还没有得到满意的答案,我将添加我发现的内容。

查看this blog post,我们可以看到路径变量指向的位置:

  

current_path - deploy_to + current_dir的路径(例如/ u / apps / example / current)   release_path - releases_path + release_name的路径(例如/ u / apps / example / releases / 20100624000000)

所以回答你的问题:是的,current_path确实指向最新的代码(最新的部署)。它通过符号链接指向最新版本目录。如果您对所有文件夹的含义感兴趣,请查看capistrano structure

release_path的区别在于它指向您当前正在部署的版本的路径。如果要在部署期间引用repo中的文件(例如运行脚本),这将非常有用。

但是,release_path仅在deploy:starting命名空间内更新,在任何其他时间,它与current_path完全相同。 有关详细信息,请参阅此github isssue

我的特定用例是,我想使用位于我的回购根目录中的composer install运行composer.phar。所以,在the documentation之后我做了这个:

SSHKit.config.command_map[:composer] = "#{release_path}/composer.phar"

但这不起作用,因为在定义时,release_path仍然指向current_path

我找到的解决方法来自this answer,并且可以懒惰地评估release_path

SSHKit.config.command_map[:composer] = lambda { "#{release_path}/" + fetch(:src_path) + "/composer.phar" }

只要在deploy:starting命名空间后访问变量,release_path就会按照我们的预期设置。

答案 1 :(得分:-2)

每次使用Capistrano部署Rails应用程序时,都会在Releases目录中使用较新版本的文件名创建一个新目录。该目录包含最新的代码。并且current symlink directory将指向运行应用程序的最新创建目录。

任务rake,bundle等将在共享路径目录上运行,该目录创建单独的目录

我们可以恢复使用rollback命令的版本,例如

 cap deploy:rollback # capistrano 2
 cap stage_name rollback  #capistrano 3

希望它对你有所帮助。