0

我似乎无法让变量在 Thor::Group 中工作。我已经尝试了所有方法来定义常量 $CONFIG $STAGING_DIR 但它们只是不起作用。

class Package < Thor::Group
include Thor::Actions
attr_accessor :staging_dir, :config
argument :repo, :type => :string, :desc => "The repo to export"
desc "Testing 1.2.3..."

def test_meth
    uri = URI.parse(repo)
    if uri.kind_of?(URI::Generic)
        say "-- Repository seems to be a local directory", :cyan
        if File.exist? repo
            @config = YAML.load_file(repo + "/project.yaml")
            @staging_dir = "/var/tmp/pkg/stage/" + @config["project"]["name"]
            FileUtils.remove_dir @staging_dir if File.exists? @staging_dir
            empty_directory @staging_dir
            directory(repo, @staging_dir)
        end
    end
end

def failure
    puts @config
    puts @staging_dir
end

def self.source_root
    File.dirname(@staging_dir)
end


end
Package.start

./fubar /var/tmp/test/ -- Repository 好像是本地目录 nil nil

有谁知道如何使类变量在 Thor::Group 中可访问?

4

1 回答 1

1

只需定义一些私有方法。私有方法不会像 Thor 脚本中的常规方法那样自动执行。方法中的实例变量评估您在第一次调用该方法时放在 ||= 右侧的内容。然后返回结果。此后,它只是返回值。所以你的代码将被重写如下:

class Package < Thor::Group
  include Thor::Actions
  attr_accessor :staging_dir, :config
  argument :repo, :type => :string, :desc => "The repo to export"
  desc "Testing 1.2.3..."

  def test_meth
      uri = URI.parse(repo)
      if uri.kind_of?(URI::Generic)
          say "-- Repository seems to be a local directory", :cyan
          if File.exist? repo
              FileUtils.remove_dir staging_dir if File.exists? staging_dir
              empty_directory staging_dir
              directory(repo, staging_dir)
          end
      end
  end

  def failure
      puts config
      puts staging_dir
  end

  def self.source_root
      File.dirname(staging_dir)
  end

  private

  def config
    @config ||= YAML.load_file(repo + "/project.yaml")
  end

  def staging_dir
    @staging_dir ||= "/var/tmp/pkg/stage/" + @config["project"]["name"]
  end

end
Package.start
于 2011-11-21T13:51:06.183 回答