Build Script — สคริปท์สร้างโปรแกรม

วันนี้จะพูดเรื่อง build script สักหน่อยครับ โดยปรกติเวลาที่เราเขียนโปรแกรมขึ้นมาสักตัวเนี่ย จากซอร์สโค๊ดไปเป็นไฟล์โปรแกรมจะผ่านขั้นตอนบางอย่าง อย่างถ้าเป็นภาษา C/C++ ก็ต้อง compile แล้วก็ link หรือถ้าเป็นพวก java web application ก็ต้อง compile แล้วเอาผลลัพท์ไปแพ็ครวมกันเป็นแ็คเกจ ขั้นตอนนี้จะเรียกรวม ๆ ว่าการ build ก็คือการเอาไฟล์ต้นฉบับมาสร้างให้เป็นไฟล์แอพพลิเคชั่นที่พร้อมจะถูกเรียกใช้งานนั่นเอง

การ build โปรแกรมนั้นสามารถทำด้วยมือได้ อย่างถ้าคุณเขียนโปรแกรมด้วยภาษา C เนี่ยก็สามารถบิลด์ด้วยคำสั่ง

 gcc test.cpp -o test.exe

หรือถ้าเป็น java ก็จะเป็น

javac Test.java

ซึ่ง พอโปรแกรมเริ่มมีขนาดใหญ่ เริ่มมีจำนวนไฟล์มากขึ้น การที่จะสั่ง build โปรแกรมด้วยมือนั้นคงเป็นเรื่องที่น่าหงุดหงิดมิใช่น้อย โปรแกรม IDE แทบทุกตัวจึงให้ระบบ build โปรแกรมติดมาด้วย อย่างใน Visual Studio ก็แค่กด Ctrl+Shift+B หรือใน Eclipse ก็กด Ctrl+B (ทั้งสองโปรแกรมสามารถสั่ง build ได้จากเมนูครับ แต่จำ shortcut ไว้ก็ดี) ระบบก็จะเริ่ม build โปรแกรมให้คุณ ง่ายไหมล่ะ ?

แต่ระบบ build ของ IDE เองก็มีข้อจำกัด ด้วยความที่ IDE นั้นออกแบบมาเพื่อให้ใช้งานได้จาก GUI ถ้าหากว่าโปรแกรมนั้น ๆ มีขั้นตอนในการ build โปรแกรมที่ซับซ้อนมาก ๆ การเขียน GUI ขึ้นมารองรับทุกกรณีที่เป็นไปได้นั้นเป็นเรื่องยากครับ

ผลิตภัณฑ์ที่ผมทำงานด้วยตัวหนึ่งมีเอกสารอธิบายวิธี build โปรแกรมความยาว 20 หน้ากระดาษ A4 ประกอบอยู่ครับ และขั้นตอนนี้ใช้ IDE ในการ build แล้วนะครับ ซึ่งที่ต้องอธิบายเยอะมากขนาดนั้นเป็นเพราะว่าต้องแก้ไฟล์ configuration หลายไฟล์ และต้องมีการเตรียมไฟล์ resource ซึ่งต้องทำด้วยมือเพราะว่า IDE ไม่รองรับอีกด้วย ที่แย่กว่านั้นคือถ้ามีอะไรที่ทำผิดขั้นตอนไปแม้แต่ขั้นตอนเดียว โปรแกรมนั้นอาจจะไม่ทำงานเลยล่ะครับ

แล้วเราจะทำยังไงให้การ build โปรแกรมนั้นทำได้ง่ายขึ้นดีล่ะ ?

Build File

สำหรับปัญหาการ build โปรแกรม ผมเชื่อว่าหลาย ๆ คนน่าจะคิดถึง build file เป็นอันดับแรก

Build file นั้นเป็นสิ่งที่เกิดขึ้นมานานแล้ว น่าจะอยู่ในยุคเดียวกับ IDE เลยนั่นแหละ โดยพื้นฐานแล้ว build file เป็นไฟล์ที่ระบุ (describe) ถึงขั้นตอนการ build โปรแกรม ซึ่งมีตั้งแต่ไฟล์ที่จำเป็นต้องใช้ ไลบราลีที่ต้องใช้ ชื่อไฟล์ผลลัพท์ รวมถึงสามารถรันโปรแกรมภายนอกเพื่อวัตถุประสงค์บางอย่างได้ด้วย

ระบบที่อ่าน build file เพื่อที่จะ build โปรแกรมนั้นก็มีที่นิยมอยู่หลายตัว อย่าง Apache Ant สำหรับ Java หรือ GNU Make สำหรับแพลตฟอร์มบน Unix

build file เองจริง ๆ ก็ไม่ได้ดีกว่าระบบ build บน IDE สักเท่าไหร่หรอกครับ จริงอยู่ว่าเราสามารถระบุการ build ว่าจะต้องทำอะไรยังไงบ้างได้คร่าว ๆ แต่การเพิ่มรายละเอียดในแต่ละขั้นตอนของการ build โปรแกรมนั้นเป็นเรื่องทำได้ยากจนถึงขั้นทำไม่ได้เลยในวิธีนี้ ถ้าคุณเจอซอฟท์แวร์ที่มีขั้นตอนการ build ที่ซับซ้อนมาก ๆ ก็คงเป็นเรื่องลำบากที่จะเขียน build script ให้ทำงานได้อย่างถูกต้องและครบถ้วนอยู่ดี

