Jawaban:
Dokumentasi argumen tugas Fabric 2:
http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments
Fabric 1.X menggunakan sintaks berikut untuk meneruskan argumen ke tugas:
fab task:'hello world'
fab task:something='hello'
fab task:foo=99,bar=True
fab task:foo,bar
Anda dapat membaca lebih lanjut tentang ini di dokumen Fabric .
hello world
tampaknya perlu?
world
adalah tugas baru.
'hello world'
akan menghasilkan string Python 'hello world'
, tetapi "hello world"
akan menghasilkan hello world
(yang mungkin diinginkan kebanyakan orang).
bar=True
dalam perintah fabric akan diteruskan sebagai bar='True'
yang bukan nilai boolean
Argumen fabric dipahami dengan penguraian string yang sangat dasar, jadi Anda harus sedikit berhati-hati dalam mengirimnya.
Berikut adalah beberapa contoh cara berbeda untuk meneruskan argumen ke fungsi pengujian berikut:
@task
def test(*args, **kwargs):
print("args:", args)
print("named args:", kwargs)
$ fab "test:hello world"
('args:', ('hello world',))
('named args:', {})
$ fab "test:hello,world"
('args:', ('hello', 'world'))
('named args:', {})
$ fab "test:message=hello world"
('args:', ())
('named args:', {'message': 'hello world'})
$ fab "test:message=message \= hello\, world"
('args:', ())
('named args:', {'message': 'message = hello, world'})
Saya menggunakan kutipan ganda di sini untuk mengeluarkan shell dari persamaan, tetapi tanda kutip tunggal mungkin lebih baik untuk beberapa platform. Perhatikan juga pelarian untuk karakter yang dianggap sebagai pembatas oleh fabric.
Detail lebih lanjut di dokumen: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments
Di Fabric 2, cukup tambahkan argumen ke fungsi tugas Anda. Misalnya, untuk meneruskan version
argumen ke tugas deploy
:
@task
def deploy(context, version):
...
Jalankan sebagai berikut:
fab -H host deploy --version v1.2.3
Fabric bahkan mendokumentasikan opsi secara otomatis:
$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]
Docstring:
none
Options:
-v STRING, --version=STRING
Anda harus meneruskan semua variabel Python sebagai string, terutama jika Anda menggunakan sub-proses untuk menjalankan skrip, atau Anda akan mendapatkan error. Anda perlu mengubah variabel kembali menjadi tipe int / boolean secara terpisah.
def print_this(var):
print str(var)
fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
Jika seseorang ingin meneruskan parameter dari satu tugas ke tugas lain di fabric2, cukup gunakan kamus lingkungan untuk itu:
@task
def qa(ctx):
ctx.config.run.env['counter'] = 22
ctx.config.run.env['conn'] = Connection('qa_host')
@task
def sign(ctx):
print(ctx.config.run.env['counter'])
conn = ctx.config.run.env['conn']
conn.run('touch mike_was_here.txt')
Dan lari:
fab2 qa sign