විධාන රේඛා තර්ක විතර්ක කාර්යයකට යොමු කරන්නේ කෙසේද


1104

බහුවිධ දත්ත සමුදායන් තුළට වටිනාකමක් ඇතුළත් කළ යුතු පරස්පර කාර්යයක් මා සතුව ඇත.

මෙම අගය විධාන රේඛාවෙන් හෝ වෙනත් පරාවර්තක කර්තව්‍යයකින් ලබා දීමට මම කැමතියි .

මට මෙය කළ හැක්කේ කෙසේද?



3
ලියකියවිලි සියැටල් ආර්බී විසින් පිළිබිඹු කර ඇත.
ජොනතන් ඇලාර්ඩ්

1
කරුණාකර පිළිගත් පිළිතුර la බ්ලෙයාර් ඇන්ඩර්සන් වෙතින් ලබා දුන් පිළිතුර වෙනස් කිරීමට ඔබට පුළුවන්ද, පිළිගත් පිළිතුර දැන් යල්පැන ඇති බැවින්. මෙම මාතෘකාව සඳහා මෙම ප්‍රශ්නය ගූගල් හි ඉහළින්ම පෙනේ!
rmcsharry

Answers:


386

විකල්ප සහ පරායත්තතා අරා තුළ තිබිය යුතුය:

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
rpbaltazar

10
එසේම, ඔබ තර්කය නූල් කොටා ඇති බවට වග බලා ගන්න. උදා: ඔබේ විධාන රේඛාවෙන් rake thing:work'[1,2,3]'
රාක්

37
අවාසනාවකට මෙන්, zsh හට ඇමතුම නිවැරදිව විග්‍රහ කළ නොහැක, ඔබට zsh හි විධානය ටයිප් කළ යුතුය rake thing:work\[1,2,3\]rake 'thing:work[1,2,3]'
:,

1
akakurashinken ඔබට ඔබේ කාර්යයෙන් :environmentසංකේතය ඉවත් කළ හැකිය . රේල් පීලි යෙදුම් සඳහා: පරිසර කාර්යයක් ඇත ...
බ්ලෙයාර් ඇන්ඩර්සන්

3
tඑහි තේරුම පැහැදිලි කිරීම සඳහා සටහනක් තබා ගැනීම වෙනුවට , පරාමිතික නාමය ලෙස taskපමණක් භාවිතා නොකරන්නේ මන්ද task?
ජෝෂුවා පින්ටර්

1134

කාර්ය ඇමතුමට සංකේත තර්ක එකතු කිරීමෙන් ඔබට විධිමත් තර්ක රාක්කයේ සඳහන් කළ හැකිය. උදාහරණයක් වශයෙන්:

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

විධාන රේඛාවෙන්:

