Thor YAML.load_file无效的子类(TypeError)

时间:2012-04-10 17:37:44

标签: ruby yaml thor

我正在创建一个thor脚本,该脚本根据存储Ruby结构的yml文件显示我所在的当前项目。我尝试加载此yml文件时收到错误。

from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `node_import'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `load'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:135:in `load'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:146:in `block in load_file'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:145:in `open'
from /Users/cpara/.rvm/rubies/ruby-1.9.2-p318/lib/ruby/1.9.1/syck.rb:145:in `load_file'
from ./project:84:in `current'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/task.rb:22:in `run'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/invocation.rb:118:in `invoke_task'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor.rb:263:in `dispatch'
from /Users/cpara/.rvm/gems/ruby-1.9.2-p318@rails/gems/thor-0.14.6/lib/thor/base.rb:389:in `start'
from ./project:213:in `<main>'

以下是我试图运行的脚本:

#!/usr/bin/env ruby
require 'yaml'
class Project < Thor
  include Thor::Actions

  # Task: return current project
  desc 'current', 'Shows current project.'
  def current
    projects = YAML.load_file "#{ENV['HOME']}/.hana/data/projects.yml" #error
    abort "There are no projects.  Try creating one first." if not @projects.is_a? Array
    projects.each do |project|
      if project.current == true
        say_status :current, "Current project: #{project.name} // #{project.type} // #{project.version}", :green
        return project
      end
    end
    say_status :error, "There is no current project.", :red
  end
end

我已经三次检查了irb中的路径并确实存在。我认为这是我的YAML存储我的Ruby结构的方式,但即使是控制台,我也得到错误。这是我的YAML文件

--- 
- !ruby/struct:Proj 
  name: test
  type: testing
  version: 4.0.2
  deploy_dir: deploy
  source_dir: source
  current: true

有什么想法吗?我正在运行Ruby 1.9.2p318。

1 个答案:

答案 0 :(得分:2)

YAML正试图从文件中实现名为 Proj Struct ,如下所示:

!ruby/struct:Proj

在加载yaml之前,您应该要求已经定义Proj的文件。或者,只是为了测试它是否有效,在代码中,在 require'yaml'行定义Proj之后:

Proj = Struct.new(:name, :type, :version, :deploy_dir, :source_dir, :current)