Есть ли в любом случае, что я могу получить от заводного закрытия

#groovy #closures #jenkins-groovy

Вопрос:

У меня есть закрытие, как показано ниже, и я хочу получить значение от a, b, c.

 #!/usr/bin/env groovy
entry {
    a = false
    b = "nodejs"
    c = "xxx"
}
println entry.a
println entry.b
println entry.c
 

Есть ли какой-нибудь способ, которым я могу этого достичь ?
Я всегда получал ошибку, как показано ниже

 % groovy jenkinsfile.groovy
Caught: groovy.lang.MissingMethodException: No signature of method: jenkinsfile.entry() is applicable for argument types: (jenkinsfile$_run_closure1) values: [jenkinsfile$_run_closure1@12aba8be]
Possible solutions: every(), every(groovy.lang.Closure), any(), any(groovy.lang.Closure), notify(), identity(groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: jenkinsfile.entry() is applicable for argument types: (jenkinsfile$_run_closure1) values: [jenkinsfile$_run_closure1@12aba8be]
Possible solutions: every(), every(groovy.lang.Closure), any(), any(groovy.lang.Closure), notify(), identity(groovy.lang.Closure)
    at jenkinsfile.run(jenkinsfile.groovy:2)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 

Я должен использовать этот способ, потому что у меня много файлов Дженкинса, написанных в этом формате, и я хочу получать значения из файла Дженкинса. Это формат из файла Дженкинса.

Комментарии:

1. Нет, тогда это невозможно, если вы не можете или не хотите это изменить

2. entry {a=false ...} это не завершение. это похоже на вызов вызываемой функции entry , которая принимает параметр тело замыкания, являющееся блоком между { и }. Поскольку функция не entry определена, вы получаете эту ошибку.

Ответ №1:

как насчет того, чтобы использовать для этого литерал карты:

 entry = [
    a:false,
    b:"nodejs",
    c:"xxx"
]
println entry.a
println entry.b
println entry.c
 

Комментарии:

1. Я должен использовать этот способ, потому что у меня много файлов Дженкинса, написанных в этом формате, и я хочу получать значения из файла Дженкинса. Это формат из файла Дженкинса.

2. Возможно, имеет смысл прочитать эти файлы в виде текста и проанализировать значения с помощью некоторого регулярного выражения