রেক টাস্কে কমান্ড লাইন আর্গুমেন্ট কীভাবে পাস করবেন


1096

আমার একটি রেক টাস্ক রয়েছে যা একাধিক ডাটাবেসে একটি মান toোকানো প্রয়োজন।

আমি এই মানটি কমান্ড লাইন থেকে, বা অন্য কোনও রেক টাস্ক থেকে রেক টাস্কে দিতে চাই।

কিভাবে আমি এটি করতে পারব?



3
দস্তাবেজগুলি সিয়াটালআরবি দ্বারা মিরর করা হয়েছে।
জোনাথন অ্যালার্ড

1
আপনি কি দয়া করে @ ব্লেয়ারঅ্যান্ডারসনের একটির কাছে গৃহীত উত্তরটি পরিবর্তন করতে পারেন, কারণ গৃহীত উত্তরটি এখন খুব পুরানো। এই প্রশ্নটির জন্য এই প্রশ্নটি গুগলে উচ্চ উপস্থিত হয়!
আরএমচারি

উত্তর:


377

বিকল্প এবং নির্ভরতা অ্যারে ভিতরে থাকা প্রয়োজন:

namespace :thing do
  desc "it does a thing"
  task :work, [:option, :foo, :bar] do |task, args|
    puts "work", args
  end

  task :another, [:option, :foo, :bar] do |task, args|
    puts "another #{args}"
    Rake::Task["thing:work"].invoke(args[:option], args[:foo], args[:bar])
    # or splat the args
    # Rake::Task["thing:work"].invoke(*args)
  end

end

তারপর

rake thing:work[1,2,3]
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

rake thing:another[1,2,3]
=> another {:option=>"1", :foo=>"2", :bar=>"3"}
=> work: {:option=>"1", :foo=>"2", :bar=>"3"}

দ্রষ্টব্য: ভেরিয়েবল taskহ'ল টাস্ক অবজেক্ট, আপনি যদি রেকে ইন্টার্নালগুলি সম্পর্কে জানেন / যত্ন না পান তবে খুব কার্যকর না।

বিক্রয় নোট:

যদি রেলগুলি থেকে কাজটি চালানো হয়, তবে নির্ভরশীল কাজগুলি => [:environment]সেটআপ করার একটি উপায় যা যুক্ত করে পরিবেশটি প্রিলোড করা ভাল ।

  task :work, [:option, :foo, :bar] => [:environment] do |task, args|
    puts "work", args
  end

28
এছাড়াও, নিশ্চিত করুন যে আপনি আর্গুমেন্টগুলির মধ্যে ফাঁকা স্থান ব্যবহার করছেন না। উদাহরণস্বরূপ rake thing:work[1, 2, 3]এটি করবেন না : এটি কাজ করবে না এবং আপনি একটি ত্রুটি পাবেনDon't know how to build task
rpbaltजार

9
এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি যুক্তিতে স্ট্রিংটি আবদ্ধ করেছেন। উদাহরণস্বরূপ আপনার কমান্ড লাইন থেকে রাক টাস্কটি চালান rake thing:work'[1,2,3]'
২৮

36
দুর্ভাগ্যক্রমে, zsh কলটি সঠিকভাবে পার্স করতে পারে না, আপনার zsh এর মতো কমান্ডটি টাইপ করতে হবে: rake thing:work\[1,2,3\]বা এটিrake 'thing:work[1,2,3]'
হুতুসি

1
@ সাকুরাশিঙ্কেন আপনি :environmentনিজের কাজ থেকে প্রতীকটি সরাতে পারেন । রেল অ্যাপ্লিকেশনগুলির একটি রয়েছে: পরিবেশগত কাজ ...
ব্লেয়ার অ্যান্ডারসন

3
এর tঅর্থ বোঝাতে কোনও নোট taskনা রেখে কেবল পরম taskনাম হিসাবে ব্যবহার করবেন না কেন ?
জোশুয়া পিন্টার

1132

টাস্ক কলে প্রতীক আর্গুমেন্ট যুক্ত করে আপনি রাকে আনুষ্ঠানিক আর্গুমেন্টগুলি নির্দিষ্ট করতে পারেন। উদাহরণ স্বরূপ:

