Python's Fabric, execute
işlevini kullanarak fab
yardımcı programının dışında kumaş işlevlerini çağırmayı sağlar. Bir 1.execute
işlevi, yürütme kullanılarak çağrılan başka bir işlev içinde çağrıldığında bağlamsal bir sorun ortaya çıkar. Kumaş, iç yürütme çalıştırıldığında dış yürütme bağlamını kaybeder ve hiçbir zaman kurtarmaz. Örneğin:Python'un Kumaş kitaplığı ile "yürütme" için iç içe aramalar yapma
env.roledefs = {
'webservers': ['web1','web2'],
'load_balancer': ['lb1']
}
@roles('webserver')
def deploy_code():
#ship over tar.gz of code to unpack.
...
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
...
#shutdown webserver, unpack files, and restart web server
...
execute(add_webserver_to_load_balancer, sHost=env.host_string)
@roles('load_balancer')
def remove_webserver_from_load_balancer(sHost=None):
ssh("remove_host %s" % sHost)
execute(deploy_code)
execute
ilk aramadan sonra, kumaş tamamen bağlamı kaybeder ve host_string='lb1'
yerine 'web1'
ile deploy_code
işlevi içinde tüm diğer komutları yürütür. Hatırlamak için onu nasıl alabilirim?
bu hack ile geldi, ancak gelecek sürümlerde üzerinde kırılabilir gibi hissediyorum: Bu etkin tüm devlet kaydeden çağrısından sonra bunu geri
with settings(**env):
execute(remove_webserver_from_load_balancer, sHost=env.host_string)
, ancak istenmeyen bir yol gibi görünüyor işlevi. Fabric'e iç içe geçmiş bir işlemde olduğunu ve durumu hatırlamak için bir ayar yığını mı yoksa eşdeğer bir yöntem mi olduğunu söylemenin daha iyi bir yolu var mı?
Teşekkürler!
btw, kullanıyorum Fabric 1.3.4 – adowds
Neden sadece işlevleri doğrudan çağırmak yerine execute() 'içindeki görevleri kullanıyorsunuz? – jfs
@JFSebastian Sanırım [belgeler] (http://docs.fabfile.org/en/1.3.3/usage/execution.html#execute) sorunuzu yanıtlıyor: 'Kumaşın tasarımı büyülü davranışı eskort ediyor. görev işlevi rolleri gibi dekoratörler dikkate almaz. – jcollado