如何在它调用的代码中共享一个 rake 变量?

how to share a rake variable in the code it invokes?

我需要的基本上是发送目标参数并在我的 RSpec 测试中使用它,例如:

$ rake unistall_and_run[test_spec.rb]

Rakefile:

desc 'uninstall app to run tests'
  task :uninstall_and_run, [:arg] do |t, arg|
    #note this, i will explain later
    start_driver(fullReset: true)

    oi = arg.to_s.split('"')[1]
    file_dir = (project_home + '/spec/' + oi)
    exec "rspec #{file_dir}"
  end

start_driver 在那行被调用,但是当我 运行 测试(exec "rspec ...")时,它再次被调用并且我传递的参数被默认覆盖(因为它在 RSpec 配置上)。

我想做的是,在我的 RSpec 文件上检查它是否已经被调用并且不要再次 运行。

这里是 start_driver 方法:

def start_driver(options= {}) if options.empty? capabilities = caps else capabilities = caps(options) end $appium = Appium::Driver.new(caps: capabilities) $browser = $appium.start_driver Appium.promote_appium_methods RSpec::Core::ExampleGroup end

所以,我找到了一种方法。虽然它并不漂亮。当 运行 rake:

时,我用我想要的参数保存了一个文件
    desc 'uninstall app to run tests'
      task :uninstall_and_run, [:arg] do |t, arg|
        send_custom_caps(fullReset: true)
        oi = arg.to_s.split('"')[1]
        file_dir = (project_home + '/spec/' + oi)
        exec "rspec #{file_dir}"
      end

send_custom_caps方法是:

  def send_custom_caps(*opts)
    file = File.new(custom_caps_file, "w+")
    File.open(file, 'w') do |f|
      f.write(opts)
    end
  end

现在 ruby 代码本身(在本例中是我的规范配置)将检查 start_driver 之前是否有自定义参数。这是我的自定义 start_driver 方法(我已重命名):

  def start_appium_driver (options= {})
    if options.empty?
      get_caps
      if $custom_args
        capabilities = caps($custom_args)
      else
        capabilities = caps
      end
    else
      capabilities = caps(options)
    end
    $appium = Appium::Driver.new(caps: capabilities)
    $browser = $appium.start_driver
    Appium.promote_appium_methods RSpec::Core::ExampleGroup
  end

get_caps

  def get_caps
    if File.exist?(custom_caps_file) #$custom_args
      file = File.read(custom_caps_file)
      $custom_args = eval(file)
      File.delete (custom_caps_file)
    end
    $custom_args unless $custom_args.defined?
  end

这可能不是最好的解决方案,但对我来说效果不错:)