require 'rake'

task :my_task, [:arg1, :arg2] do |t, args|
  puts "Args were: #{args} of class #{args.class}"
  puts "arg1 was: '#{args[:arg1]}' of class #{args[:arg1].class}"
  puts "arg2 was: '#{args[:arg2]}' of class #{args[:arg2].class}"
end

task :invoke_my_task do
  Rake.application.invoke_task("my_task[1, 2]")
end

# or if you prefer this syntax...
task :invoke_my_task_2 do
  Rake::Task[:my_task].invoke(3, 4)
end

# a task with prerequisites passes its 
# arguments to it prerequisites
task :with_prerequisite, [:arg1, :arg2] => :my_task #<- name of prerequisite task

# to specify default values, 
# we take advantage of args being a Rake::TaskArguments object
task :with_defaults, :arg1, :arg2 do |t, args|
  args.with_defaults(:arg1 => :default_1, :arg2 => :default_2)
  puts "Args with defaults were: #{args}"
end

তারপরে, কমান্ড লাইন থেকে:

> আমার_টাস্কটিকে রেক [1, মিথ্যা]
আরগগুলি ছিল: R: arg1 => "1",: arg2 => "মিথ্যা" class শ্রেণির রেকের :: টাস্কআর্গমেন্টস
আরজি 1 ছিল: স্ট্রিং ক্লাসের '1'
আরজি 2 ছিল: স্ট্রিংয়ের 'মিথ্যা' '

> রাক "আমার_টাস্ক [1, 2]"
আরোগুলি ছিল: {: arg1 => "1",: arg2 => "2"}

> রেক ইনভোক_মি_টাস্ক
আরোগুলি ছিল: {: arg1 => "1",: arg2 => "2"}

> রেক ইনভোক_মি_টাস্ক_2 _2
আরোগুলি ছিল: {: arg1 => 3,: আরগ 2 => 4}

> পূর্বনির্ধারিত রেক [5,6]
আরোগুলি ছিল: {: arg1 => "5",: arg2 => "6"}

> রেকর্ড_ডিফল্টস দিয়ে
ডিফল্ট সহ আর্কগুলি ছিল: {: arg1 =>: default_1,: arg2 =>: default_2}

> রেকর্ড_এফএল্টস ['x', 'y']
ডিফল্ট সহ আর্কগুলি ছিল: {: arg1 => "x",: arg2 => "y"}

দ্বিতীয় উদাহরণে প্রদর্শিত হিসাবে, আপনি যদি ফাঁকা স্থান ব্যবহার করতে চান তবে লক্ষ্য নামের চারপাশে উদ্ধৃতিগুলি ফাঁকা জায়গায় আর্গুমেন্টগুলি বিভক্ত করা থেকে রক্ষা করার জন্য প্রয়োজনীয়।

রেক.আরবি কোডটি দেখে মনে হচ্ছে যে রেক পূর্বশর্তগুলির পক্ষে যুক্তিগুলি বের করার জন্য টাস্ক স্ট্রিংগুলি বিশ্লেষণ করে না, সুতরাং আপনি এটি করতে পারবেন না task :t1 => "dep[1,2]"। একমাত্র উপায় বিভিন্ন আর্গুমেন্ট জন্য একটি পূর্বশর্ত, নির্ভরশীল কাজের কর্ম মধ্যে এটি স্পষ্টভাবে ডাকা হিসেবে হবে তা নির্দিষ্ট করার :invoke_my_taskএবং :invoke_my_task_2

মনে রাখবেন যে কয়েকটি শেল (zsh এর মতো) আপনার বন্ধনী থেকে বাঁচতে হবে: rake my_task\['arg1'\]


5
একটি নামস্থান মধ্যে একটি টাস্ক ডাকা না simpy: Rake :: টাস্ক [ 'নামস্থান: টাস্ক'] ডাকা।
gaqzi

