私は Fabric を扱っているので、Python で歯を磨いています。Python や Fabric がどのように機能するかについて、基本的な誤解があるようです。私の2つのスクリプトを見てください
AppDeploy.py
from fabric.api import *
class AppDeploy:
# Environment configuration, all in a dictionary
environments = {
'dev' : {
'hosts' : ['localhost'],
},
}
# Fabric environment
env = None
# Take the fabric environment as a constructor argument
def __init__(self, env):
self.env = env
# Configure the fabric environment
def configure_env(self, environment):
self.env.hosts.extend(self.environments[environment]['hosts'])
fabfile.py
from fabric.api import *
from AppDeploy import AppDeploy
# Instantiate the backend class with
# all the real configuration and logic
deployer = AppDeploy(env)
# Wrapper functions to select an environment
@task
def env_dev():
deployer.configure_env('dev')
@task
def hello():
run('echo hello')
@task
def dev_hello():
deployer.configure_env('dev')
run('echo hello')
最初の 2 つのタスクの連鎖が機能する
$ fab env_dev hello
[localhost] Executing task 'hello'
[localhost] run: echo hello
[localhost] out: hello
Done.
Disconnecting from localhost... done.
ただし、環境を構成し、単一のタスクで何かを行うことを目的とした最後のタスクを実行すると、ファブリックに環境が構成されていないように見えます
$ fab dev_hello
No hosts found. Please specify (single) host string for connection:
ただし、その方法をそのように微調整すると、かなり迷ってしまいます
@task
def dev_hello():
deployer.configure_env('dev')
print(env.hosts)
run('echo hello')
設定されているように見えますが、ファブリックは設定されていないように動作していますenv.hosts
:
$ fab dev_hello
['localhost']
No hosts found. Please specify (single) host string for connection:
何が起きてる?