สร้าง Project Template แบบง่ายๆ ด้วย Cookiecutter

July 25th, 2016

Cookiecutter สามารถช่วยทำให้การสร้าง project template เป็นเรื่องง่าย ตัว template engine ที่ใช้คือ Jinja2 หน้าตาของ templating language จะเหมือนที่ใช้ใน Django แต่ Cookiecutter ไม่ได้จำกัดการใช้งานแค่กับ Python project เท่านั้น ยังใช้กับงานกับ project ภาษาอะไรก็ได้

หลักการของ Cookiecutter คือมันจะ copy เอา template folder ที่เราสร้างไว้ออกมาเป็นโปรเจคใหม่ที่เราต้องการ โดยที่มันจะแทนค่าตัวแปรต่างๆ ที่เรากำหนดเอาไว้ หน้าตาของตัวแปรจะอยู่ใน tag {{ }} เช่น {{ cookiecutter.project_name }} ตัวแปรต่างๆ เราสามารถกำหนดค่าเริ่มต้นได้ในไฟล์ cookiecutter.json เราสามารถกำหนดตัวแปรได้ตั้งแต่ชื่อไฟล์ ชื่อโฟลเดอร์รวมถึงเนื้อหาในไฟล์

การใช้งาน Cookiecutter จะต้องมี Python กับ pip ติดตั้งบนเครื่องก่อน

วิธีติดตั้ง

$ pip install cookiecutter

อาจจะยังไม่ค่อยเข้าใจ มาลองดูกันให้เห็นภาพเลยดีกว่า

สร้าง Project Template กัน

เริ่มต้นเราต้องสร้าง folder ขึ้นมาก่อนสำหรับเก็บ template folder ของเรา

$ mkdir HelloCookieCutter1
$ cd HelloCookieCutter1

ชื่อ folder ของเราสามารถสร้างให้เป็น template ได้โดยเราสร้าง folder เป็นชื่อที่มี tag {{ }} พอเราสร้าง project ใหม่ tag นี้ก็จะถูกแทนที่ด้วยตัวแปรที่เรากำหนดในไฟล์ cookiecutter.json ลองสร้าง folder ดูตามตัวอย่างข้างล่างนะครับ

$ mkdir {{cookiecutter.directory_name}}
$ cd {{cookiecutter.directory_name}}

ตอนนี้เราอยู่ใน template folder ที่เราสร้างเมื่อกี้ เรามาลองสร้างไฟล์ขึ้นมาซักไฟล์นึงดู ชื่อไฟล์เราจะให้เปลี่ยนไปตามตัวแปรที่เรากำหนดจาก cookiecutter.json

$ touch {{cookiecutter.file_name}}.py

touch จะสร้างไฟล์เปล่าขึ้นมา ให้เราลองเปิดไฟล์ละ copy code ด้านล่างไปใส่ ซึ่งใน code นี้ก็จะมี templating tag ที่จะถูกแทนที่ด้วย

print("Hello, {{cookiecutter.greeting_recipient}}!")

สุดท้ายสร้างไฟล์ cookiecutter.json เพื่อที่จะกำหนดตัวแปรที่จะแทนค่าต่างๆ ไฟล์นี้ให้สร้างใน folder HelloCookieCutter1

{
    "directory_name": "Hello",
    "file_name": "Howdy",
    "greeting_recipient": "Julie"
}

หน้าตาของ folder จะเป็นแบบนี้

$ HelloCookieCutter1/: tree
.
├── cookiecutter.json
└── {{cookiecutter.directory_name}}
 └── {{cookiecutter.file_name}}.py

ตอนนี้เราอยู่ใน folder HelloCookieCutter1 เราสามารถสร้าง project ใหม่ด้วยคำสั่งนี้

$ cookiecutter .
directory_name [Hello]:
file_name [Howdy]:
greeting_recipient [Julie]:

. (จุด) หมายถึงเราจะสร้าง project ใหม่ใน folder ปัจจุบันที่เราอยู่เลย

Cookiecutter จะแสดงค่าเริ่มต้นที่เราใส่ไว้ใน cookiecutter.json ให้เราดูด้วย ถ้าเราไม่ต้องการเปลี่ยนก็กด enter ข้ามไปได้เลย

หลังจากกด enter รัวๆ เราก็จะได้ folder ชื่อ Hello ข้างในนั้นก็จะมีไฟล์ Howdy.py มาลองรันดูกัน

$ python Howdy.py
Hello, Julie!

เย่! เราได้ project ใหม่จาก template ที่เราสร้างแล้ว

นอกจากการใช้งานแบบ command-line แล้ว Cookiecutter ยังสามารถใช้งานกับ Python ได้ด้วย โดย import cookiecutter เข้ามาและรับส่งตัวแปรที่เราต้องการ ตัวอย่างเช่นเราอาจจะให้ Cookiecutter สร้าง project ขึ้นมาแล้วไปสร้าง Git ต่อและสามารถทำอื่นๆ ได้อีกมากมายรวมไปถึงยิง API สร้าง server ด้วยก็ได้ ด้วยไอเดียแบบนี้เวลาสร้าง project ใหม่เราก็สามารถมี Python script อันเดียวกดปึ๊งได้ Git repository, CI build pipeline, รวมถึง server ต่างๆ ลองไปใช้กันดูนะครับ 🙂

Credit:
https://github.com/audreyr/cookiecutter
https://cookiecutter.readthedocs.io/en/latest/first_steps.html