【问题标题】:Capistrano Capfile: what does >load 'deploy' do?Capistrano Capfile:>load 'deploy' 是做什么的?
【发布时间】:2013-10-23 21:31:32
【问题描述】:

运行 capify 后,默认的 Capfile 总是以:

load 'deploy'  

当我 >puts $" 时,我在加载路径上看不到 deploy.rb 文件,但我假设这会加载 capistrano 附带的默认部署配方?

【问题讨论】:

  • load 的行为记录在 here

标签: ruby-on-rails ruby capistrano


【解决方案1】:

来自Ruby Standard library documentation for Kernel.load

加载(文件名,换行=假)→ 真

加载并执行文件filename 中的Ruby 程序。如果文件名不解析为绝对路径,则在 $: 中列出的库目录中搜索该文件。如果可选的 wrap 参数为 true,则加载的脚本将在匿名模块下执行,保护调用程序的全局命名空间。在任何情况下,加载文件中的任何局部变量都不会传播到加载环境。

load 'deploy' 完全符合您的想象,它从 Capistrano 中加载 deploy.rb

【讨论】:

  • 所以在 Capfile 中如果我这样做: puts $: 它没有列出一个名为 deploy.rb 的文件,这就是我感到困惑的原因。我在 /capistrano-2.13.5/lib/capistrano/recipes/deploy.rb 的 capistrano gems 目录中找到了一个 deploy.rb,但它不在 lib 路径上。
  • 嗯,是否递归加载搜索?这是在加载路径上:vendor/bundle/ruby/1.9.1/gems/capistrano-2.13.5/lib,有问题的文件是 vendor/bundle/ruby/1.9.1/gems/capistrano-2.13.5/ lib/capistrano/recipes/deploy.rb?
  • 我讨厌显得固执,但食谱目录不在 GEM_PATH 中。当您说“当然”时,您是在说“加载”从 .../capistrano-2.13.5/lib 递归搜索以在食谱下找到 deploy.rb?
  • 是的,而且“在 Ruby 中加载 Gems 是如何工作的”是一个非常非常广泛地被问及并回答的问题。它与 Capistrano 没有任何特别的关系,所有的宝石都以这种方式工作。它还与捆绑器的工作方式有关。
  • 好的,所以在调查加载 Gems 之后,我发现它不是递归的。因此,如果 '.../capistrano-2.13.5/lib' 在 $LOAD_PATH 上,要加载/需要 capistrano 的 deploy.rb,则意味着您需要 >load 'capistrano/recipes/deploy' 但不知何故它可以通过只是在做 >load 'deploy'