标签: thor

Rake vs. Thor用于自动化脚本?

我希望自动执行以下操作:

  • 使用预先选择的数据库创建一个新的Ruby on Rails应用程序,Git初始化它,创建一个Heroku项目,提交所有文件等.
  • 通过SSH将文件夹中的所有文件上传到另一台计算机,但不要覆盖文件.
  • 升级Ubuntu,通过apt-get安装所有基本软件包.

根据我的理解,这方面的工具是Rake和Thor,但是,我应该使用哪一个?

在我看来,耙子更具事实性和受欢迎程度.我听过有人推荐Thor.

这些如何在破败中相互对立?

ruby rake thor

46
推荐指数
2
解决办法
1万
查看次数

运行不带参数或任务名称的CLI Thor应用程序

我正在寻找一种方法来创建一个命令行Thor应用程序,它将运行一个没有任何参数的默认方法.我摆弄了Thor的default_method选项,但仍然要求我传入一个参数.我发现了一个类似的情况,有人想要使用参数运行CLI Thor任务但没有任务名称.

我想运行一个没有任务名称和参数的任务.这样的事情可能吗?

ruby thor

26
推荐指数
2
解决办法
6978
查看次数

如何在单独的类/模块/文件中组合Thor任务?

我在让托尔这么做时遇到了一些麻烦,所以希望有人可以指出我做错了什么.

我有一个主类class MyApp < Thor,我想分成多个名称空间的单独文件,比如thor create:app_typethor update:app_type.我找不到任何一个例子来说明如何将Thor应用程序拆分成碎片,而我尝试过的东西似乎不起作用.

举个例子,这个班我试图从主要的Thor类中脱颖而出:

module Things
  module Grouping

    desc "something", "Do something cool in this group"
    def something
      ....
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

当我尝试在我的主要课程中包含或要求时:

class App < Thor
  ....
  require 'grouping_file'
  include Things::Grouping
  ....
end
Run Code Online (Sandbox Code Playgroud)

我得到一个例外: '<module:Grouping>': undefined method 'desc' for Things::Grouping:Module (NoMethodError)

是否有可能为Thor任务设置多个名称空间,如果是,那么如何将其分解出来以便您没有一个需要几百行的单一类?

ruby module thor

21
推荐指数
4
解决办法
7282
查看次数

Boson vs Thor用于控制台应用程序

有没有人同时使用过BosonThor

Thor非常受欢迎,拥有比Boson更多的追随者和贡献者,但是Boson看起来比Thor更强大,而且建筑经过深思熟虑.

在Boson你:

  • 可以添加在控制台和ruby环境中使用的方法.所以你不必同时拥有Thorfiles用于控制台和宝石用于红宝石.
  • 可以有别名.
  • 不必安装脚本文件,只需将它们放在〜/ .boson /命令中即可.在每次更新后,我总是要努力卸载和安装Thorfiles(在编辑源代码时可能是每分钟都非常令人沮丧).
  • 有比Thor更好的命令输出.
  • 不必像Thor一样手工编写参数描述.
  • 使用模块,这比使用类更好,因为您可以在其他模块中包含模块.
  • 自动将模块内的开源代码片段(例如来自Gist)包装起来,并立即与Boson一起使用.
  • 对您的方法结果有不同的看法.
  • 不必在你的片段中重新编码以适应Thor,因为它只使用本机ruby代码(模块).这意味着如果你有一天不想使用Boson,你就不必重新编码所有内容,如果你使用的是Thor.
  • API是记录好-就像每一个类的内部辅导.
  • 您可以在ruby脚本中包含"boson"模块并直接使用它们,这是Thor无法解决的问题,因为它只适用于Thor.你不能与其他Thor类(不是mixins)共享Thor方法

我注意到所有这些好处只是阅读文档并与Boson玩了几分钟.

我应该使用Thor是因为它更受欢迎(因为我找不到任何其他地方可以照亮玻色子)或者我是否应该承担一段时间后Boson可能无法维护的风险,因为作者是唯一的贡献者?

虽然它只是一个人,但你可以看到他如何以极快的速度和卓越的品质进行编码.如果像他这样的更多贡献者为该图书馆做出贡献,那将会很棒.我真的希望更多的rubyists会使用它,因为它有很大的潜力成为所有系统自动化的脚本框架.就像后端的Rails一样.提交问题时,作者真的可以帮助您快速解决问题.