1
এটি একটি পৃথক প্রশ্ন, ইগরু, তবে আপনার কলটি কেবল একবার চালাবার কারণ হ'ল রেক নির্ভরতা-ভিত্তিক, সুতরাং এটি প্রয়োজন হলে কেবল কোনও কাজ সম্পাদন করবে। জেনেরিক কাজের জন্য এর অর্থ যদি এটি ইতিমধ্যে চালিত না হয়। কোনও কাজ এর নির্ভরতা নির্বিশেষে পরিষ্কারভাবে সম্পাদন করতে বা যদি প্রয়োজন হয়, আহ্বানের পরিবর্তে এক্সিকিউট কল করুন।
নিক দেশজার্ডিনস

10
দ্রষ্টব্য: WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
রেক

57
লক্ষ্য করুন zsh সঠিকভাবে (কমান্ড লাইন আর্গুমেন্ট বিশ্লেষণ করতে ব্যর্থ হয় zsh: no matches found: ...তাই আপনি বন্ধনী অব্যাহতি প্রয়োজন,): rake my_task\['arg1'\]রোবট.থচটবট.কম
পোষ্ট / 18129303042/…

2
@ শেঠব্রো হ্যাঁ যদি কেবলমাত্র আপনার মন্তব্যটি "আরও মন্তব্য দেখুন" লিঙ্কের আড়ালে না লুকানো হত তবে আমি এই কাজটি করতে 10 মিনিট নষ্ট করতাম না।
জিএমএ

342

কেএইচ দ্বারা জবাব ছাড়াও (আমি কীভাবে তার পক্ষে কোনও মন্তব্য করব তা আমি খুঁজে পাইনি):

কমান্ডের ENVআগে আপনাকে ভেরিয়েবলগুলি ভেরিয়েবল হিসাবে নির্দিষ্ট করতে হবে না rake। আপনি কেবল সেটিকে সাধারণ কমান্ড লাইনের প্যারামিটার হিসাবে সেট করতে পারেন:

rake mytask var=foo

এবং আপনার রেক ফাইল থেকে এএনভি ভেরিয়েবল হিসাবে এগুলি অ্যাক্সেস করুন:

p ENV['var'] # => "foo"

2
এটি সেরা সরল উত্তর আইএমও। এটি এখনই কাজ করে। এর pঅর্থ কি?
স্টিভেক

1
@ ইউজার ৫7837 p374545৫ পছন্দ করে তবে মানটি লগ করার পরিবর্তে। রুবি
ডোক.আর.অর্গ.ওকোর

এবং ওভাররাইড পরিবেশের পরিবর্তনশীল? ফ্যান্টাস্টিক!
ড্যামিয়েন রোচে

রেক সম্পূর্ণরূপে অতিমাত্রায় জগাখিচুড়ি এবং এটিই একমাত্র উপায় যা কাজ করে। এবং এটি কেবল আমি নই, এই উত্তরের "সঠিক" উত্তরের সমান ভোট রয়েছে।
lzap

108

যদি আপনি নাম যুক্তিগুলি (যেমন স্ট্যান্ডার্ড সহ OptionParser) পাস করতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

$ rake user:create -- --user test@example.com --pass 123

নোট করুন --, এটি স্ট্যান্ডার্ড রাক আর্গুমেন্টগুলি বাইপাস করার জন্য প্রয়োজনীয়। 0.9.x , <= 10.3.x এর সাথে কাজ করা উচিত

আরও নতুন রেক এর বিশ্লেষণ পরিবর্তন করেছে --এবং এখন আপনাকে নিশ্চিত করতে হবে যে এটি OptionParser#parseপদ্ধতিতে পাস করা হয়নি , উদাহরণস্বরূপparser.parse!(ARGV[2..-1])

require 'rake'
require 'optparse'
# Rake task for creating an account

namespace :user do |args|
  desc 'Creates user account with given credentials: rake user:create'
  # environment is required to have access to Rails models
  task :create do
    options = {}
    OptionParser.new(args) do |opts|
      opts.banner = "Usage: rake user:create [options]"
      opts.on("-u", "--user {username}","User's email address", String) do |user|
        options[:user] = user
      end
      opts.on("-p", "--pass {password}","User's password", String) do |pass|
        options[:pass] = pass
      end
    end.parse!

    puts "creating user account..."
    u = Hash.new
    u[:email] = options[:user]
    u[:password] = options[:pass]
    # with some DB layer like ActiveRecord:
    # user = User.new(u); user.save!
    puts "user: " + u.to_s
    puts "account created."
    exit 0
  end
