2017-10-04 3 views
1

Il est un modèle de commande à écrire du code de pipeline Jenkins comme ceci:Pourquoi le fichier jenkins utilise-t-il une fermeture de cette manière?

def call(body) {  
    def config = [:] 
    body.resolveStrategy = Closure.DELEGATE_FIRST 
    body.delegate = config 
    body() 
} 

Je ne sais pas comment mot cela simplement, mais cette fermeture obtenir implicitement importés et peut être appelé par le nom de fichier du fichier .groovy il vit dans

Je l'appelle comme:.

MyClosure { myarg = 'sdfsdf' } 

Je pas tout à fait sûr de ce que cela fait. Il fait call(body), puis attribue body en tant que délégué. ce qui signifie que la fermeture je le passe est le délégué, mais n'est-ce pas seulement le propriétaire? Wah? moi confus.

Répondre

3

Lorsque cette opération est en cours, elle crée une carte vide (config). Ensuite, il indique à la fermeture (body) de rechercher d'abord le délégué pour trouver les propriétés en définissant sa résolutionStrategy comme étant la constante Closure.DELEGATE_FIRST. Ensuite, il affecte la carte config en tant que délégué pour l'objet corps. Maintenant, lorsque vous exécutez la fermeture body(), les variables sont étendues à la carte config, alors config.myarg = 'sdfsdf'.

Maintenant, plus tard dans le code, vous pouvez avoir un accès facile à la carte des valeurs dans config.

body est le propriétaire , et par défaut est le délégué . Mais lorsque vous changez le délégué pour être config, et lui dire d'utiliser d'abord le délégué, vous obtenez les variables config portée. Que se passe-t-il si je n'ai pas basculé le délégué en config?

+0

Le corps serait le délégué? Si c'était le cas, n'aurais-je aucun moyen d'accéder à la myarg qui est passée? – red888

+0

Droite. 'body' est une variable qui pointe vers une fonction anonyme. Si vous n'avez pas modifié le délégué, alors myarg sera défini sur 'sdfsdf' dans la portée de cette fonction et dès que cette fonction sera terminée, cette valeur disparaîtra. Mais si vous déléguez à l'objet carte, il définit la propriété sur l'objet, que vous pouvez maintenant atteindre. –

+1

En fait, le corps ne désigne pas une fonction. C'est un exemple de fermeture. – Opal