2011-11-29 26 views
39

Tôi muốn chuyển một vài giá trị từ vải vào môi trường từ xa, và tôi không thấy một cách tuyệt vời để làm điều đó. Điều tốt nhất tôi đã đưa ra cho đến thời điểm này là:Cách tốt nhất để thêm biến môi trường trong vải?

with prefix('export FOO=BAR'): 
    run('env | grep BAR') 

Điều này dường như hoạt động nhưng có vẻ như một chút hack.

Tôi đã tìm trong kho GIT và có vẻ như đây là issue #263.

+1

Nhưng các biến sẽ tồn tại sau khi vải đóng kết nối? Từ tài liệu ('prefix' và' shell_env') tôi hiểu rằng các biến môi trường sẽ được thiết lập chỉ cho các lệnh được bọc. – glarrain

Trả lời

11

Tôi nghĩ giải pháp dựa trên prefix của bạn là hoàn toàn hợp lệ. Tuy nhiên, nếu bạn muốn có một người quản lý shell_env bối cảnh là một đề xuất trong issue#263, bạn có thể sử dụng việc thực hiện thay thế sau trong file fab của bạn:

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') 

Lưu ý rằng quản lý bối cảnh này sẽ thay đổi env['shell'] thay vì env['command_prefixes'] (như prefix quản lý bối cảnh thực hiện), vì vậy bạn:

  • vẫn có thể sử dụng prefix (xem ra ví dụ dưới đây) mà không có vấn đề tương tác nêu tại issue#263.
  • phải áp dụng bất kỳ thay đổi nào cho env['shell'] trước khi sử dụng shell_env. Nếu không, các thay đổi shell_env sẽ bị ghi đè và các biến môi trường sẽ không khả dụng cho các lệnh của bạn.

Khi thực hiện các tập tin fab ở trên, bạn sẽ có được kết quả như sau:

$ 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

Tôi đã sử dụng kỹ thuật này, nhưng tôi đã nhận thấy trong các phiên bản sau của vải nó không còn hoạt động nữa. Thay vào đó, bạn nên/phải sử dụng việc thực hiện fabric.context_managers.shell_env, nó hoạt động. –

2

Vải 1.5.0 (hiện đang trong Git) có vỏ như địa phương() tên đối số. Nếu bạn vượt qua '/ bin/bash', nó sẽ chuyển nó tới đối số thực thi của Popen.

Nó sẽ không thực thi .bashrc của bạn mặc dù vì .bashrc có nguồn gốc trên yêu cầu tương tác của bash. Bạn có thể cung cấp bất kỳ tệp nào bạn muốn bên trong địa phương:

local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash') 
56

Kể từ vải 1.5 (phát hành), fabric.context_managers.shell_env làm những gì bạn muốn.

with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'): 
     local("echo FOO1 is $FOO1") 
+1

Dường như không hoạt động trên Windows. Hỗ trợ đã được thêm vào, nhưng nó không có trong bản phát hành mới nhất (1.6). –

+0

Nhưng các biến sẽ tồn tại sau khi vải đóng kết nối? Từ tài liệu này tôi hiểu rằng các biến môi trường sẽ được thiết lập chỉ cho các lệnh được bao bọc. – glarrain

+0

@glarrain vâng, đó là điểm của họ thực hiện nó như một người quản lý ngữ cảnh – Anentropic

Các vấn đề liên quan