end

exit শেষে নিশ্চিত হয়ে উঠবে যে অতিরিক্ত যুক্তি রেক টাস্ক হিসাবে ব্যাখ্যা করা হবে না।

এছাড়াও আর্গুমেন্টের শর্টকাট কাজ করা উচিত:

 rake user:create -- -u test@example.com -p 123

রেক স্ক্রিপ্টগুলি যখন এ জাতীয় দেখায়, সম্ভবত এখন অন্য কোনও সরঞ্জামের সন্ধান করার সময় এসেছে যা এটিকে কেবল বাক্সের বাইরে রাখার অনুমতি দেয়।


13
আমার দৃষ্টিকোণ থেকে এটি সত্যিই সেরা উত্তর। বাইপাস এনভায়রনমেন্ট ভেরিয়েবল ক্লডেজ, টাস্ক আর্গুমেন্টের সাথে অদ্ভুত সিনট্যাক্স, স্ট্যান্ডার্ডের জন্য অতিরিক্ত সুবিধা --option-names। আমার একমাত্র পরামর্শ ব্যবহার করতে হবে exitবরং abortযেমন abortআপনি শেল 1 একটি ফিরতি কোড সহ ছাড়বে। যদি রেক টাস্কটি একটি উচ্চ-স্তরের স্ক্রিপ্টের অংশ হয় তবে শূন্য-বহির্গমন প্রস্থানটি ধরে নেওয়া আরও সাধারণভাবে ঘটে যা কিছু ধরণের ত্রুটি।
জো

1
আমি জো এর সাথে একমত, এটি সেরা উত্তর। প্রাকৃতিক জিনিস হ'ল স্ক্রিপ্টে অপশনগুলি পাস করার সময় আপনি যেমন পছন্দ করেন তেমন উপায়গুলি পাস করার জন্য একই ইন্টারফেসটি ব্যবহার করা।
রিক স্মিথ-উন্না

1
আমি সম্মত এই সেরা উত্তর। কুৎসিতকে বাইপাস করার কোনও উপায় নেই --? rakeআসল টাস্কে বা কিছু কিছুর পক্ষে যুক্তি দেওয়ার মতো ? পছন্দ task :my_task, :*args do |t, args|নাকি কিছু?
আগস্টিন রিডিংগার

1
এছাড়াও, আমি বুঝতে পারি না {username}এখানে কী আছে। এটি কোথায় ব্যবহৃত হয়? কেন সেখানে না -u {username}? চিয়ার্স
আগস্টিন রিডিংগার

2
কীভাবে রেক এআরজিভিকে পার্স করে 10.4.1এবং পরিবর্তিত হয়েছিল 10.4.2github.com/ruby/rake/commit/…
টমবার্ট

58

আমি এই দুটি ওয়েবসাইট থেকে উত্তর পেয়েছি: নেট ম্যানিয়াক এবং অ্যাম্রেড

এই কৌশলটি ব্যবহার করার জন্য আপনার কাছে রেকের সংস্করণ> 0.8 থাকতে হবে

সাধারণ রেক টাস্কের বিবরণটি হ'ল:

desc 'Task Description'
task :task_name => [:depends_on_taskA, :depends_on_taskB] do
  #interesting things
end

যুক্তিগুলি পাস করার জন্য, তিনটি জিনিস করুন:

  1. কমা দ্বারা আলাদা টাস্ক নামের পরে যুক্তির নাম যুক্ত করুন।
  2. শেষে নির্ভরতাগুলি রাখুন: প্রয়োজনগুলি => [...]
  3. স্থান | টি, আরগস | করার পরে। (টি এই কাজের জন্য অবজেক্ট)

স্ক্রিপ্টে আর্গুমেন্টগুলি অ্যাক্সেস করতে, args.arg_name ব্যবহার করুন

