ruby-on-rails - 命名空间下的 Rake 任务变量

标签 ruby-on-rails ruby rake rake-task

今天我在我的佣金脚本中看到了一件奇怪的事情。我在不同的命名空间下有两个 Rake 任务,如下所示:

path = "/home/tomcat/tomcat"

namespace :stage do
  path = "/home/tomcat/stage-tomcat"
  desc "Deploys a java application to stage tomcat"
  task :java_deploy do
    puts path # stage:java_deploy should print /home/tomcat/stage-tomcat
  end
end

namespace :production do
  path = "/home/tomcat/production-tomcat"
  desc "Deploys a java application to production tomcat"
  task :java_deploy do
    puts path # production:java_deploy should print /home/tomcat/production-tomcat
  end
end

当我运行:rake stage:java_deploy 它打印

/home/tomcat/production-tomcat

我期待 /home/tomcat/stage-tomcat。如果我从 rake 文件中删除第一行 path = "/home/tomcat/tomcat" ,它会按预期工作。

知道为什么要使用 kolavari 吗? :)

提前致谢!

最佳答案

这不是 Rake 特有的,它只是词法范围和 Ruby 处理局部变量的方式的结果,在第一次使用时声明它们。

首先你给path赋值:

path = "/home/tomcat/tomcat"

然后创建 stage 命名空间并重新分配变量:

path = "/home/tomcat/stage-tomcat"

请注意,无论您指定什么任务,都会执行此行,因为它不在任何任务中。

接下来创建 java_deploy 任务,但它还没有运行。此任务引用 path 变量,但是当调用该任务时,它的值可能已更改。

稍后,在定义 production 命名空间时,此变量再次被重新分配。重要的是,这仍然是同一个变量:

path = "/home/tomcat/production-tomcat"

任务真正运行时,指的是path变量,这个变量的值为最新分配给它的值,即/home/tomcat/production-tomcat

当您删除对 path 的第一个赋值时,该变量将不存在于顶层。这意味着当您在每个命名空间定义中分配给 path 时,您在每种情况下都声明了一个新的(和单独的)局部变量。

关于ruby-on-rails - 命名空间下的 Rake 任务变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30328197/

相关文章:

ruby-on-rails - 两种不同的布局,每种布局有一个样式表

ruby-on-rails - ruby/rails 中的自然语言日期?

ruby-on-rails - 在哪里放置 Rails Controller 的 Ruby 辅助方法?

javascript - 浏览器使用缓存的 JavaScript Assets ,尽管它们在 Rails 3.1 中被修改

ruby-on-rails - rake 数据库 :create Not working

javascript - 在 haml javascript block 中插入 ruby​​ if 语句

ruby-on-rails - 自定义 Rails 验证未将 'field_with_errors' 包装器添加到输入

ruby-on-rails-3 - 已初始化常量 RUBY : heroku rake db:migrate logs show both 1. 9.2 和 1.9.1

sql - 如何使用 hstore 进行 IN 查询?

ruby-on-rails - Rake Gems 安装错误