Jenkins pipelines รันโค้ด Groovy ในรูปแบบการส่งต่อโดยใช้ล่ามgroovy-cps นี่ไม่ใช่วานิลลา Groovy คุณสามารถดำเนินการโดยตรงใน IDE หรือใน Groovy Shell
Groovy CPS แปลงรหัสของคุณเพื่อสนับสนุนรูปแบบการส่งต่อและนิพจน์ Groovy ที่ถูกต้องเช่น:
a = b = c = 0
ได้รับการเปลี่ยนเป็นสิ่งที่ดูเหมือน:
eval(
var("a"),
assign(
eval(
var("b"),
assign(
eval(
var("c"),
assign(0)
)
)
)
)
)
ปัญหาเกี่ยวกับการแสดงออกในล่าม CPS ที่เป็นที่ได้รับมอบหมายไม่ได้กลับค่าใด ๆ และทำให้null
ค่าที่ได้รับมอบหมายให้ตัวแปรและสิ่งเดียวกันที่เกิดขึ้นให้กับตัวแปรb
a
หากคุณต้องการขุดลึกลงไปในบล็อกการเรียกใช้ CPS คุณสามารถโคลนโครงการ groovy-cps และเขียนกรณีทดสอบง่ายๆในcom.cloudbees.groovy.cps.CpsTransformerTest
ชั้นเรียน
@Test
void testMultiVariablesInlineCPS() {
def cps = parseCps('''
int a, b, c
a = b = c = 0
''')
println cps
}
จากนั้นคุณสามารถใส่เบรกพอยต์ที่println cps
และเรียกใช้ดีบักเกอร์ เมื่อคุณเปิดหน้าต่างตรวจสอบคุณจะเห็นภาพคล้ายกับภาพนี้:
โปรดทราบว่าคอมไพเลอร์ Groovy จะแปลงการมอบหมายบรรทัดเดียวของคุณเมื่อรวบรวมรหัสเป็น bytecode หากคุณรวบรวมสคริปต์ Groovy ง่ายๆเช่น:
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[]{"", " ", " ", ""}));
}
}