रेक में नेमस्पेस के लिए डिफ़ॉल्ट कार्य


87

कुछ इस तरह दिया:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end

मैं :allडिफ़ॉल्ट कार्य कैसे कर सकता हूं , ताकि रनिंग rake my_tasksइसे कॉल करेगा (कॉल करने के बजाय rake my_tasks:all)?


क्या आपने नेमस्पेस में डिफ़ॉल्ट डालने की कोशिश की है (कार्य: डिफ़ॉल्ट =>: सभी)
जिम डेविल

जिम क्या वर्णन करता है, केवल डिफ़ॉल्ट कार्य नामस्थान के बाहर जाता है और इसमें नाम और कार्य नाम शामिल होना चाहिए। (कार्य: डिफ़ॉल्ट => "my_tasks: all") एक कार्यशील उदाहरण के लिए नीचे मेरा उत्तर देखें।
रैंडी एपिंगर

जवाबों:


86

इसे इस तरह नामस्थान के बाहर रखें:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :all => ["my_tasks:foo", "my_tasks:bar"]

इसके अलावा ... यदि आपके कार्यों के लिए तर्कों की आवश्यकता होती है:

namespace :my_tasks do
  task :foo, :arg1, :arg2 do |t, args|
    do_something
  end

  task :bar, :arg1, :arg2  do |t, args|
    do_something_else
  end

end

task :my_tasks, :arg1, :arg2 do |t, args|
  Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
  Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end

ध्यान दें कि कैसे दूसरे उदाहरण में आप कार्य को नामस्थान के समान नाम कह सकते हैं, अर्थात 'my_tasks'


4
वह केवल इसे उपलब्ध होने के लिए कहते हैं rake all। इस मामले में, मैं, अन्य नामस्थान है तो क्या मैं चाहता हूँ कार्य कॉल करने के लिए सक्षम होने के लिए है my_tasks:allके रूप में rake my_tasksके रूप में नहीं, rake all
हेलडर एस रिबेरो

53
तो फिर बस का उपयोग करें: कार्य: my_tasks => [ "my_tasks: foo", "my_tasks: बार"]
ज़ीमॉन Lipinski

2
उपोन ने सिमन की टिप्पणी के लिए मतदान किया, मैं भूल गया था कि यह मैं ऐसा कैसे करता हूं।
जिम डेविल

51

बहुत सहज नहीं है, लेकिन आपके पास एक नाम स्थान और एक कार्य हो सकता है जिसका एक ही नाम हो, और यह प्रभावी रूप से आपको वही देता है जो आप चाहते हैं। उदाहरण के लिए

namespace :my_task do
  task :foo do
    do_foo
  end
  task :bar do
    do_bar
  end
end

task :my_task do
  Rake::Task['my_task:foo'].invoke
  Rake::Task['my_task:bar'].invoke
end

अब आप जैसे चाहे कमांड चला सकते हैं,

rake my_task:foo

तथा

rake my_task

3
यह बहुत अच्छा है और प्रश्न में बताई गई सभी आवश्यकताओं को शामिल करता है।
इवर

1
मुझे लगता है कि आह्वान अत्यधिक जटिल है और यह सिर्फ कार्य निर्भरता होना चाहिए:task :my_task => ['my_task:foo', 'my_task:bar']
अलेक्जेंडर प्रेबर

8

मेरा सुझाव है कि यदि आप नाम स्थान में बहुत सारे कार्य हैं, तो इसका उपयोग करें।

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end

और फिर आप सभी कार्यों को नामस्थान में रखकर चला सकते हैं:

rake my_tasks

इसके साथ, आपको अपने कार्य को बदलने की आवश्यकता नहीं है: जब आप उस नाम स्थान पर नए कार्य जोड़ते हैं तो सभी कार्य।


3

मैं इस Rakefile का उपयोग खीरे के लिए करता हूं:

require 'cucumber'
require 'cucumber/rake/task'

namespace :features do
  Cucumber::Rake::Task.new(:fast) do |t|
    t.profile = 'fast'
  end

  Cucumber::Rake::Task.new(:slow) do |t|
    t.profile = 'slow'
  end

  task :ci => [:fast, :slow]
end

task :default => "features:ci"

