我正在创建一个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。
答案 0 :(得分:2)
YAML正试图从文件中实现名为 Proj 的 Struct ,如下所示:
!ruby/struct:Proj
在加载yaml之前,您应该要求已经定义Proj的文件。或者,只是为了测试它是否有效,在代码中,在 require'yaml'行定义Proj之后:
Proj = Struct.new(:name, :type, :version, :deploy_dir, :source_dir, :current)