簡體   English   中英

如何在Thor應用程序中的命令前傳遞開關?

[英]How can I pass a switch before the command in a Thor app?

我有一個Thor應用程序,所有命令都需要許多相同的參數。 通用參數使用class_option聲明。 但是我希望用戶將它們放在命令之前。

例如,我的用戶可能需要輸入以下順序...

mycli cmd1 arg1 arg2 --switch1 --switch2=value
mycli cmd2 arg3 arg4 --switch1 --switch2=value
mycli cmd3 arg5 arg6 --switch1 --switch2=value

每次我的用戶需要重新輸入或大量退格鍵來編輯命令行時。 這樣做會更容易...

mycli --switch1 --switch2=value cmd1 arg1 arg2
mycli --switch1 --switch2=value cmd2 arg3 arg4
mycli --switch1 --switch2=value cmd3 arg5 arg6

這樣,每次調用都需要更改的部分在命令行的末尾,而可能保持不變的參數在開始。 命令行編輯變得非常容易。

有什么辦法可以在托爾支持這一點嗎?

簡要查看文檔和示例以及標准的ruby約定將表明應該最后通過選項。 但是,這是使用ruby腳本對命令行進行“排序”的方法,這是一個基本示例:

#test.thor

class Test < Thor
  method_option :demo, :aliases => "-d", :desc => "demo"
  method_option :foo, :aliases => "-f", :desc => "foo"
  method_option :bar, :aliases => "-b", :desc => "bar"
  desc "example", "an example task"
  def example
    puts "option switches passed: #{options.to_s}"
  end
end

還有您可以執行,別名等的ruby腳本:

#hack.rb

#!/usr/bin/env ruby
args = ARGV
cmd = args.reject{|a| a[0] == '-'}.first
switches = args.select{|a| a[0] == '-'}
cmd_args = args[1..-1] - switches
system_cmd = ['thor', cmd, args, switches].join(' ')
system(system_cmd)

為了測試目的,您可以這樣調用它:

thor test:example -f -d -b
#=>option switches passed: {"foo"=>"foo", "demo"=>"demo", "bar"=>"bar"}

ruby hack.rb -f -b -d test:example
#=> option switches passed: {"foo"=>"foo", "bar"=>"bar", "demo"=>"demo"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM