标签: thor

在Rails 3生成器中多次调用任务

我正在编写一个Rails 3生成器,它可以创建两个不同的模型.这是我正在尝试做的一个非常简单的例子:

def my_generator_task
  invoke "model", ["foo"]
  invoke "model", ["bar"]
end
Run Code Online (Sandbox Code Playgroud)

问题是Thor调用方法只调用一次任务,因此第二次调用"模型"任务永远不会发生,并且永远不会创建"bar"模型.有没有人知道一个优雅的方法来实现这一点,最好是以一种不会破坏运行发生器"rails destroy"的能力的方式?

ruby ruby-on-rails thor ruby-on-rails-3

10
推荐指数
1
解决办法
849
查看次数

与托尔互动提示

我想以某种方式要求用户说出他们的flickr_id,flickr_apikey和那些东西,但id'最乐意在我的安装命令下这样做,所以它不会因为参数的争论而变得如此漫长而沉重.

所以像

$ thor PhotoonRails:install
We're about to install your system.. blaa, blaa, blaa...
We have to know you're Flick ID, get i here http://idgettr.com/
Flickr ID: {here you should type your id}

We also has to know you're flick api key, make one here ...
API Key: {here you should type your key}
Run Code Online (Sandbox Code Playgroud)

等等?你有这个想法,可以做到吗?

ruby installer ruby-on-rails thor

10
推荐指数
2
解决办法
4112
查看次数

Thor可执行文件 - 忽略任务名称

thor wiki页面,Making a 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
Run Code Online (Sandbox Code Playgroud)

ruby thor

10
推荐指数
1
解决办法
1211
查看次数

将选项传递给模板函数

我正在寻找一种方法来在thors模板操作中将选项传递给ERB模板引擎.

我偶然发现了使用thors模板操作的bundler cli源代码,如下所示:

opts = {:name => name, 
    :constant_name => constant_name, 
    :constant_array => constant_array, 
    :author_name => author_name, 
    :author_email => author_email
}

template(File.join("newgem/Gemfile.tt"),
           File.join(target, "Gemfile"),
            opts)
Run Code Online (Sandbox Code Playgroud)

但是当我在我的Thor任务中添加这样的选项时,ERB找不到它们,我只能在我的thor类中使用参数和函数来在模板中设置变量.

我不知道ruby中的绑定是如何工作的,也许有一种方法可以通过绑定到ERB来传递范围.

ruby templates erb thor

9
推荐指数
2
解决办法
2972
查看次数

出现错误时,Ruby/Thor退出状态

我是Thor(和Ruby)的新手,我正在考虑在构建脚本中使用它,因为它说它可以替代Rake(因此对Make).但经过短暂的试用后,我对它返回的错误状态感到困惑.我很快就浏览了维基,但没有看到任何提及.

只有第一个"简单示例",test.thor:

class Test < Thor
  desc "example", "an example task"
  def example
    puts "I'm a thor task!"
  end
end
Run Code Online (Sandbox Code Playgroud)

版本号:

eruve>thor version
Thor 0.18.1
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,故意错误的命令:

eruve>ruby --version; thor test:example badarg; echo exit status: $?

ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin10.8.0]
ERROR: thor example was called with arguments ["badarg"]
Usage: "thor test:example".
exit status: 0
Run Code Online (Sandbox Code Playgroud)

所以,有一个错误,但它仍以状态0退出...意味着我宁愿不在(非ruby)脚本中使用它,否则脚本将继续运行,即使它应该终止.后续错误可能难以分析.

我必须遗漏一些东西,因此我的问题是:

  • 如果出现错误(配置文件等),是否有一种简单的方法可以默认获得非零状态?

  • 如果没有,我应该做些什么才能做到正确?

谢谢.

ruby thor

8
推荐指数
2
解决办法
4237
查看次数

可以在不调用Thor的情况下调用可执行Thor驱动的脚本吗?

我有一个基于Thor的Ruby脚本,但是我希望将它作为一个宝石部署在人们的bin目录中,人们可以不必这样做thor mytool.

所以相反,他们只是使用 mytool

