जेनकिंस पाइपलाइन ग्रूवी -सीपीएस दुभाषिया का उपयोग करके निरंतर-गुजर शैली में ग्रूवी कोड को निष्पादित करती है। यह वेनिला ग्रूवी नहीं है जिसे आप सीधे आईडीई या ग्रूवी शेल में निष्पादित कर सकते हैं।
ग्रूवी सीपीएस निरंतरता-गुजर शैली और सही ग्रूवी अभिव्यक्ति का समर्थन करने के लिए आपके कोड को बदल देता है:
a = b = c = 0
ऐसी चीज़ में तब्दील हो जाता है जो अधिक दिखती है:
eval(
var("a"),
assign(
eval(
var("b"),
assign(
eval(
var("c"),
assign(0)
)
)
)
)
)
सीपीएस दुभाषिया में इस अभिव्यक्ति के साथ समस्या यह है कि असाइनमेंट किसी भी मूल्य को वापस नहीं करता है, और इस प्रकार null
मान चर को सौंपा जाता है b
, और यही बात चर के लिए होती है a
।
यदि आप सीपीएस इनवोकेशन ब्लॉक में गहरी खुदाई करना चाहते हैं, तो आप ग्रूवी-सीपीएस परियोजना को क्लोन कर सकते हैं और com.cloudbees.groovy.cps.CpsTransformerTest
कक्षा में एक साधारण परीक्षण केस लिख सकते हैं ।
@Test
void testMultiVariablesInlineCPS() {
def cps = parseCps('''
int a, b, c
a = b = c = 0
''')
println cps
}
तब आप println cps
डीबगर पर एक ब्रेकपॉइंट लगा सकते हैं और चला सकते हैं। जब आप निरीक्षण विंडो खोलते हैं, तो आपको इस चित्र के समान दिखाई देगा:
एक साइड नोट के रूप में, ध्यान रखें कि ग्रूवी कंपाइलर आपके सिंगल लाइन असाइनमेंट को भी बदल देता है जब कोड को बायटेकोड पर संकलित किया जाता है। यदि आप एक सरल ग्रूवी स्क्रिप्ट संकलित करते हैं जैसे:
int a, b, c
a = b = c = 0
println "$a $b $c"
और फिर आप IDE में अपनी कक्षा की फाइल को बाइटकोड को जावा समकक्ष के विघटित करने के लिए खोलते हैं, आपको कुछ इस तरह दिखाई देगा:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import groovy.lang.Binding;
import groovy.lang.Script;
import org.codehaus.groovy.runtime.GStringImpl;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.callsite.CallSite;
public class test extends Script {
public test() {
CallSite[] var1 = $getCallSiteArray();
}
public test(Binding context) {
CallSite[] var2 = $getCallSiteArray();
super(context);
}
public static void main(String... args) {
CallSite[] var1 = $getCallSiteArray();
var1[0].call(InvokerHelper.class, test.class, args);
}
public Object run() {
CallSite[] var1 = $getCallSiteArray();
int a = 0;
int b = 0;
int c = 0;
byte var5 = 0;
return var1[1].callCurrent(this, new GStringImpl(new Object[]{Integer.valueOf(var5), Integer.valueOf(var5), Integer.valueOf(var5)}, new String[]{"", " ", " ", ""}));
}
}