फिर अगर मैं टाइप करूँ तो:

rake

यह डिफ़ॉल्ट कार्य चलाता है, जो तेज और धीमी दोनों परीक्षाओं को चलाता है।

मैंने चेज़ी के ब्लॉग से इसे सीखा ।


3

जिस तरह से मैं obvio171 के प्रश्न को पढ़ रहा हूं वह यह है कि वह 1) एक व्यवस्थित कार्य के लिए नामस्थान में किसी कार्य को एक कार्य के रूप में लागू करने के लिए कह रहा है ।

मैं अक्सर एक ही जरूरत का सामना करना पड़ा है। मुझे नामस्थानों में तार्किक रूप से समूह कार्यों को पसंद है। अक्सर वह समूह एक पदानुक्रम जैसा दिखता है। इसलिए समूह को आमंत्रित करने की इच्छा मेरे लिए बहुत मायने रखती है।

यहाँ मेरा ले रहा है:

module Rake::DSL
  def group(name, &block)
    ns = namespace name, &block
    default = ns[:default]
    task name => "#{name}:default" if default
    ns
  end
end

group :foo do
  task :foo1 do |t| puts t.name end
  task :foo2 do |t| puts t.name end
  task :default => [:foo1, :foo2]
end

task :default => :foo

1) ... या पूछ रहा था, सालों पहले। बहरहाल, अभी भी एक दिलचस्प सवाल है।


1

नाम के बाहर निम्नलिखित कार्य जोड़ें:

desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]

ध्यान रखें, कि आप नाम के समान नाम के साथ कोई कार्य कर सकते हैं।

और एक बड़ा उदाहरण छिपाते हैं, जो दिखाता है कि आप कार्यों का उपयोग कैसे कर सकते हैं, जिनका नामस्थान के समान नाम है, यहां तक ​​कि नेमस्पेस के नामकरण भी:

namespace :job1 do
  task :do_something1 do
        puts "job1:do_something1"
    end

  task :do_something2 do
        puts "job1:do_something2"
    end
  task :all => [:do_something1, :do_something2]
end

desc "Job 1"
task :job1 => ["job1:all"]

# You do not need the "all"-task, but it might be handier to have one.
namespace :job2 do
  task :do_something1 do
        puts "job2:do_something1"
    end

  task :do_something2 do
        puts "job2:do_something2"
    end
end

desc "Job 2"
task :job2 => ["job2:do_something1", "job2:do_something2"]

namespace :superjob do
    namespace :job1 do
        task :do_something1 do
            puts "superjob:job1:do_something1"
        end

        task :do_something2 do
            puts "superjob:job1:do_something2"
        end
    end

    desc "Job 1 in Superjob"
    task :job1 => ["job1:do_something1", "job1:do_something2"]

    namespace :job2 do
        task :do_something1 do
            puts "superjob:job2:do_something1"
        end

        task :do_something2 do
            puts "superjob:job2:do_something2"
        end
    end

    desc "Job 2 in Superjob"
    task :job2 => ["job2:do_something1", "job2:do_something2"]
end

desc "My Super Job"
task :superjob => ["superjob:job1", "superjob:job2"]

# Do them all just by calling "$ rake"
task :default => [:job1, :job2, :superjob]

बस इसे कॉपी करें और इसे आज़माएं।


0

रॉकी में नाम स्थान के लिए रॉकी समाधान डिफ़ॉल्ट कार्य पर आधारित है

और इस निपुणता का उत्तर क्या वर्तमान रेक कार्य को जानने का एक तरीका है?

namespace :root do
  namespace :foo do
  end

  namespace :target do
    task :all do |task_all|
      Rake.application.in_namespace(task_all.scope.path) do |ns|
        ns.tasks.each { |task| task.invoke unless task.name == task_all.name } 
      end
    end

    task :one do
    end

    task :another do
    end
  end
end

0

सिजमन लिपिस्की और श्याम हैबरकडा के उत्तरों को मिलाकर, मुझे लगता है कि यह सबसे मुहावरेदार और स्पष्ट जवाब है:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

end

task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]

आपको rake my_tasksउप-मुखौटे के बोझिल आह्वान से बचने के दौरान करने की अनुमति देता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.