我在获取 Thor 时遇到了一些问题这样做,所以希望有人能指出我做错了什么。
我有一个主类 class MyApp < Thor
我想为多个命名空间分成单独的文件,比如 thor create:app_type
和 thor update:app_type
.我找不到任何示例来说明应该如何将 Thor 应用程序分解成多个部分,而且我尝试过的方法似乎不起作用。
举个例子,这个类我正试图从主 Thor 类中脱离出来:
module Things
module Grouping
desc "something", "Do something cool in this group"
def something
....
end
end
end
当我尝试在我的主类中包含或要求它时:
class App < Thor
....
require 'grouping_file'
include Things::Grouping
....
end
我得到一个异常:'<module:Grouping>': undefined method 'desc' for Things::Grouping:Module (NoMethodError)
是否可以为 Thor 任务设置多个命名空间?如果可以,如何将其分解,这样您就不会拥有一个需要数百行代码的整体类?
最佳答案
为什么它不起作用:当您在 Thor
类中使用 desc
时,您实际上是在调用类方法 Thor.desc
.当您在模块中执行此操作时,它会调用显然不存在的 YourModule.desc
。
我可以建议两种方法来解决这个问题。
修复一:使用 Module.included
您是否希望在多个 Thor 类中重复使用这些任务?
当模块在 Ruby 中用作 include
时,会调用 include
类方法。 http://www.ruby-doc.org/core/classes/Module.html#M000458
module MyModule
def self.included(thor)
thor.class_eval do
desc "Something", "Something cool"
def something
# ...
end
end
end
end
修复二:将 Thor 类分成多个文件
您是否只想在另一个文件中单独定义任务?
如果是这样,只需在另一个文件中重新打开您的 App 类。您的 Thorfile 看起来像:
# Thorfile
Dir['./lib/thor/**/*.rb'].sort.each { |f| load f }
那么你的 lib/thor/app.rb
将包含一些 App
的任务,而另一个文件 lib/thor/app-grouping.rb
将包含同一个 App
类的更多任务。
关于ruby - 如何在单独的类/模块/文件中编写 Thor 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729071/