desc 'Takes arguments task'
task :task_name, :display_value, :display_times, :needs => [:depends_on_taskA, :depends_on_taskB] do |t, args|
  args.display_times.to_i.times do
    puts args.display_value
  end
end

কমান্ড লাইন থেকে এই টাস্কটি কল করতে, এটি [] এর মধ্যে যুক্তিগুলি পাস করুন pass

rake task_name['Hello',4]

আউটপুট হবে

Hello
Hello
Hello
Hello

এবং যদি আপনি এই কাজটি অন্য কোনও কাজ থেকে কল করতে চান এবং এটি যুক্তিগুলি পাস করতে চান তবে অনুরোধটি ব্যবহার করুন

task :caller do
  puts 'In Caller'
  Rake::Task[:task_name].invoke('hi',2)
end

তারপর আদেশ

rake caller

আউটপুট হবে

In Caller
hi
hi

নিম্নলিখিত কোডটি ভাঙ্গার সাথে সাথে নির্ভরতার অংশ হিসাবে আর্গুমেন্টগুলি পাস করার উপায় আমি খুঁজে পাইনি:

task :caller => :task_name['hi',2]' do
   puts 'In Caller'
end

15
: এই কার্যকারিতার জন্য বিন্যাস এই সতর্কবার্তা যুক্তরাষ্ট্রের মতো পরিবর্তিত হয়েছে 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
Madh

29

আর একটি সাধারণ ব্যবহৃত বিকল্প হ'ল পরিবেশের ভেরিয়েবলগুলি পাস করা। আপনার কোডে আপনি এগুলি পড়েন ENV['VAR']এবং rakeকমান্ডের ঠিক আগে এগুলি পাস করতে পারেন

$ VAR=foo rake mytask

সত্যি বলতে আমি রাক টাস্কের জন্য আশা করছিলাম - এগুলি - থেকে - একটি প্রোগ্রাম এবং আমার কাজটি এআরজিভি থেকে তাদের পেতে পারে। দুর্ভাগ্যক্রমে আমি নিশ্চিত না যে এটি সম্ভব কিনা তবে আমি বর্তমানে আপনার সমাধানটি ব্যবহার করছি: রেক ভার 1 = ভাল 1 ভার
জেসনস্মিথ

3
@jhs: rake blah -- --these --go --to --a-program(নোট --মই দিয়া আহরণ করা যে তার সুইচ শেষ বলতে), দেখতে stackoverflow.com/questions/5086224/...
মিউ খুব ছোট

28

আসলে @ নিক দেশজার্ডিনস নির্ভুল উত্তর দিয়েছেন। তবে কেবল শিক্ষার জন্য: আপনি নোংরা পদ্ধতির ব্যবহার করতে পারেন: ENVযুক্তি ব্যবহার করে

task :my_task do
  myvar = ENV['myvar']
  puts "myvar: #{myvar}"
end 

rake my_task myvar=10
#=> myvar: 10

27

আমি কীভাবে আরগস পাস করতে পারি তাও বুঝতে পারি না: পরিবেশ এটির কাজ না করা পর্যন্ত:

namespace :db do
  desc 'Export product data'
  task :export, [:file_token, :file_path] => :environment do |t, args|
    args.with_defaults(:file_token => "products", :file_path => "./lib/data/")

       #do stuff [...]

  end
end

এবং তারপরে আমি এটিকে কল করি:

rake db:export['foo, /tmp/']

23
desc 'an updated version'
task :task_name, [:arg1, :arg2] => [:dependency1, :dependency2] do |t, args|
    puts args[:arg1]
end

এটির জন্য, যেতে:rake task_name[hello, world]
ডেক্স

2
থেকে rake.rubyforge.org/files/doc/rakefile_rdoc.html "জাস্ট সতর্কতার কয়েকটি শব্দ। মই দিয়া আহরণ করা কাজের নাম ও তার আর্গুমেন্ট মই দিয়া আহরণ করা একটি একক কমান্ড লাইন আর্গুমেন্ট হতে হবে। সাধারণত কোন শূন্যস্থান মানে। তাহলে স্পেস প্রয়োজন হয় তারপর, সমগ্র মই দিয়া আহরণ করা + + যুক্তি স্ট্রিং উদ্ধৃত করা উচিত ভালো কিছু: মই দিয়া আহরণ করা "নাম [বিলি বব, স্মিথ]" "।
গেইল

