1

我正在创建一个 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。

4

1 回答 1

2

YAML 正在尝试从文件中实例化一个名为Proj的结构,如以下行所示:

!ruby/struct:Proj

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

Proj = Struct.new(:name, :type, :version, :deploy_dir, :source_dir, :current)
于 2012-04-10T19:14:11.653 回答