ที่แย่กว่านั้นคือ build file อ่านยากครับ ... มันจะทำอะไรบ้างเราก็ไม่รู้ บางทีต้องปรับแก้โน่นนั่นนี่เพราะว่าไม่รู้ว่าผลลัพท์หน้าตาจะเป็นยังไง

สำหรับผลิตภัณฑ์ที่ผมพูดถึงข้างบน ผมเคยลองเขียน build file แล้ว มันช่วยลดขั้นตอนการบิลด์จาก 20 หน้า เหลือ ... ประมาณ 18 หน้าครับ พูดง่าย ๆ คือมันไม่ช่วยอะไรเลย ...

Build Script

พูดถึงคำว่า script มันก็เป็นโปรแกรมประเภทหนึ่งที่สามารถรันได้โดยไม่ต้องคอมไพล์ ส่วนเจ้า build script นั้นก็คือโปรแกรมประเภท script ที่เราเขียนขึ้นเพื่อ build โปรแกรมโดยเฉพาะ

ด้วยความที่มันเป็นโปรแกรม (ไม่ใช่แค่การบอก input ให้กับโปรแกรม เหมือนการใช้ build file) เราจึงสามารถที่จะเขียนให้มันทำอะไรก็ได้ตามที่เราต้องการ ซึ่งแน่นอนว่ามันยืดหยุ่นมากกว่าการใช้ build file มาก

ในอดีีต build script นั้นก็ใช้ภาษา script ที่นิยม ๆ กันอย่าง perl, shell script อะไรทำนองนี้นั่นล่ะครับ แต่ปัญหาคือเราต้องเขียนทุกอย่างเองหมดเลยทุกขั้นตอน ซึ่งแน่นอนว่ามันยืดหยุ่น แต่มันก็วุ่นวายด้วย เป็นเรื่องยากที่จะทำให้มันถูกต้อง

สำหรับปัจจุบันมีการพัฒนาภาษา script ที่ใช้สำหรับ build โดยเฉพาะ หรือพัฒนาส่วนของ library ของภาษา script ขึ้นมาเพื่อรองรับการ build ตัวที่ผมใช้แล้วได้ผลดีก็คือ Gradle ส่วนที่ลองค้น ๆ ดูแล้วเจอก็คือ Rake ครับ

Gradle เป็นภาษา Build Script ที่พัฒนาขึ้นจากภาษา Groovy ที่เป็นภาษาที่ทำงานบน Java Virtual Machine (เหมือนกับ XTend ที่ผมพูดถึงบ่อย ๆ ครับ) ซึ่งจริงๆ จะเรียกว่าเป็น Script มันก็ไม่เชิงเพราะว่ามันจะถูกคอมไพล์เป็น Java Class ก่อน แต่ว่าตรงนี้ตัวระบบจะเป็นคนจัดการทั้งหมด แถมคอมไพล์ใหม่ทุกครั้งที่รันโปรแกรม ดังนั้นก็พอถูไถเรียกว่าเป็น Script ได้ล่ะครับ แต่ด้วยความที่มันทำงานบน JVM เราจึงสามารถใช้ Gradle ทำทุกอย่างที่ Java ให้ได้หมดเลย ผมสามารถเขียน build script ให้สร้าง UI เป็น Swing ได้ด้วยนะ (แต่คงไม่ทำ 555)

ผมสร้าง build script ของผลิตภัณฑ์ข้างต้นนี้บนภาษา Gradle (ซึ่งที่จริงก็เป็น Groovy นั่นแหละ) ความสำเร็จของผมก็คือ ผมสามารถย่อคู่มือขนาด 20 หน้าให้เหลือแค่ ... บรรทัดเดียว ดังนี้ครับ

gradle jettyRun -Pclient=xxx

script ของผมก็จะทำการคอมไพล์โปรแกรม เตรียมไฟล์ resource แก้ไฟล์ configuration ต่าง ๆ และโหลดเอาโปรแกรมไปรันบน Jetty ซึ่งเป็น Servlet Container ตัวหนึั่ง (เหมือน Tomcat ขั้นตอนต่อไปที่ผมต้องทำคือ ... เปิด Web Browser เพื่อเข้าโปรแกรม!

ผมสามารถรันโปรแกรมได้ภายในเวลาไม่ถึงสองนาที จากปรกติที่ต้องเสียเวลาเกือบชม. ผมว่านี่คือความสำเร็จของผมนะ! (เนื่องด้วยความที่ผลิตภัณฑ์เป็น closed source ผมจึงแสดงโค๊ดให้ดูไม่ได้ครับ)

build script สมัยใหม่นั้นได้รวมเอาความเรียบง่ายของ build file มารวมเข้ากับความยืดหยุ่นของของภาษา script ซึ่ง build script ที่เรียบง่ายมาก ๆ นี่มองผ่าน ๆ จะเหมือน build file เลยครับ เช่นไฟล์ข้างล่างนี้

apply plugin: 'java'

sourceCompatibility = 1.5
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

ดูไม่เหมือนภาษาเขียนโปรแกรมเลยใช่ไหมครับ ?

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *