我正在编写一个Rails 3生成器,它可以创建两个不同的模型.这是我正在尝试做的一个非常简单的例子:
def my_generator_task
invoke "model", ["foo"]
invoke "model", ["bar"]
end
Run Code Online (Sandbox Code Playgroud)
问题是Thor调用方法只调用一次任务,因此第二次调用"模型"任务永远不会发生,并且永远不会创建"bar"模型.有没有人知道一个优雅的方法来实现这一点,最好是以一种不会破坏运行发生器"rails destroy"的能力的方式?
我想以某种方式要求用户说出他们的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)
等等?你有这个想法,可以做到吗?
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) 我正在寻找一种方法来在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来传递范围.
我是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)脚本中使用它,否则脚本将继续运行,即使它应该终止.后续错误可能难以分析.
我必须遗漏一些东西,因此我的问题是:
如果出现错误(配置文件等),是否有一种简单的方法可以默认获得非零状态?
如果没有,我应该做些什么才能做到正确?
谢谢.
我有一个基于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' …
当我运行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"方法,但这看起来不是很干.
这个问题从这里开始.但随着我对托尔的了解越来越多,这一情
我正在尝试创建一个带有参数的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 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)