Ответ 1
Что касается ткани 1.5 (выпущена), fabric.context_managers.shell_env
делает то, что вы хотите.
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
Я хотел бы передать несколько значений из ткани в удаленную среду, и я не вижу отличного способа сделать это. Самое лучшее, что я придумал до сих пор:
with prefix('export FOO=BAR'):
run('env | grep BAR')
Это похоже на работу, но это похоже на хак.
Я посмотрел в репозиторий GIT, и он выглядит так: issue # 263.
Что касается ткани 1.5 (выпущена), fabric.context_managers.shell_env
делает то, что вы хотите.
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
Я думаю, что ваше решение на основе prefix
отлично подходит. Однако, если вы хотите, чтобы менеджер контекста shell_env
был предложен в issue # 263, вы можете использовать следующую альтернативную реализацию в ваших файлах fab:
from fabric.api import run, env, prefix
from contextlib import contextmanager
@contextmanager
def shell_env(**env_vars):
orig_shell = env['shell']
env_vars_str = ' '.join('{0}={1}'.format(key, value)
for key, value in env_vars.items())
env['shell']='{0} {1}'.format(env_vars_str, orig_shell)
yield
env['shell']= orig_shell
def my_task():
with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'):
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
run('env | grep BAR')
Обратите внимание, что этот менеджер контекста изменяет env['shell']
вместо env['command_prefixes']
(как это делает prefix
менеджер контекста), поэтому вы:
prefix
(см. пример ниже) без проблем взаимодействия, упомянутых в выпуске # 263.env['shell']
перед использованием shell_env
. В противном случае изменения shell_env
будут перезаписаны, а переменные окружения не будут доступны для ваших команд.При выполнении файла fab выше вы получаете следующий результат:
$ fab -H localhost my_task
[localhost] Executing task 'my_task'
[localhost] run: env | grep BAR
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3
[localhost] out: FOO1=BAR1
[localhost] out: FOO2=BAR2
[localhost] out: FOO3=BAR3
[localhost] out:
Done.
Disconnecting from localhost... done.
Ткань 1.5.0 (в настоящее время в Git) принимает shell как local() named argument. Если вы передадите '/bin/ bash', он передает его в исполняемый аргумент Popen.
Он не будет выполнять ваш .bashrc, хотя из-за того, что .bashrc получен при интерактивном вызове bash. Вы можете указать любой файл, который вы хотите внутри локального:
local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash')
Другой способ - передать значение через командную строку с -set:
--set=domain=stackoverflow.com
Затем вы можете обратиться к нему в script с помощью env.domain
см. http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set