ใช้ RVM จัดการ Environment สำหรับการเขียน Ruby

ในการพัฒนา Ruby แอพพลิเคชั่นแต่ละโปรเจค เราจะใช้ไลบรารี่หรือสภาพแวดล้อมในการพัฒนา (development environment) ที่แตกต่างกัน อีกทั้งเวอร์ชั่นของ Ruby ที่อาจจะแตกต่างกันด้วย วิธีง่ายๆ แบบไม่ต้องคิดไรมากแค่เอาเงินฟาด คือซื้อเครื่องคอมพิวเตอร์ใหม่มาเพื่อพัฒนาแอพพลิเคชั่นนั้นๆ ..​ ล้อเล่นนะครับ อย่าไปทำจริง >_< เรามีตัวช่วยครับที่ทำให้เราสามารถพัฒนาแอพพลิเคชั่นต่างๆ กันบนเครื่องของเราเครื่องเดียวได้ ตัวช่วยนั้นคือ Ruby Version Manger (RVM) ครับ

RVM นั้น มีฟังก์ชั่นหนึ่งที่ทำให้เราสามารถติดตั้งไลบรารี่ใน Ruby (หรือที่เรียกว่า gem) หรือใช้ Ruby ต่างเวอร์ชั่นแยกกันในแต่ละสภาพแวดล้อม หรือ environment ได้ ฟังก์ชั่นนั้นเรียกว่า gemsets บล็อกนี้ขอข้ามขั้นตอนการติดตั้ง RVM ไปดูวิธีการใช้ gemsets กันเลยนะ

คำสั่งที่ใช้ดูว่าเรามี gemset อยู่แล้วหรือเปล่าสำหรับ Ruby เวอร์ชั่นที่ใช้อยู่บนเครื่องคือ

$ rvm gemset list

จะได้ผลลัพธ์ตามนี้

gemsets for ruby-2.2.1 (found in /Users/zkan/.rvm/gems/ruby-2.2.1)
=> (default)
global

แต่ถ้าบนเครื่องมี Ruby มากกว่า 1 เวอร์ชั่นจะใช้คำสั่งนี้

$ rvm gemset list_all

จะเห็นว่าเรามี 2 gemsets ซึ่งถูกติดตั้งมาตั้งแต่ตอนเราติดตั้ง RVM แล้ว คือ

  1. default จะเป็น gemset ที่โดนใช้งาน ถ้าเราไม่ได้กำหนดว่าจะใช้ gemset อะไร
  2. global จะเป็น gemset ที่ทุกๆ gemset มาใช้ gem พูดง่ายๆ ก็คือ ถ้าเรามี gem ไหนที่เราอยากให้ทุกแอพพลิเคชั่นใช้ เราก็มาติดตั้ง gem นั้นๆ ใน global gemset

คำสั่งที่ใช้สร้าง gemset ล่ะ? เราใช้

rvm gemset create <gemset_name>

โดยที่ <gemset_name> เป็นชื่ออะไรก็ได้ที่เราต้องการ ลองสั่งคำสั่งดูจะได้ผลลัพธ์ตามนี้

$ rvm gemset create hello_project
ruby-2.2.1 - #gemset created /Users/zkan/.rvm/gems/ruby-2.2.1@hello_project
ruby-2.2.1 - #generating hello_project wrappers........

เสร็จแล้วลองดูว่าเราสร้างขึ้นมาจริงหรือเปล่า

$ rvm gemset list

gemsets for ruby-2.2.1 (found in /Users/zkan/.rvm/gems/ruby-2.2.1)
=> (default)
global
hello_project

gemset ที่ชื่อว่า hello_project ถูกสร้างขึ้นมาเรียบร้อย ถ้าเราอยากจะไปใช้ gemset นั้นเราจะมีคำสั่งตามฟอร์แมตนี้

rvm use <ruby_version_number>@<gemset_name>

เราต้องกำหนดเวอร์ชั่นของ Ruby ไปด้วยครับ ซึ่งถ้าเราไม่กำหนดเวอร์ชั่นของ Ruby ไปตอนที่เราสร้าง gemset คำสั่งนั้นจะกำหนดเวอร์ชั่นของ Ruby เป็นเวอร์ชั่นปัจจุบันที่ผมใช้งานอยู่ (ในที่นี้คือ 2.2.1) เมื่อผมลองสั่งคำสั่งใช้ gemset ที่สร้างขึ้นมาจะได้ผลลัพธ์ตามนี้

$ rvm use 2.2.1@hello_project
Using /Users/zkan/.rvm/gems/ruby-2.2.1 with gemset hello_project

แล้วลองตรวจสอบดูว่าเราเปลี่ยนไปใช้ gemset อันนั้นหรือยัง

$ rvm gemset list

gemsets for ruby-2.2.1 (found in /Users/zkan/.rvm/gems/ruby-2.2.1)
(default)
global
=> hello_project

โอเค ผมไปใช้ gemset ที่ชื่อ hello_project เรียบร้อยแล้ว

เพื่อป้องกันความสับสนผมแนะนำว่าตอนที่เราสร้าง gemset ขึ้นมาให้เรากำหนดเวอร์ชั่นของ Ruby ที่จะใช้งานไปด้วย แล้วจากที่ใช้คำสั่ง create เราก็มีใช้คำสั่ง use ตามนี้ (สังเกตว่าตามหลัง rvm ไม่มีคำว่า gemset นะครับ)

