【问题标题】:Use rake namespace as configuration?使用 rake 命名空间作为配置?
【发布时间】:2016-03-22 11:04:34
【问题描述】:

我正在尝试创建一个包含用于使用我的 API 的任务的 rake 文件。我希望能够向任务传递大量参数,具体取决于要使用的调用。为了使任务更易于使用,我希望命名空间成为配置的一部分。这可能吗?

namespace :myAPI do

    SERVER = 'local'
    namespace :live do
        SERVER = 'live'
    end
    namespace :beta do
        SERVER = 'beta'
    end

    BASE_URI = {
        live: "https://myapi.com/do/v1",
        beta: "https://beta.myapi.com/do/v1",
        local: "http://127.0.0.1:4500/do/v1"
    }

    desc 'Get currently logged users'
    task :extract_logged_users => :environment do
        get("BASE_URI[SERVER]/users/current")
    end

}

然后我希望能够在实时服务器上运行它,例如:

rake myAPI:live:extract_logged_users

【问题讨论】:

  • 好吧,如果这样写,任务extract_logged_users仍然只定义在myAPI命名空间中。此外,通过这种方式,您可以多次重新定义 SERVER 常量(并且 rake 会发出警告)。
  • 也许您可以在主myAPI 命名空间中定义您的任务,然后在所有子命名空间中动态定义相同的任务。这些动态任务只会设置所需的变量并调用invoke("myAPI:the_task"),即主命名空间中的任务。

标签: ruby-on-rails ruby namespaces rake


【解决方案1】:

您可以像这样以更动态的方式创建任务:

require 'rake'
BASE_URI = {
    live: "https://myapi.com/do/v1",
    beta: "https://beta.myapi.com/do/v1",
    local: "http://127.0.0.1:4500/do/v1"
}.each do |server,url|
  namespace :myAPI do
    namespace server do |ns|
      desc 'Get currently logged users'
      task :extract_logged_users do
          puts 'get("%s/users/current", %s)' % [server,url]
      end
    end
  end
end

(我将您的 get 命令替换为 puts 以检查发生了什么并将 url 添加到命令中)。

现在你可以打电话了:

rake myAPI:live:extract_logged_users
rake myAPI:beta:extract_logged_users
rake myAPI:local:extract_logged_users

输出:

get("live/users/current", https://myapi.com/do/v1)
get("beta/users/current", https://beta.myapi.com/do/v1)
get("local/users/current", http://127.0.0.1:4500/do/v1)

替代编码:

namespace :myAPI do

    BASE_URI = {
        live: "https://myapi.com/do/v1",
        beta: "https://beta.myapi.com/do/v1",
        local: "http://127.0.0.1:4500/do/v1"
    }

    BASE_URI .keys.each do |key|
      namespace key do |ns|
        desc 'Get currently logged users'
        task :extract_logged_users do
           puts 'get("%s")' % BASE_URI[key]
        end
      end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多