Parametreyi kumaş görevine geçir


123

Komut satırından "fab" çağırırken bir yapı görevine nasıl parametre aktarabilirim? Örneğin:

def task(something=''):
    print "You said %s" % something
$ fab task "hello"
You said hello

Done.

Bunu sormadan yapmak mümkün mü fabric.operations.prompt?

Yanıtlar:


207

Fabric 2 görev bağımsız değişkenleri belgeleri:

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Fabric 1.X, bağımsız değişkenleri görevlere iletmek için aşağıdaki sözdizimini kullanır:

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

Bununla ilgili daha fazla bilgiyi Fabric belgelerinde okuyabilirsiniz .


9
Alıntılara gerek yoktur; tüm argümanlar dizelerdir: "bu işlem dizge ayrıştırmayı içerdiğinden, tüm değerler Python dizeleri olarak sonlanacaktır, bu nedenle buna göre plan yapın. (Sezgisel bir sözdizimi bulunabilmesi koşuluyla Fabric'in gelecekteki sürümlerinde bunu geliştirmeyi umuyoruz.)"
Carl G

4
Yine de etrafındaki alıntılar hello worldgerekli görünüyor?
PEZ

2
@PEZ Eğer bu doğruysa, bu örnekte muhtemelen alıntılar gereklidir, çünkü uçbirim veya yapının komut satırı ayrıştırıcısı alanı görür ve bunun o görev için her şeyin sonu olduğunu düşünür ve bu worldyeni bir görevdir.
Adam Kerz

1
Ek olarak, bunu bir dakikadan daha kısa bir süre kullandıktan sonra, Windows'ta tek tırnak kullanmanın, tek tırnakların bağımsız değişkenin bir parçası olarak aktarılmasına neden olduğunu, ancak önce çift tırnakların kaldırıldığını gördüm. Yani, 'hello world'bir Python dizisi ile sonuçlanır 'hello world', ancak "hello world"sonuçlanır hello world(muhtemelen çoğu insanın isteyeceği şeydir).
Adam Kerz

5
Süreç dizi ayrıştırmayı içerdiğinden, bar=Truekumaşta komut bar='True'boole değeri olmayan olarak geçecek
Chemical Programmer

7

Kumaş argümanları çok temel dize ayrıştırma ile anlaşılır, bu yüzden onları nasıl göndereceğinize biraz dikkat etmelisiniz.

Aşağıda, aşağıdaki test işlevine bağımsız değişken iletmenin farklı yollarına birkaç örnek verilmiştir:

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

Kabuğu denklemden çıkarmak için burada çift tırnak kullanıyorum, ancak bazı platformlar için tek tırnak daha iyi olabilir. Ayrıca, kumaşın sınırlayıcı olarak kabul ettiği karakterlerin çıkışlarına da dikkat edin.

Dokümanlarda daha fazla ayrıntı: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


7

Fabric 2'de, argümanı görev işlevinize eklemeniz yeterlidir. Örneğin, versionargümanı göreve geçirmek için deploy:

@task
def deploy(context, version):
    ...

Aşağıdaki gibi çalıştırın:

fab -H host deploy --version v1.2.3

Kumaş, seçenekleri otomatik olarak belgeler:

$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]

Docstring:
  none

Options:
  -v STRING, --version=STRING

Ana bilgisayarları işlevin kendisinde önceden tanımlamanın bir yolu var mı? Görevi çalıştırmak için ana bilgisayarların listesini tanımlayabileceğimiz @roles () etiketine benzer.
Anish

2

Tüm Python değişkenlerini dizeler olarak geçirmeniz gerekir, özellikle de betikleri çalıştırmak için alt süreç kullanıyorsanız, aksi takdirde bir hata alırsınız. Değişkenleri int / boolean türlerine ayrı ayrı dönüştürmeniz gerekecek.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'

1

Eğer birisi fabric2'de bir görevden diğerine parametre aktarmak istiyorsa, bunun için çevre sözlüğünü kullanın:

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

Ve koş:

fab2 qa sign
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.