Thor只适用于外壳(我认为是它的目的),而玻色子,因为我认为它有3个主要功能.它允许您在shell中使用ruby(irb和脚本)中的代码,并且您可以拥有所有Ruby代码的精美集合,而无需修改.

我一直想要一个框架作为我的后端脚本框架,现在我不必重新发明轮子.似乎玻色子可能就是这样.

有人使用过这两个库并且可以分享一些想法吗?

ruby console ruby-on-rails thor

20
推荐指数
1
解决办法
2208
查看次数

在哪里可以找到使用RSpec测试Thor脚本的好例子?

在哪里可以找到使用RSpec测试Thor脚本的好例子?

到目前为止,我的搜索没有任何好处.

rspec thor

18
推荐指数
2
解决办法
5255
查看次数

命名空间Thor命令在独立的ruby可执行文件中

在命令行上调用thor命令时,这些方法按其模块/类结构命名,例如

class App < Thor
  desc 'hello', 'prints hello'
  def hello
    puts 'hello'
  end
end
Run Code Online (Sandbox Code Playgroud)

将使用该命令运行

thor app:hello
Run Code Online (Sandbox Code Playgroud)

但是,如果你通过推杆使自己可执行

App.start
Run Code Online (Sandbox Code Playgroud)

在底部你可以运行如下命令:

app hello
Run Code Online (Sandbox Code Playgroud)

有没有办法命名这些命令?例如,你可以打电话

app say:hello
app say:goodbye
Run Code Online (Sandbox Code Playgroud)

ruby thor

16
推荐指数
2
解决办法
3863
查看次数

在Ruby Thor CLI中添加--version选项

如何在--versionRuby Thor命令行界面应用程序中添加选项.

例如,我希望能够运行

$ thor_app --version
> thor_app version 1.0.0
Run Code Online (Sandbox Code Playgroud)

此问题与不带参数或任务名称的Run a CLI Thor应用程序有关,但专门用于添加--version不需要任务的选项.

注意
这是按照自答案格式编写的.鼓励添加答案和更新

ruby thor

13
推荐指数
1
解决办法
1599
查看次数

Thor&YAML输出为二进制?

我正在使用Thor并尝试将YAML输出到文件中.在irb中,我得到了我的期望.YAML格式的纯文本.但是当Thor的一个方法的一部分,它的输出是不同的......

class Foo < Thor
  include Thor::Actions

  desc "bar", "test"
  def set
    test = {"name" => "Xavier", "age" => 30}
    puts test
    # {"name"=>"Xavier", "age"=>30}
    puts test.to_yaml
    # !binary "bmFtZQ==": !binary |-
    #   WGF2aWVy
    # !binary "YWdl": 30
    File.open("data/config.yml", "w") {|f| f.write(test.to_yaml) }
  end
end
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

ruby yaml thor

12
推荐指数
2
解决办法
2717
查看次数

如何在Thor中指定多个参数或参数?

my_gem你好name1 name2 name3给我一个

my_gem hello至少需要一个参数:my_gem hello name

我应该解析它们并用分隔符分隔参数吗?

例如

my_gem hello name1,name2,name3,nameN

在文件中它看起来像

class MyCLI < Thor
  desc "hello NAMES", "say hello to names"

  def hello(names)
    say "hello #{names.split(',')}"
  end
end
Run Code Online (Sandbox Code Playgroud)

或者无论如何要做到这一点?

ruby command-line-interface command-line-arguments thor

11
推荐指数
1
解决办法
3522
查看次数

如何让两个Thor任务共享选项?

使用Thor,可以使用method_option设置特定任务的选项.要为类中的所有任务设置选项,可以使用class_option.但是,如果一个人想要一个班级的某些任务,而不是全部,分享选项呢?

在以下task1task2共享选项中,但它们不共享所有选项,并且它们不共享选项task3.

require 'thor'

class Cli < Thor
  desc 'task1', 'Task 1'
  method_option :type, :type => :string, :required => true, :default => 'foo'
  def task1
  end

  desc 'task2', 'Task 2'
  method_option :type, :type => :string, :required => true, :default => 'foo'
  method_option :value, :type => :numeric
  def task2
  end

  desc 'task3', 'Task 3'
  method_option :verbose, :type => :boolean, :aliases => '-v'
  def task3
  end
end

Cli.start(ARGV)
Run Code Online (Sandbox Code Playgroud)

与说明的问题method_option :type, :type …

ruby thor

11
推荐指数
1
解决办法
2561
查看次数