【问题标题】:Thor Executable - Ignore Task NameThor 可执行文件 - 忽略任务名称
【发布时间】:2014-05-30 21:38:28
【问题描述】:

thor wiki 页面 Making an Exectable 向您展示了如何创建一个由 thor 驱动的 CLI 命令,如下所示:

bash ./mythorcommand foo

这要求您将 thor 任务 foo 作为第一个参数传入。

我还可以使用 thor 的 default_method 运行不带任何参数的 thor 可执行文件:

bash ./mythorcommand

但是,我想传入一个变量字符串作为第一个参数:

bash ./mythorcommand "somevalue"

这不起作用,因为 thor 命令期望第一个参数是任务名称。有没有办法忽略任务名称并将第一个参数发送到默认方法?

如果此功能不存在,我认为添加一种将所有命令行参数传递给一个任务/方法的方法会非常有用:

class MyThorCommand < Thor
  only_method :default

  def default(*args)
    puts args.inpsect
  end 
end 

MyThorCommand.start

【问题讨论】:

    标签: ruby thor


    【解决方案1】:

    您应该从 Thor::Group 扩展并调用 start 方法

    class Test < Thor::Group
      desc "Act description"
      def act
        puts "do smth"
      end
    end
    
    Test.start
    

    【讨论】:

    • 这个答案是正确的。通过在#act 中调用bar,使用argument :bar 使未命名字符串参数的内容可用。无论是在class_options 定义的任何选项之前还是之后,Thor 都会找到这个参数。
    • 请注意 Thor::Group 会同时调用所有任务。
    【解决方案2】:

    我为这个问题找到了一个相当“奇怪”的解决方案,它对我很有效。

    您向 Thor 添加了一个默认任务。然后添加 method_missing ,这样如果您的应用程序有参数,您就可以欺骗 Thor 将默认方法作为参数传递。

    从您的示例来看,解决方案如下所示:

    class MyThorCommand < Thor
      default_task :my_default
    
      desc "my_default", "A simple default"
      def my_default(*args)
        puts args.inspect
      end 
    
      def method_missing(method, *args)
        args = ["my_default", method.to_s] + args
        MyThorCommand.start(args)
      end
    
    end 
    
    MyThorCommand.start(ARGV)
    

    如果这是在文件“my_thor.rb”中,则执行“ruby my_thor.rb foo bar”将显示“[“foo”,“bar”]'作为结果。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      虽然这并不能完全解决您的问题,但一种替代方法可能是使用 Thor.map 通过仅提供选项标志来调用命令:

      map '-F' => 'foo'
      

      现在也可以传参数了

      mythorcommand -F bar # => invokes foo("bar")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        相关资源
        最近更新 更多