1

これはトールのタスクです:

  desc 'readkeys', 'Read keys'
  method_option :password, :type => :string, :desc => 'Password for the key store'
  def readkeys
    if options[:password].nil?
      puts "Enter keystore password"
      options[:password] = gets
    end

    File.open("#{Dir.home}#{File::SEPARATOR}#{ENV['USER']}.p12") do |p12|
      pkcs12 = OpenSSL::PKCS12.new(p12.read, options[:password])
    end
  end

コマンドを実行すると、次のエラーが発生します。

./mycommand:26:in `gets':そのようなファイルまたはディレクトリはありません-readkeys(Errno :: ENOENT)

何か案は?構文は問題ないようです。

4

1 に答える 1

2

私がこれで見る2つの問題。1つ目は、Thorのオプションハッシュを実際に変更することはできないということです。それは凍結されており、あなたはを得るでしょう`[]=': can't modify frozen Thor::CoreExt::HashWithIndifferentAccess (RuntimeError)

ただし、実際の問題は、作業レベルが低すぎることです。あなたが探しているのはのask方法ですThor::Actions。私があなたのコードを正しく理解しているなら、あなたがやりたいことをするために、あなたはこのようなことをするでしょう:

class Test < Thor   
  include Thor::Actions

  desc 'readkeys', 'Read keys'
  method_option :password, :type => :string, :desc => 'Password for the key store'
  def readkeys
    if options[:password].nil?
      password = ask "Enter keystore password"
    else
      password = options[:password]
    end
    File.open("#{Dir.home}#{File::SEPARATOR}#{ENV['USER']}.p12") do |p12|
      pkcs12 = OpenSSL::PKCS12.new(p12.read, password)
    end
  end
  #...
end

または、もっと簡単に言えば、

class Test < Thor   
  include Thor::Actions

  desc 'readkeys', 'Read keys'
  method_option :password, :type => :string, :desc => 'Password for the key store'
  def readkeys
    password = options[:password] || ask("Enter keystore password")
    File.open("#{Dir.home}#{File::SEPARATOR}#{ENV['USER']}.p12") do |p12|
      pkcs12 = OpenSSL::PKCS12.new(p12.read, password)
    end
  end
  #...
end
于 2012-07-31T17:43:17.243 に答える