我正在寻找一种方法来创建一个命令行应用程序,它将运行一个没有任何参数的默认方法。我摆弄了Thor的default_method选项,但仍然要求我传入一个参数。我找到了similar case,其中有人想要使用参数运行CLI Thor任务但没有任务名称。
我想运行没有任务名称和参数的任务。这样的事情有可能吗?
答案 0 :(得分:54)
使用default_task
:
class Commands < Thor
desc "whatever", "The default task to run when no command is given"
def whatever
...
end
default_task :whatever
end
Commands.start
如果出于任何原因并不是您需要的,您应该能够做类似
的事情class Commands < Thor
...
end
if ARGV.empty?
# Perform the default, it doesn't have to be a Thor task
Commands.new.whatever
else
# Start Thor as usual
Commands.start
end
答案 1 :(得分:4)
有点hackish,但是无论如何只有一个已定义的动作,我只是将动作名称添加到传入的ARGV
数组中:
class GitTranslate < Thor
desc "translate <repo-name>", "Obtain a full url given only a repo name"
option :bitbucket, type: :boolean, aliases: 'b'
def translate(repo)
if options[:bitbucket]
str = "freedomben/#{repo}.git"
puts "SSH: git@bitbucket.org:#{str}"
puts "HTTPS: https://freedomben@bitbucket.org/#{str}"
else
str = "FreedomBen/#{repo}.git"
puts "SSH: git@github.com:#{str}"
puts "HTTPS: https://github.com/#{str}"
end
end
end
然后我通过传递ARGV开始上课:
GitTranslate.start(ARGV.dup.unshift("translate"))
答案 2 :(得分:0)
虽然它有点hackish,但我通过将选项作为参数本身来解决类似的问题:
argument :name
def init
if name === '--init'
file_name = ".blam"
template('templates/blam.tt', file_name) unless File.exists?(file_name)
exit(0)
end
end
在Thor::Group
中运行时,此方法在其他人之前执行,并让我欺骗程序响应参数之类的选项。