> rake my_task [1, අසත්ය]
තර්ක: {: arg1 => "1" ,: arg2 => පංතියේ Rake :: "ව්‍යාජ" :: RaskArguments
arg1 වූයේ: පන්තියේ සංගීතයේ '1' ය
arg2 වූයේ: පන්තියේ සංගීතයේ 'අසත්‍ය' ය

> rake "my_task [1, 2]"
තර්ක: {: arg1 => "1" ,: arg2 => "2"}

> rake invoke_my_task
තර්ක: {: arg1 => "1" ,: arg2 => "2"}

> rake invoke_my_task_2
තර්ක: {: arg1 => 3 ,: arg2 => 4}

> පෙර-අවශ්‍යතා සහිත රාක්කය [5,6]
තර්ක: {: arg1 => "5" ,: arg2 => "6"}

> දෝෂ සහිත_
පෙරනිමි සහිත තර්ක: {: arg1 =>: default_1 ,: arg2 =>: default_2}

> rake with_defaults ['x', 'y']
පෙරනිමි සහිත තර්ක: {: arg1 => "x" ,: arg2 => "y"}

දෙවන උදාහරණයේ පෙන්වා ඇති පරිදි, ඔබට අවකාශය භාවිතා කිරීමට අවශ්‍ය නම්, අවකාශයේ ඇති තර්ක විභේදනය නොකිරීමට ඉලක්ක නාමය වටා ඇති උපුටා දැක්වීම් අවශ්‍ය වේ.

Rake.rb හි කේතය දෙස බලන විට, පූර්වාවශ්‍යතාවයන් සඳහා තර්ක උකහා ගැනීම සඳහා රාක් විසින් කාර්ය නූල් විග්‍රහ නොකරන බව පෙනේ, එබැවින් ඔබට එය කළ නොහැක task :t1 => "dep[1,2]". පූර්ව අවශ්යතාවක් සඳහා විවිධ තර්ක නියම කිරීමට ඇති එකම මාර්ගය වන අයුරින්, රඳා කාර්ය පියවර තුළ නිශ්චිත වශයෙන්ම එය පතා වනු :invoke_my_taskසහ :invoke_my_task_2.

සමහර ෂෙල් වෙඩි (zsh වැනි) ඔබට වරහන් වලින් ගැලවීමට අවශ්‍ය බව සලකන්න: rake my_task\['arg1'\]


5
නාම අවකාශයක් තුළ කාර්යයක් කැඳවීම සඳහා සරල කරන්න: Rake :: Task ['namespace: task'].
Invoke

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'\]. Robots.whattbot.com/post/18129303042/…
සෙත් බ්‍රෝ

2
Eth සෙත්බ්‍රෝ ඔව්. ඔබගේ අදහස් "තවත් අදහස් බලන්න" සබැඳිය පිටුපස සඟවා නොතිබුණි නම්, මෙම කාර්යය කිරීමට මට විනාඩි 10 ක් නාස්ති නොවනු ඇත.
ජීඑම්ඒ

342

Kch විසින් පිළිතුරු දීමට අමතරව (ඒ සඳහා අදහස් දැක්වීමක් කරන්නේ කෙසේදැයි මට හමු නොවීය, සමාවෙන්න):

විධානයට ENVපෙර විචල්යයන් ලෙස විචල්යයන් නියම කිරීමට ඔබට අවශ්ය නැත rake. ඔබට ඒවා සුපුරුදු පරිදි විධාන රේඛා පරාමිතීන් ලෙස සැකසිය හැකිය:

rake mytask var=foo

සහ ඔබේ රාක් ගොනුවෙන් ENV විචල්‍යයන් ලෙස ප්‍රවේශ වන්න:

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

2
IMO හි හොඳම සරලම පිළිතුර මෙයයි. එය වහාම ක්‍රියාත්මක විය. හරියටම pඅදහස් කරන්නේ කුමක්ද?
stevec

1
@ user5783745 පුට්ස් මෙන් නොව, ප්‍රමිතිගත කිරීම සඳහා value.to_s ලොග් වීම වෙනුවට එය Obj.inspect අමතයි. ruby-doc.org/core-2.0.0/Kernel.html#method-ip
kqcef

පරිසර විචල්‍යයන් ඉක්මවා යනවාද? නියමයි!
ඩේමියන් රොචේ

රාක් යනු අතිශයින්ම අධික ලෙස අවුල් සහගත වන අතර එය ක්‍රියාත්මක වූ එකම ක්‍රමය මෙයයි. එය මා පමණක් නොවේ, මෙම පිළිතුරට “නිවැරදි” පිළිතුරට සමාන ඡන්ද ප්‍රමාණයක් ඇත.
lzap

109

ඔබට නම් කරන ලද තර්ක සම්මත කිරීමට අවශ්‍ය නම් (උදා: ප්‍රමිතිය සමඟ OptionParser) ඔබට මෙවැනි දෙයක් භාවිතා කළ හැකිය:

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

--සම්මත රේක් තර්ක මඟ හැරීම සඳහා එය අවශ්‍ය බව සලකන්න . Rake 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
රේක් ARGV විග්‍රහ කරන ආකාරය වෙනස් කර 10.4.1ආපසු හරවන ලදි 10.4.2. github.com/ruby/rake/commit/…
ටොම්බාර්ට්

58

මම මෙම වෙබ් අඩවි දෙකෙන් පිළිතුර සොයාගෙන ඇත: Net Maniac සහ Aimred .

මෙම තාක්ෂණය භාවිතා කිරීම සඳහා ඔබට අනුවාදය> 0.8 රාක් තිබිය යුතුය

සාමාන්‍ය පරාවර්තක කාර්ය විස්තරය මෙයයි:

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

තර්ක ඉදිරිපත් කිරීමට, කරුණු තුනක් කරන්න:

  1. කොමා මඟින් වෙන් කරන ලද කාර්ය නාමයෙන් පසුව තර්ක නම් එකතු කරන්න.
  2. පහත දැක්වෙන පරායත්තයන් භාවිතා කරන්න: අවශ්‍යතා => [...]
  3. ස්ථානය | ටී, ආර්ග් | කළ පසු. (t යනු මෙම කාර්යයේ පරමාර්ථයයි)

ස්ක්‍රිප්ටයේ ඇති තර්ක වෙත ප්‍රවේශ වීමට, 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

විධාන රේඛාවෙන් මෙම කාර්යය ඇමතීමට, එය [] හි ඇති තර්ක ඉදිරිපත් කරන්න

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

අවංකවම මම බලාපොරොත්තු වූයේ පරස්පර කර්තව්‍යයයි - මෙම --go --to -a වැඩසටහන සහ මගේ කර්තව්‍යය ARGV වෙතින් ලබා ගත හැකිය. අවාසනාවට එය කළ හැකිදැයි මට විශ්වාස නැත, කෙසේ වෙතත් මම දැනට ඔබේ විසඳුම භාවිතා කරමි: rake var1 = val1 var2 = val2
ජේසන් ස්මිත්

3
hjhs: rake blah -- --these --go --to --a-program( --එහි ස්විචයන් අවසන් වී ඇති බව පැවසීමට සටහන් කරන්න ), stackoverflow.com/questions/5086224/…
mu ඉතා කෙටි ය

29

තර්ක විතර්ක කරන්නේ කෙසේදැයි මට සිතාගත නොහැකි විය: මම මෙය සකස් කරන තුරු පරිසරය:

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/']

මේ සඳහා ස්තූතියි, පරිසරය පවත්වා ගෙන යන අතරතුර විශිෂ්ට විසඳුමක්
ඔලිවියර් ජේඑම්

28

ඇත්තෙන්ම ick නික් ඩෙස්ජාර්ඩින්ස් පිළිතුරු දුන්නේ පරිපූර්ණයි. නමුත් අධ්‍යාපනය සඳහා පමණක්: ඔබට අපිරිසිදු ප්‍රවේශයක් භාවිතා කළ හැකිය: ENVතර්කය භාවිතා කිරීම

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

rake my_task myvar=10
#=> myvar: 10

24
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) දාම කිරීමේ හැකියාව ඔබට අහිමි වන බැවින් "සැබෑ ලෝකය" භාවිතය සඳහා අදහස් නොකෙරේ . IMO එය වටින්නේ නැත. කැත භාවිතා කරන්න rake task[arg1,arg2].