这可能吗?

我知道这可能与香草有关,optparse但如果可能的话,我宁愿使用Thor.

更新:这是我根据Thor页面上的示例使用的代码,但是我收到以下错误:

#!/usr/bin/env thor

class App < Thor
  map "-L" => :list

  desc "install APP_NAME", "install one of the available apps"
  method_options :force => :boolean, :alias => :string
  def install(name)
    user_alias = options[:alias]
    if options.force?
      # do something
    end 
    # other code
  end 

  desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
  def list(search="")
    # list everything
  end 
end
Run Code Online (Sandbox Code Playgroud)

错误:

/usr/lib/ruby/gems/1.8/gems/thor-0.14.0/lib/thor/runner.rb:34:in `method_missing': undefined method `start' …

ruby gem command-line thor

7
推荐指数
1
解决办法
2651
查看次数

Ruby - Thor首先执行特定任务

当我运行Thor任务时,是否可以先调用特定任务?

我的Thorfile:

class Db < Thor

  desc "show_Version", "some description ..."
  def show_version # <= needs a database connection
    puts ActiveRecord::Migrator.current_version
  end

  private

  def connect_to_database # <= call this always when a task from this file is executed
    # connect here to database
  end

end
Run Code Online (Sandbox Code Playgroud)

我可以在每个任务中编写"connect_to_database"方法,但这看起来不是很干.

ruby initialization task thor

7
推荐指数
1
解决办法
4473
查看次数

如何将Thor :: Group注册为带参数的子命令

这个问题从这里开始.但随着我对托尔的了解越来越多,这一情

我正在尝试创建一个带有参数的Thor :: Group子命令.奇怪的是,如果没有参数,它就有效.

我可以使用Thor :: Group作为子命令吗?

当我键入时,这有效: foo counter

富/斌/富

module Foo
  class CLI < Thor
    register(Counter, 'counter', 'counter', 'Count up from the 1.')
  end

  class Counter < Thor::Group
    desc "Prints 1 2"

    def one
      puts 1
    end

    def two
      puts 2
    end

  end

end

Foo::CLI.start
Run Code Online (Sandbox Code Playgroud)

但是当我键入时,这不起作用: foo counter 5

module Foo
  class CLI < Thor
    register(Counter, 'counter', 'counter <number>', 'Count up from the input.')
  end

  class Counter < Thor::Group
    argument :number, :type => :numeric, :desc => …
Run Code Online (Sandbox Code Playgroud)

ruby gem thor

6
推荐指数
1
解决办法
1630
查看次数

为什么Thor采用no_tasks方法?

或者,更具体一点:我不能只使用私有方法吗?

ruby thor

6
推荐指数
1
解决办法
1363
查看次数

'rails new'创建`validate_default_type!':选项的默认值必须与其类型匹配.(ArgumentError)错误

我正在尝试创建一个新的Ruby on Rails应用程序.每次我输入rails new后,我都会收到此错误

/usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/parser/option.rb:130:in `validate_default_type!': An option's default must match its type. (ArgumentError)
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/parser/option.rb:113:in `validate!'
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/parser/argument.rb:24:in `initialize'
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/parser/option.rb:9:in `initialize'
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/base.rb:544:in `new'
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/base.rb:544:in `build_option'
    from /usr/local/lib/ruby/gems/2.2.0/gems/thor-0.19.2/lib/thor/base.rb:278:in `class_option'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/base.rb:202:in `class_option'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/app_base.rb:71:in `add_shared_options_for'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/rails/app/app_generator.rb:160:in `<class:AppGenerator>'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/rails/app/app_generator.rb:159:in `<module:Generators>'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/rails/app/app_generator.rb:153:in `<module:Rails>'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/generators/rails/app/app_generator.rb:3:in `<top (required)>'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/commands/application.rb:2:in `<top (required)>'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from /usr/local/lib/ruby/gems/2.2.0/gems/railties-4.2.5/lib/rails/cli.rb:14:in `<top (required)>'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from /usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
    from …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails thor

6
推荐指数
1
解决办法
812
查看次数