19

আমি কেবল চালাতে সক্ষম হতে চেয়েছিলাম:

$ rake some:task arg1 arg2

সরল, তাই না? (নাঃ!)

রাক ব্যাখ্যা করে arg1এবং arg2কার্য হিসাবে এবং সেগুলি চালনার চেষ্টা করে। সুতরাং এটি করার আগে আমরা কেবল গর্ভপাত করি।

namespace :some do
  task task: :environment do
    arg1, arg2 = ARGV

    # your task...

    exit
  end
end

তাও, বন্ধনী!

দাবি অস্বীকার : আমি একটি সুন্দর ছোট পোষা প্রকল্পে এটি করতে সক্ষম হতে চাই। "রিয়েল ওয়ার্ল্ড" ব্যবহারের উদ্দেশ্যে নয়, যেহেতু আপনি রেকের কাজগুলি (যেমন rake task1 task2 task3) চালানোর দক্ষতা হারাচ্ছেন । আইএমও এর মূল্য নেই। কুরুচিপূর্ণ ব্যবহার করুন rake task[arg1,arg2]


3
লাগে সেসব বানাতে _, arg1, arg2 = ARGVহিসাবে প্রথম ARG মই দিয়া আহরণ করা কাজের নাম হতে দেখা গিয়েছে। তবে এটি exitএকটি ঝরঝরে কৌশল।
ফ্যাটি

rake task[arg1,arg2] && rake task2 && rake task3নিশ্চিত যে এটি চেয়ে কদর্য কম কিনা rake task[arg1,arg2] task2 task3। সম্ভবত কম দক্ষ যদিও।
নিউক্লিয়ারম্যান

_, *args = ARGVপরবর্তী সমস্ত যুক্তি ক্যাপচার জন্য উপযুক্ত! ধন্যবাদ গাদা!
এক্সট্রাস্পিলিটি

12

আমি রেক ফাইলটিতে নিয়মিত রুবি যুক্তি ব্যবহার করি:

DB = ARGV[1]

তারপরে আমি ফাইলটির নীচে রেক টাস্কগুলি আটকে রাখি (যেহেতু রেক সেই আর্গুমেন্ট নামের উপর ভিত্তি করে কোনও কাজ সন্ধান করবে)।

task :database_name1
task :database_name2

কমান্ড লাইন:

rake mytask db_name

এটি আমার কাছে var = foo ENV var এবং ক্লাসটি [blah, blah2] সমাধানগুলির চেয়ে ক্লিনার মনে করে।
স্টাবটি কিছুটা ঝাঁকুনির মতো, তবে আপনার যদি এমন কয়েকটি পরিবেশ থাকে যা এককালীন সেটআপ হয় তবে খুব খারাপ না


2
হিমায়িত স্ট্রিং বিষয়, ব্যবহার প্রতিরোধ করার জন্য dupশেষে: DB = argv [1] .dup
Juanda

db = ARGV[1].dup unless ARGV[1].nil?শূন্যতার ফাঁকে ফাঁকে ফেলার ব্যতিক্রম রোধ করার জন্য ইভেন্টটি আরও ভাল ।
আন্দ্রে ফিগুয়েরেদো

5

যুক্তি পাস করার উপায়গুলি উপরের উত্তরে সঠিক। তবে যুক্তি দিয়ে রাক টাস্ক চালানোর জন্য, রেলের নতুন সংস্করণে যুক্ত একটি ছোট প্রযুক্তি রয়েছে

এটি রেক "নেমস্পেস: টাসন নেম ['যুক্তি 1"] "নিয়ে কাজ করবে

কমান্ড লাইন থেকে টাস্কটি চালনার ক্ষেত্রে উল্টানো উদ্ধৃতিগুলি নোট করুন।


3

