1

私はRubyに非常に慣れていないため、このスニペットで行き詰まったときにいくつかのコードを理解しようとしていました:

directory "test_dir" do
    action :create
    recursive true
end

グーグルdirectoryクラスを試しましたが、失敗しました。クラスを見つけましたDirが、同じではありません。直感的に、このスニペットは新しいディレクトリを作成して名前を付ける必要があることがわかりますtest_dirが、物事を想定して先に進みたくありません。

編集 これは、特定のタスクを起動するために使用されるシェフレシピの一部でした. 起動するために、ディレクトリを作成し、いくつかの jar をそこにダウンロードする必要があります。execute以下のような方法があります。

execute 'deploy' do
    action :nothing
    # ignore exit status of storm kill command
    command <<-EOH
      set -e
      storm kill #{name} -w 1 || true
      sleep 3
      storm jar #{points to the jar}
    EOH
end

申し訳ありませんが、オープンソース化されていないものもあるため、少し難読化する必要があります。

4

4 に答える 4

1

貼り付けたスニペットは、続行するのに十分な情報ではありません (コンテキストが必要です。スニペットはどこから来たのですか?)

つまりdirectory、クラスというよりメソッドのように見えます。まず、小文字で、クラスはキャメルケースです。

メソッドの場合は、アプリケーション内のどこかに定義されています。次のようなことを試しましたか:

grep -r "def directory" ./また

grep -r "directory" ./| grep "def"

アプリケーション自体にない場合は、アプリケーションの依存関係のいずれかで定義されます (grep -r "..." $GEM_HOME/gems代わりに)

于 2012-10-18T15:32:17.543 に答える
1

これは、ディレクトリ管理用の Chef 内部 DSL です。詳細はこちら: http://wiki.opscode.com/display/chef/Resources#Resources-Directory

PS:recursive trueは、 のようにフォルダを作成するように指示しますmkdir -p

于 2012-10-18T15:30:06.640 に答える
1

directoryクラスではなく、メソッドです。それがどのモジュールの一部であるかはわかりませんが、そのスニペットはこれとほぼ同等です:

Kernel.directory.call("test_dir",lambda {action :create; recursive true})

directoryこのスニペットでは、Kernel オブジェクトにメソッドを追加する gem を使用しています。

他の人が述べたように、これはディレクトリ管理 DSL Chefの一部です。DSL は、カーネル オブジェクトに統合された一連のメソッドです。Ruby のメソッド呼び出し構文は非常に柔軟であるため、メソッド呼び出しは言語のキーワードによく似ています。これにより、タスク固有のコマンド (Domain Specific Languages: DSL) が Ruby で非常に見栄えがよくなります。使いやすく、柔軟です。したがって、DSL を追加する gem は非常に一般的です。

于 2012-10-18T15:30:44.503 に答える
1

Chefフレームワークのディレクトリリソースです。(DSL はドメイン固有言語の略です。Ruby はそれらに適しています。)

于 2012-10-18T15:30:58.537 に答える