1

当我使用 Fabric 时,我正在学习 Python。看起来我对 Python 和/或 Fabric 的工作原理有一个基本的误解。看看我的 2 个脚本

应用部署.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'])

工厂文件.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.

但是,运行最后一个任务,该任务旨在配置环境并在单个任务中执行某些操作,看起来fabric 没有配置环境

$ 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 已经设置好了,但是,fabric 的行为就像它不是:

$ fab dev_hello
['localhost']
No hosts found. Please specify (single) host string for connection:

这里发生了什么?

4

1 回答 1

1

我不确定你想做什么,但是......

如果您丢失了有关 shell/环境的信息——Fabric 在单独的 shell 语句中运行每个命令,因此您需要手动链接命令或使用prefix上下文管理器。

请参阅http://docs.fabfile.org/en/1.8/faq.html#my-cd-workon-export-etc-calls-don-t-seem-to-work

如果您在“python”中丢失了信息,它可能与我最近遇到的这个错误/行为有关 [ https://github.com/fabric/fabric/issues/1004 ] 我使用的 shell 进入 Fabric似乎被抹杀了。

于 2013-10-23T22:39:51.393 回答