ডিফল্ট কার্যটিতে আর্গুমেন্টগুলি পাস করার জন্য, আপনি এর মতো কিছু করতে পারেন। উদাহরণস্বরূপ, "সংস্করণ" বলতে আপনার যুক্তি:

task :default, [:version] => [:build]

task :build, :version do |t,args|
  version = args[:version]
  puts version ? "version is #{version}" : "no version passed"
end

তারপরে আপনি এটিকে এভাবে কল করতে পারেন:

$ rake
no version passed

অথবা

$ rake default[3.2.1]
version is 3.2.1

অথবা

$ rake build[3.2.1]
version is 3.2.1

যাইহোক, তর্কগুলি পাস করার সময় আমি টাস্ক নাম (ডিফল্ট বা বিল্ড) নির্দিষ্ট করা এড়ানোর কোনও উপায় খুঁজে পাইনি। কেউ যদি কোনও উপায় জানেন তবে শুনতে ভাল লাগবে।


3

আমি আর্গুমেন্ট পাস করার জন্য "ক্যোরিস্ট্রিং" সিনট্যাক্সটি পছন্দ করি, বিশেষত যখন প্রচুর যুক্তি পাস করতে হয়।

উদাহরণ:

rake "mytask[width=10&height=20]"

"ক্যোয়ারস্ট্রিং" হচ্ছে:

width=10&height=20

সতর্কতা: নোট করুন যে বাক্য গঠনটি নাrake "mytask[foo=bar]" এবং নয় rake mytask["foo=bar"]

রেক টাস্কটি ব্যবহার করে যখন পার্স করা হয় তখন Rack::Utils.parse_nested_queryআমরা একটি পাই Hash:

=> {"width"=>"10", "height"=>"20"}

(দুর্দান্ত জিনিসটি হ্যাশ এবং অ্যারেগুলি আরও নীচে পাস করতে পারেন)

এটি কীভাবে এটি অর্জন করা যায়:

require 'rack/utils'

task :mytask, :args_expr do |t,args|
  args.with_defaults(:args_expr => "width=10&height=10")
  options = Rack::Utils.parse_nested_query(args[:args_expr])
end

এখানে আমার আরও বিলম্বিত উদাহরণ রয়েছে যা আমি আমার বিলম্বিত_জব_একটিভ_রেকর্ড_থ্রেড রত্নে রেলগুলির সাথে ব্যবহার করছি :

bundle exec rake "dj:start[ebooks[workers_number]=16&ebooks[worker_timeout]=60&albums[workers_number]=32&albums[worker_timeout]=120]"

পরিবেশ নির্ভরতার সাথে উপরের মতো একইভাবে পার্স করা হয়েছে (যাতে কারাগারের পরিবেশের চাপ লোড হয়)

namespace :dj do
  task :start, [ :args_expr ] => :environment do |t, args|
    # defaults here...
    options = Rack::Utils.parse_nested_query(args[:args_expr])  
  end
end

নিম্নলিখিতটি দেয় options

=> {"ebooks"=>{"workers_number"=>"16", "worker_timeout"=>"60"}, "albums"=>{"workers_number"=>"32", "worker_timeout"=>"120"}}

3

আপনি যদি যুক্তির অবস্থান কী তা মনে করে বিরক্ত না হয়ে থাকেন এবং আপনি রুবি যুক্তি হ্যাশের মতো কিছু করতে চান। আপনি স্ট্রিংয়ে যাওয়ার জন্য একটি যুক্তি ব্যবহার করতে পারেন এবং তারপরে সেই স্ট্রিংটিকে একটি বিকল্প হ্যাশে রূপান্তর করতে পারেন।

namespace :dummy_data do
  desc "Tests options hash like arguments"
  task :test, [:options] => :environment do |t, args|
    arg_options = args[:options] || '' # nil catch incase no options are provided
    two_d_array = arg_options.scan(/\W*(\w*): (\w*)\W*/)
    puts two_d_array.to_s + ' # options are regexed into a 2d array'
    string_key_hash = two_d_array.to_h
    puts string_key_hash.to_s + ' # options are in a hash with keys as strings'
    options = two_d_array.map {|p| [p[0].to_sym, p[1]]}.to_h
    puts options.to_s + ' # options are in a hash with symbols'
    default_options = {users: '50', friends: '25', colour: 'red', name: 'tom'}
    options = default_options.merge(options)
    puts options.to_s + ' # default option values are merged into options'
  end