3
_, arg1, arg2 = ARGVපළමු තර්කය රාක් කර්තව්‍යයේ නම ලෙස පෙනෙන බැවින් මෙය සෑදීමට අවශ්‍ය විය . නමුත් එය exitඉතා හොඳ උපක්‍රමයකි.
මේදය

rake task[arg1,arg2] && rake task2 && rake task3එය වඩා අවලස්සන දැයි විශ්වාස නැත rake task[arg1,arg2] task2 task3. අඩු කාර්යක්ෂමතාවයක් වුවද.
න්යෂ්ටික

_, *args = ARGVසියලු පසු තර්ක අල්ලා ගැනීම සඳහා පරිපූර්ණයි! ස්තූතියි ගොඩවල්!
XtraSimplicity

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] .ඩප්
ජුවාන්ඩා

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

සාම්ප්‍රදායික තර්ක ශෛලිය සමඟ පරාල කාර්යයන් ක්‍රියාත්මක කිරීම සඳහා:

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
ඔබේ Rake කාර්යය සඳහා ඔබට JSON උපදෙස් ගොනුවක් අවශ්‍ය නම්, ඔබ බොහෝ විට ඔබේ Rake කාර්යයේදී බොහෝ දේ කරයි.
ZiggyTheHamster

මේ මාර්ගය පුරා-ව්යාකූල ඇදහිය නොහැකි තරම් සරලයි දෙයක්.
jeffdill2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.