আমার একটি রেক টাস্ক রয়েছে যা একাধিক ডাটাবেসে একটি মান toোকানো প্রয়োজন।
আমি এই মানটি কমান্ড লাইন থেকে, বা অন্য কোনও রেক টাস্ক থেকে রেক টাস্কে দিতে চাই।
কিভাবে আমি এটি করতে পারব?
আমার একটি রেক টাস্ক রয়েছে যা একাধিক ডাটাবেসে একটি মান toোকানো প্রয়োজন।
আমি এই মানটি কমান্ড লাইন থেকে, বা অন্য কোনও রেক টাস্ক থেকে রেক টাস্কে দিতে চাই।
কিভাবে আমি এটি করতে পারব?
উত্তর:
বিকল্প এবং নির্ভরতা অ্যারে ভিতরে থাকা প্রয়োজন:
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
rake thing:work[1, 2, 3]
এটি করবেন না : এটি কাজ করবে না এবং আপনি একটি ত্রুটি পাবেনDon't know how to build task
rake thing:work'[1,2,3]'
rake thing:work\[1,2,3\]
বা এটিrake 'thing:work[1,2,3]'
:environment
নিজের কাজ থেকে প্রতীকটি সরাতে পারেন । রেল অ্যাপ্লিকেশনগুলির একটি রয়েছে: পরিবেশগত কাজ ...
t
অর্থ বোঝাতে কোনও নোট task
না রেখে কেবল পরম task
নাম হিসাবে ব্যবহার করবেন না কেন ?
টাস্ক কলে প্রতীক আর্গুমেন্ট যুক্ত করে আপনি রাকে আনুষ্ঠানিক আর্গুমেন্টগুলি নির্দিষ্ট করতে পারেন। উদাহরণ স্বরূপ:
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'\]
WARNING: 'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
zsh: no matches found: ...
তাই আপনি বন্ধনী অব্যাহতি প্রয়োজন,): rake my_task\['arg1'\]
। রোবট.থচটবট.কম
কেএইচ দ্বারা জবাব ছাড়াও (আমি কীভাবে তার পক্ষে কোনও মন্তব্য করব তা আমি খুঁজে পাইনি):
কমান্ডের ENV
আগে আপনাকে ভেরিয়েবলগুলি ভেরিয়েবল হিসাবে নির্দিষ্ট করতে হবে না rake
। আপনি কেবল সেটিকে সাধারণ কমান্ড লাইনের প্যারামিটার হিসাবে সেট করতে পারেন:
rake mytask var=foo
এবং আপনার রেক ফাইল থেকে এএনভি ভেরিয়েবল হিসাবে এগুলি অ্যাক্সেস করুন:
p ENV['var'] # => "foo"
p
অর্থ কি?
যদি আপনি নাম যুক্তিগুলি (যেমন স্ট্যান্ডার্ড সহ 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
রেক স্ক্রিপ্টগুলি যখন এ জাতীয় দেখায়, সম্ভবত এখন অন্য কোনও সরঞ্জামের সন্ধান করার সময় এসেছে যা এটিকে কেবল বাক্সের বাইরে রাখার অনুমতি দেয়।
--option-names
। আমার একমাত্র পরামর্শ ব্যবহার করতে হবে exit
বরং abort
যেমন abort
আপনি শেল 1 একটি ফিরতি কোড সহ ছাড়বে। যদি রেক টাস্কটি একটি উচ্চ-স্তরের স্ক্রিপ্টের অংশ হয় তবে শূন্য-বহির্গমন প্রস্থানটি ধরে নেওয়া আরও সাধারণভাবে ঘটে যা কিছু ধরণের ত্রুটি।
--
? rake
আসল টাস্কে বা কিছু কিছুর পক্ষে যুক্তি দেওয়ার মতো ? পছন্দ task :my_task, :*args do |t, args|
নাকি কিছু?
{username}
এখানে কী আছে। এটি কোথায় ব্যবহৃত হয়? কেন সেখানে না -u {username}
? চিয়ার্স
আমি এই দুটি ওয়েবসাইট থেকে উত্তর পেয়েছি: নেট ম্যানিয়াক এবং অ্যাম্রেড ।
এই কৌশলটি ব্যবহার করার জন্য আপনার কাছে রেকের সংস্করণ> 0.8 থাকতে হবে
সাধারণ রেক টাস্কের বিবরণটি হ'ল:
desc 'Task Description'
task :task_name => [:depends_on_taskA, :depends_on_taskB] do
#interesting things
end
যুক্তিগুলি পাস করার জন্য, তিনটি জিনিস করুন:
স্ক্রিপ্টে আর্গুমেন্টগুলি অ্যাক্সেস করতে, 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
'task :t, arg, :needs => [deps]' is deprecated. Please use 'task :t, [args] => [deps]' instead.
আর একটি সাধারণ ব্যবহৃত বিকল্প হ'ল পরিবেশের ভেরিয়েবলগুলি পাস করা। আপনার কোডে আপনি এগুলি পড়েন ENV['VAR']
এবং rake
কমান্ডের ঠিক আগে এগুলি পাস করতে পারেন
$ VAR=foo rake mytask
rake blah -- --these --go --to --a-program
(নোট --
মই দিয়া আহরণ করা যে তার সুইচ শেষ বলতে), দেখতে stackoverflow.com/questions/5086224/...
আমি কীভাবে আরগস পাস করতে পারি তাও বুঝতে পারি না: পরিবেশ এটির কাজ না করা পর্যন্ত:
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/']
desc 'an updated version'
task :task_name, [:arg1, :arg2] => [:dependency1, :dependency2] do |t, args|
puts args[:arg1]
end
rake task_name[hello, world]
আমি কেবল চালাতে সক্ষম হতে চেয়েছিলাম:
$ 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]
।
_, arg1, arg2 = ARGV
হিসাবে প্রথম ARG মই দিয়া আহরণ করা কাজের নাম হতে দেখা গিয়েছে। তবে এটি exit
একটি ঝরঝরে কৌশল।
rake task[arg1,arg2] && rake task2 && rake task3
নিশ্চিত যে এটি চেয়ে কদর্য কম কিনা rake task[arg1,arg2] task2 task3
। সম্ভবত কম দক্ষ যদিও।
_, *args = ARGV
পরবর্তী সমস্ত যুক্তি ক্যাপচার জন্য উপযুক্ত! ধন্যবাদ গাদা!
আমি রেক ফাইলটিতে নিয়মিত রুবি যুক্তি ব্যবহার করি:
DB = ARGV[1]
তারপরে আমি ফাইলটির নীচে রেক টাস্কগুলি আটকে রাখি (যেহেতু রেক সেই আর্গুমেন্ট নামের উপর ভিত্তি করে কোনও কাজ সন্ধান করবে)।
task :database_name1
task :database_name2
কমান্ড লাইন:
rake mytask db_name
এটি আমার কাছে var = foo ENV var এবং ক্লাসটি [blah, blah2] সমাধানগুলির চেয়ে ক্লিনার মনে করে।
স্টাবটি কিছুটা ঝাঁকুনির মতো, তবে আপনার যদি এমন কয়েকটি পরিবেশ থাকে যা এককালীন সেটআপ হয় তবে খুব খারাপ না
dup
শেষে: DB = argv [1] .dup
db = ARGV[1].dup unless ARGV[1].nil?
শূন্যতার ফাঁকে ফাঁকে ফেলার ব্যতিক্রম রোধ করার জন্য ইভেন্টটি আরও ভাল ।
যুক্তি পাস করার উপায়গুলি উপরের উত্তরে সঠিক। তবে যুক্তি দিয়ে রাক টাস্ক চালানোর জন্য, রেলের নতুন সংস্করণে যুক্ত একটি ছোট প্রযুক্তি রয়েছে
এটি রেক "নেমস্পেস: টাসন নেম ['যুক্তি 1"] "নিয়ে কাজ করবে
কমান্ড লাইন থেকে টাস্কটি চালনার ক্ষেত্রে উল্টানো উদ্ধৃতিগুলি নোট করুন।
ডিফল্ট কার্যটিতে আর্গুমেন্টগুলি পাস করার জন্য, আপনি এর মতো কিছু করতে পারেন। উদাহরণস্বরূপ, "সংস্করণ" বলতে আপনার যুক্তি:
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
যাইহোক, তর্কগুলি পাস করার সময় আমি টাস্ক নাম (ডিফল্ট বা বিল্ড) নির্দিষ্ট করা এড়ানোর কোনও উপায় খুঁজে পাইনি। কেউ যদি কোনও উপায় জানেন তবে শুনতে ভাল লাগবে।
আমি আর্গুমেন্ট পাস করার জন্য "ক্যোরিস্ট্রিং" সিনট্যাক্সটি পছন্দ করি, বিশেষত যখন প্রচুর যুক্তি পাস করতে হয়।
উদাহরণ:
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"}}
আপনি যদি যুক্তির অবস্থান কী তা মনে করে বিরক্ত না হয়ে থাকেন এবং আপনি রুবি যুক্তি হ্যাশের মতো কিছু করতে চান। আপনি স্ট্রিংয়ে যাওয়ার জন্য একটি যুক্তি ব্যবহার করতে পারেন এবং তারপরে সেই স্ট্রিংটিকে একটি বিকল্প হ্যাশে রূপান্তর করতে পারেন।
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
উপরে বর্ণিত বেশিরভাগ পদ্ধতিগুলি আমার পক্ষে কার্যকর হয়নি, সম্ভবত সেগুলি আরও নতুন সংস্করণে অবচয় করা হয়েছে। আপ-টু-ডেট গাইডটি এখানে পাওয়া যাবে: 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
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
প্যারামিটারগুলি পাস করার সময়, এটি একটি বিকল্প ইনপুট ফাইলই হ'ল এটি একটি এক্সেল জেসন বা যা আপনার প্রয়োজন হতে পারে এবং সেখান থেকে প্রয়োজনীয় ভেরিয়েবলের নাম সহ আপনার প্রয়োজনীয় ডেটা স্ট্রাকচার এবং ভেরিয়েবলগুলি পড়তে পারেন। একটি ফাইল পড়ার জন্য নিম্নলিখিত কাঠামো থাকতে পারে।
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
{
"name_task": "I'm a task",
"user_id": 389,
"users_assigned": [389,672,524],
"task_id": 3
}
rake :name_task