0

Fabric (Ubuntu 13.04 のバージョン 1.7.0) で問題が発生しています。

この関数を考えてみましょう:

def does_not_work():
  with cd('/absolute/folder/one/'):
    with prefix('change_path_command'):
      with cd('/absolute/folder/two/'):
        run('some_random_command')

次と同じコマンドを実行することを期待しています:

def works():
  run('cd /absolute/folder/one/ && change_path_command && cd /absolute/folder/two/ && some_random_command')

ただし、以下は の Fabric 出力ですfab does_not_work

Requested: some_random_command
Executed: /bin/bash -l -c "cd /absolute/folder/two/ && change_path_command && some_random_command"

ネスティングcds が問題を引き起こしているようです。

良い説明はありますか?

4

1 に答える 1

1

cdコンテキスト マネージャーprefixコンテキスト マネージャーは、コマンドを呼び出したときに実際にはコマンドを実行しません。ローカル環境設定を変更するだけで、その後の and/or の呼び出しに影響しrun()ますsudo()

したがって、あなたrun('some_random_command')が実行されると、それが実行され、( cd=/folder/oneprefix=change_path_commandcd=/folder/two) のコンテキストで実行され、内部cdが外部よりも優先されるためcd、最終結果は で実行される単一のコマンドになりcd /folder/two && change_path_command && some_random_commandます。

cdとのソースコードを見て、prefixそれがどのように機能するかをよりよく理解してください。最終的に行うことは、fabric.state.env出入りするときに辞書を変更することだけです。これらは後で への呼び出しに適用され、関数から呼び出され、関数を介して_prefix_commands()呼び出されます。run()sudo()_run_command()

于 2013-08-26T20:10:13.470 に答える