如何在 Rake 中将参数从父任务传递到子任务?

发布于 2024-08-27 14:55:31 字数 532 浏览 6 评论 0原文

我正在编写一个 Rake 脚本,其中包含带有参数的任务。我弄清楚了如何传递参数以及如何使任务依赖于其他任务。

task :parent, [:parent_argument1, :parent_argument2, :parent_argument3] => [:child1, :child2] do
  # Perform Parent Task Functionalities
end

task :child1, [:child1_argument1, :child1_argument2] do |t, args|
  # Perform Child1 Task Functionalities
end

task :child2, [:child2_argument1, :child2_argument2] do |t, args|
  # Perform Child2 Task Functionalities
end
  • 我可以将参数从父任务传递给子任务吗?
  • 有没有办法让子任务成为私有任务,这样它们就不能被独立调用?

I am writing a Rake script which consists of tasks with arguments. I figured out how to pass arguments and how to make a task dependent on other tasks.

task :parent, [:parent_argument1, :parent_argument2, :parent_argument3] => [:child1, :child2] do
  # Perform Parent Task Functionalities
end

task :child1, [:child1_argument1, :child1_argument2] do |t, args|
  # Perform Child1 Task Functionalities
end

task :child2, [:child2_argument1, :child2_argument2] do |t, args|
  # Perform Child2 Task Functionalities
end
  • Can I pass the arguments from the parent task to the child tasks?
  • Is there a way to make the child tasks as private so they can't be called independently?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

桃扇骨 2024-09-03 14:55:31

我实际上可以想到三种在 Rake 任务之间传递参数的方法。

  1. 使用 Rake 的内置参数支持:

    # 接受参数 :one 并依赖于 :second 任务。
    任务:第一个,[:一个] => :第二次做 |t, args|
      放置 args.inspect # => '{:一=> “一” }'
    结尾
    
    # 参数 :one 是从任务 :first 自动传递的。
    任务:第二个,:一个做|t,args|
      放置 args.inspect # => '{:一=> “一” }'
    结尾
    
    $先耙[一]
    
  2. 通过 Rake::Task#invoke

    # 接受参数 :one、:two 并将它们传递给 :second 任务。
    任务 :first, :one, :two 做 |t, args|
      放置 args.inspect # => '{:一=> “1”,:二=> “2”}'
      任务(:第二个).invoke(args[:one], args[:two])
    结尾
    
    # 接受通过 #invoke 传递的参数 :third, :fourth。
    # 请注意,参数是按位置而不是名称传递的。
    任务:第二,:第三,:第四做|t,args|
      放置 args.inspect # => '{:第三=> “1”,:第四=> “2”}'
    结尾
    
    $ 首先耙子[1, 2]
    
  3. 另一个解决方案是猴子补丁 Rake 的主要应用程序对象 Rake::应用程序
    并用它来存储任意值:

    类 Rake::Application
      attr_accessor:我的数据
    结尾
    
    任务:第一个=> :第二次做
      放置 Rake.application.my_data # => “第二”
    结尾
    
    任务:第二个=> :第三次做
      放置 Rake.application.my_data # => “第三”
      Rake.application.my_data = "第二个"
    结尾
    
    任务:第三次做
      Rake.application.my_data = "第三个"
    结尾
    
    $先耙
    

I can actually think of three ways for passing arguments between Rake tasks.

  1. Use Rake’s built-in support for arguments:

    # accepts argument :one and depends on the :second task.
    task :first, [:one] => :second do |t, args|
      puts args.inspect  # => '{ :one => "one" }'
    end
    
    # argument :one was automagically passed from task :first.
    task :second, :one do |t, args|
      puts args.inspect  # => '{ :one => "one" }'
    end
    
    $ rake first[one]
    
  2. Directly invoke tasks via Rake::Task#invoke:

    # accepts arguments :one, :two and passes them to the :second task.
    task :first, :one, :two do |t, args|
      puts args.inspect  # => '{ :one => "1", :two => "2" }'
      task(:second).invoke(args[:one], args[:two])
    end
    
    # accepts arguments :third, :fourth which got passed via #invoke.
    # notice that arguments are passed by position rather than name.
    task :second, :third, :fourth do |t, args|
      puts args.inspect  # => '{ :third => "1", :fourth => "2" }'
    end
    
    $ rake first[1, 2]
    
  3. Another solution would be to monkey patch Rake’s main application object Rake::Application
    and use it to store arbitary values:

    class Rake::Application
      attr_accessor :my_data
    end
    
    task :first => :second do
      puts Rake.application.my_data  # => "second"
    end
    
    task :second => :third do
      puts Rake.application.my_data  # => "third"
      Rake.application.my_data = "second"
    end
    
    task :third do
      Rake.application.my_data = "third"
    end
    
    $ rake first
    
蘑菇王子 2024-09-03 14:55:31

设置属性似乎也很有魅力。

只需确保将任务依赖项设置为设置您需要的属性的任务即可。

# set the attribute I want to use in another task
task :buy_puppy, [:name] do |_, args|
  name = args[:name] || 'Rover'
  @dog = Dog.new(name)
end

# task I actually want to run
task :walk_dog => :buy_puppy do
  @dog.walk
end

Setting attributes seems to work like a charm too.

Just ensure the the task dependency is set to the task that sets the attributes you need.

# set the attribute I want to use in another task
task :buy_puppy, [:name] do |_, args|
  name = args[:name] || 'Rover'
  @dog = Dog.new(name)
end

# task I actually want to run
task :walk_dog => :buy_puppy do
  @dog.walk
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文