rvm use 2.2.1@hello_project --create

เอาล่ะ มาถึงขั้นตอนนี้ เราสามารถติดตั้ง gem เพิ่มเติมได้ gem ที่ติดตั้งลงไปใหม่จะอยู่แต่ใน gemset ที่เราใช้งานอยู่เท่านั้นครับ เราก็จะสามารถแยก environment ของแต่ละแอพพลิเคชั่น หรือแต่ละโปรเจคได้แล้ว การเขียนโค้ดของเราก็จะราบรื่นขึ้นไม่ต้องมาปวดหัวกับเรื่องเวอร์ชั่นอีกต่อไป!

แล้วถ้าเราอยากจะลบ gemset ทิ้ง? ใช้คำสั่งนี้เลย

rvm gemset delete hello_project

ทีนี้อาจจะมีกรณีที่เราทำงานกันเป็นทีม เราจะสามารถทำอย่างไรให้ทุกคนมี gemset ที่เหมือนกัน? เราสามารถใช้โปรเจคไฟล์บอกเวอร์ชั่นของ Ruby และ gemset ที่ใช้ได้ ใช้คำสั่งตามนี้ครับ (ก่อนสั่งคำสั่งข้างล่างนี้ให้สร้างโฟลเดอร์เปล่าๆ ขึ้นมาโฟลเดอร์หนึ่ง แล้วเข้าไปอยู่ในโฟลเดอร์นั้นก่อนนะครับ ในที่นี้ผมจะเข้าไปอยู่ในโฟลเดอร์ที่ชื่อ hello ก่อน สั่งคำสั่งข้างล่างนี้)

rvm use 2.2.1@hello_project --ruby-version

ถ้าใครเผลอลบ gemset ไปก่อนหน้านี้ ให้ใส่ --create ต่อท้ายคำสั่งด้านบนไปด้วยครับ OK หลังจากที่รันคำสั่งด้านบนแล้ว เราจะมาลองดูว่ามีไฟล์อะไรบ้างในโฟลเดอร์ hello ให้สั่ง ls -al

$ hello ls -al
total 16
drwxr-xr-x 4 zkan staff 136 Oct 11 17:13 .
drwxr-xr-x+ 42 zkan staff 1428 Oct 11 17:13 ..
-rw-r--r-- 1 zkan staff 14 Oct 11 17:13 .ruby-gemset
-rw-r--r-- 1 zkan staff 11 Oct 11 17:13 .ruby-version

มีไฟล์ hidden มา 2 ไฟล์

  • ไฟล์ .ruby-gemset เป็นไฟล์ที่เปิดออกมาจะเห็นคำว่า hello_project
  • ไฟล์ .ruby-version เป็นไฟล์ที่เปิดออกมาจะเห็นคำว่า ruby-2.2.1

ซึ่ง 2 ไฟล์นี้แหละ ทำให้เวลาที่เราเข้ามายังโฟลเดอร์นี้ environment ของเราจะเปลี่ยนมาใช้ gemset นี้โดยอัตโนมัติเลยทีเดียว อีกทั้งถ้าเครื่องไหนยังไม่ได้สร้าง gemset นี้ไว้ ไฟล์สองไฟล์นี้จะทำให้เครื่องนั้นสร้าง gemset ขึ้นมาโดยอัตโนมัติด้วย งานที่เราต้องทำก็แค่เอา 2 ไฟล์นี้ใส่ไว้ใน version control sysytem อย่าง Github เป็นต้น แล้วถ้าอยากให้แต่ละเครื่องจะสามารถลง gem ให้เหมือนๆ กัน ต้องทำอย่างไรบ้าง? ใช้ Bundler โลด! ลองเข้าไปอ่านกันดูนะ

ปล. สำหรับภาษาอื่นอย่าง Python ก็สามารถแยก environment ได้เช่นกัน 🙂

ทำไมเราต้องสนใจเรื่องเวอร์ชั่นด้วย? เวอร์ชั่นใหม่ออกมาก็อัพเกรดเลยได้ไหม?

ได้ครับ แต่ไม่แนะนำ ผมมองว่าการที่เราสนใจเลขเวอร์ชั่นของเฟรมเวิร์คและไลบรารี่ที่เราใช้งานถือว่าเป็น best practice อย่างหนึ่งที่ชาวโปรแกรมเมอร์ทุกคนควรจะให้ความสนใจ อย่างน้อยที่สุดคือเป็นประโยชน์ต่อตัวเอง เพราะจะได้รู้ถึงความเปลี่ยนแปลงของเฟรมเวิร์คหรือไลบรารี่นั้นๆ ดูว่ามีการเปลี่ยนแปลงส่วนไหนที่จะกระทบต่อโค้ดของเราบ้าง และอีกหลายอย่าง บางทีการอัพเกรดเวอร์ชั่นของเฟรมเวิร์คอาจจะทำให้แอพพลิเคชั่นของเราถึงขั้นพังไปเลยก็มี เนื่องจากมีอะไรอีกหลายๆ อย่างที่เราต้องคำนึงถึง เช่นการทำ data migration จากเวอร์ชั่นเก่าไปเวอร์ชั่นใหม่เป็นต้น


Leave a comment!

You must be logged in to post a comment.