end

এবং কমান্ড লাইনে আপনি পাবেন।

$ rake dummy_data:test["users: 100 friends: 50 colour: red"]
[["users", "100"], ["friends", "50"], ["colour", "red"]] # options are regexed into a 2d array
{"users"=>"100", "friends"=>"50", "colour"=>"red"} # options are in a hash with keys as strings
{:users=>"100", :friends=>"50", :colour=>"red"} # options are in a hash with symbols
{:users=>"100", :friends=>"50", :colour=>"red", :name=>"tom"} # default option values are merged into options

1
আপনার কোডের কয়েকটি ভাল-স্থাপন খালি লাইন দরকার। আমি জানি না আপনি কীভাবে সেই পাঠ্যের প্রাচীরটি পড়েন।
জোশুয়া পিন্টর

2

উপরে বর্ণিত বেশিরভাগ পদ্ধতিগুলি আমার পক্ষে কার্যকর হয়নি, সম্ভবত সেগুলি আরও নতুন সংস্করণে অবচয় করা হয়েছে। আপ-টু-ডেট গাইডটি এখানে পাওয়া যাবে: http://guides.rubyonrails.org/command_line.html#custom-rake-tasks

গাইড থেকে একটি অনুলিপি এবং পেস্ট উত্তর এখানে:

task :task_name, [:arg_1] => [:pre_1, :pre_2] do |t, args|
  # You can use args from here
end

এটি এইভাবে চাওয়া

bin/rake "task_name[value 1]" # entire argument string should be quoted

1

Traditionalতিহ্যগত আর্গুমেন্ট শৈলীর সাথে রেক টাস্কগুলি চালানোর জন্য:

rake task arg1 arg2

এবং তারপরে ব্যবহার করুন:

task :task do |_, args|
  puts "This is argument 1: #{args.first}"
end

রেক মণির নিম্নলিখিত প্যাচ যুক্ত করুন:

Rake::Application.class_eval do

  alias origin_top_level top_level

  def top_level
    @top_level_tasks = [top_level_tasks.join(' ')]
    origin_top_level
  end

  def parse_task_string(string) # :nodoc:
    parts = string.split ' '
    return parts.shift, parts
  end

end

Rake::Task.class_eval do

  def invoke(*args)
    invoke_with_call_chain(args, Rake::InvocationChain::EMPTY)
  end

end

-5

প্যারামিটারগুলি পাস করার সময়, এটি একটি বিকল্প ইনপুট ফাইলই হ'ল এটি একটি এক্সেল জেসন বা যা আপনার প্রয়োজন হতে পারে এবং সেখান থেকে প্রয়োজনীয় ভেরিয়েবলের নাম সহ আপনার প্রয়োজনীয় ডেটা স্ট্রাকচার এবং ভেরিয়েবলগুলি পড়তে পারেন। একটি ফাইল পড়ার জন্য নিম্নলিখিত কাঠামো থাকতে পারে।

  namespace :name_sapace_task do
    desc "Description task...."
      task :name_task  => :environment do
        data =  ActiveSupport::JSON.decode(File.read(Rails.root+"public/file.json")) if defined?(data)
    # and work whit yoour data, example is data["user_id"]

    end
  end

উদাহরণস্বরূপ json

{
  "name_task": "I'm a task",
  "user_id": 389,
  "users_assigned": [389,672,524],
  "task_id": 3
}

ফাঁসি

rake :name_task 

4
আপনার রেকে টাস্কের জন্য যদি আপনার JSON নির্দেশিকা ফাইলের প্রয়োজন হয় তবে আপনি সম্ভবত আপনার রাক টাস্কে অনেকগুলি কাজ করছেন।
ZiggyTheHamster

এটি অবিশ্বাস্যরূপে সহজ কিছু এমনভাবে জটিল।
jeffdill2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.