130

ファブリック スクリプトをローカルで実行して、サーバーにログインし、デプロイするユーザーを切り替え、プロジェクト .virtualenv をアクティブにします。これにより、dir がプロジェクトに変更され、git pull が発行されます。

def git_pull():
    sudo('su deploy')
    # here i need to switch to the virtualenv
    run('git pull')

私は通常、activate ファイルをソースとする virtualenvwrapper の workon コマンドを使用し、postactivate ファイルによってプロジェクト フォルダーに配置されます。この場合、ファブリックはシェル内から実行されるため、制御がファブリックに渡されているようで、bash の組み込みソースを「$source ~/.virtualenv/myvenv/bin/activate」に使用することはできません。

彼らがこれをどのように行ったかの例と説明を持っている人はいますか?

4

10 に答える 10

138

bitprophet の予測の更新として: Fabric 1.0 では、prefix()と独自のコンテキスト マネージャーを利用できます。

from __future__ import with_statement
from fabric.api import *
from contextlib import contextmanager as _contextmanager

env.hosts = ['servername']
env.user = 'deploy'
env.keyfile = ['$HOME/.ssh/deploy_rsa']
env.directory = '/path/to/virtualenvs/project'
env.activate = 'source /path/to/virtualenvs/project/bin/activate'

@_contextmanager
def virtualenv():
    with cd(env.directory):
        with prefix(env.activate):
            yield

def deploy():
    with virtualenv():
        run('pip freeze')
于 2011-03-19T04:06:46.580 に答える
96

今のところ、あなたは私がしていることを行うことができます. 、そうでない場合):

def task():
    workon = 'workon myvenv && '
    run(workon + 'git pull')
    run(workon + 'do other stuff, etc')

バージョン 1.0 以降、Fabric にはこの手法を使用するprefixコンテキスト マネージャーがあり、たとえば次のことができます。

def task():
    with prefix('workon myvenv'):
        run('git pull')
        run('do other stuff, etc')

*失敗した場合 (決して実行されない) や、適切にエスケープされておらず、特殊なシェル文字が含まれているcommand1 && command2場合など、このアプローチを使用すると爆発する可能性がある場合があります。command1command2command1

于 2009-07-24T23:32:09.870 に答える
18

run() の代わりに呼び出すことができる単純なラッパー関数 virtualenv() を使用しています。cd コンテキスト マネージャーを使用しないため、相対パスを使用できます。

def virtualenv(command):
    """
    Run a command in the virtualenv. This prefixes the command with the source
    command.
    Usage:
        virtualenv('pip install django')
    """
    source = 'source %(project_directory)s/bin/activate && ' % env
    run(source + command)
于 2010-08-04T07:48:49.420 に答える
9

virtualenvwrapperこれを少し簡単にすることができます

  1. @nh2 のアプローチを使用する (このアプローチは を使用する場合にも機能しますが、が にあるlocalvirtualenvwrapper インストール、つまり Windows でのみ機能します)workon$PATH

    from contextlib import contextmanager
    from fabric.api import prefix
    
    @contextmanager
    def virtualenv():
        with prefix("workon env1"):
            yield
    
    def deploy():
        with virtualenv():
            run("pip freeze > requirements.txt")
    
  2. または、fab ファイルをデプロイしてローカルで実行します。この設定により、ローカルまたはリモート コマンドの virtualenv をアクティブ化できます。このアプローチは、次localを使用して.bashrcを実行できないことを回避するため、強力bash -lです。

    @contextmanager
    def local_prefix(shell, prefix):
        def local_call(command):
            return local("%(sh)s \"%(pre)s && %(cmd)s\"" % 
                {"sh": shell, "pre": prefix, "cmd": command})
        yield local_prefix
    
    def write_requirements(shell="/bin/bash -lic", env="env1"):
        with local_prefix(shell, "workon %s" % env) as local:
            local("pip freeze > requirements.txt")
    
    write_requirements()  # locally
    run("fab write_requirements")
    
于 2013-08-23T07:45:03.533 に答える