เราไม่ควรใช้ “sudo gem”!!
รู้หมือไร่ เราสามารถ gem install
ได้โดยไม่ต้องใช้ sudo
ซึ่งเราจะใช้เครื่องมืออย่าง RVM หรือ rbenv แทน
ซึ่ง RVM หรือ rbenv นี้เป็น command line tools ที่ทำให้เราสามารถติดตั้ง Ruby และ gems ได้อย่างง่าย และเราจะสามารถจัดการ และทำงานบนความหลากหลายของ environments ของ Ruby หรือ gems ตามที่ต้องการได้
การ install gems ด้วย sudo
นั้น เรากำลังจะไปเปลี่ยนแปลง gems ที่ใช้กันอยู่ทุก users หรือทุก project ในเครื่อง ซึ่งมันจะไม่ติดขัดอะไรเลย ถ้าเครื่องนั้นใช้อยู่คนเดียว และทำงานแค่โปรเจคเดียว แต่ถ้าไม่ใช่นั่นอาจจะนำปัญหามาให้แทน
ถ้ามีความต้องการที่จะทุบ gems ทิ้ง แล้วเริ่มใหม่การใช้เครื่องมือจะทำได้โดยง่าย และจะทุบทิ้งหรือสร้างใหม่ยังไงก็ได้ และที่สำคัญ เราควรทำด้วย non-root user
ถ้าต้องการที่จะใช้ RVM
หรือ rbenv
แล้วยังใช้ sudo
อาจทำให้เกิดผลลัพธ์แปลก ๆ ได้
และด้วยเครื่องมือเหล่านี้ จะทำให้เราจัดการ enviroment ตาม production ได้ด้วย และเหมือนกันบน production ก็ไม่ควรติดตั้ง gems ด้วยสิทธิ์ root
การใช้ rbenv
เนื่องจากผมไม่คุ้นชินกับการใช้ RVM
เท่าไหร่เลยจะขอพูดแค่ rbenv
แล้วกันนะครับ
สำหรับเครื่องที่เป็น macOS เราแนะนำให้ติดตั้ง rbenv
ได้ผ่าน Homebrew ซึ่ง สำหรับเครื่องอื่น ๆ สามารถดูวิธีการติดตั้งได้ที่ https://github.com/rbenv/rbenv#installation
- เมื่อเรามี brew แล้ว เราจะติดตั้ง
rbenv
ด้วยคำสั่ง$ brew install rbenv
ซึ่งคำสั่งนี้จะติดตั้งruby-build
มาด้วยทำให้สามารถติดตั้ง Ruby หลาย version ในเครื่องนี้ได้
2. ตั้ง rbenv ใน shell ที่ใช้ด้วยคำสั่ง $ rbenv init
ซึ่งมันก็จะแนะนำให้เอาคำสั่ง eval "$(rbenv init -)"
ไปใส่ไว้ใน ~/.bash_profile
หรือ ~/.zshrc
ของคุณ
3. ปิด terminal แล้วเปิดใหม่ ซึ่งน่าจะทำงานได้แล้วแหละ
4. ทดสอบด้วย script rbenv-doctor
$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
ซึ่งจะแสดงผลประมาณนี้
Checking for `rbenv’ in PATH: /usr/local/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install’ support: /usr/local/bin/rbenv-install (ruby-build 20180618)
Counting installed Ruby versions: 1 versions
Checking RubyGems settings: OK
Auditing installed plugins: OK
เท่านี้ก็เป็นอันเรียบร้อย
การติดตั้ง Ruby version ต่าง ๆ
เราสามารถใช้คำสั่ง ruby install
ได้
คำสั่ง $ rbenv install -l
เพื่อดูว่ามี Ruby version ไหนให้ลงบ้าง
คำสั่ง $ rbenv install 2.5.1
เพื่อลง version ที่ต้องการ (ตามตัวอย่างนี้จะเป็น 2.5.1
)
ระบุ Ruby version
หลังจากติดตั้ง Ruby ได้ซัก version แล้ว เราสามารถใช้คำสั่งเพื่อระบุ Ruby version แบบอัตโนมัติได้เช่น
$ rbenv local <version>
ซึ่งคำสั่งนี้จะสร้างไฟล์ .ruby-version
ขึ้นมาใน directory ที่เราทำงานอยู่ และไฟล์นี้จะทับ ruby version ที่ตั้งไว้แบบ global แต่ถ้ามีตัวแปร RBENV_VERSION
อยู่ใน environment ก็จะถูกหยิบขึ้นมาแทน
ทั้งนี้เราสามารถตั้ง version default ให้ทั้งเครื่องแบบไม่สนโลกได้ด้วยคำสั่ง $ rbenv global <version>
ซึ่งมันจะไปสร้างไฟล์ไว้ที่ ~/.rbenv/version
แต่ก็จะถูกทับได้ด้วยไฟล์ .ruby-version
หรือ environment variable RBENV_VERSION
ได้
ติดตั้ง Gems
หลังจากระบุ ruby version แล้วสามารถติดตั้ง gems ได้ด้วยคำสั่ง $ gem install <your_gem>
โดยไม่ต้องมี sudo เท่านี้ก็เรียบร้อย
หากมีหลายโปรเจค และแต่ละโปรเจคต้องการ gems คนละ version
ผมแนะนำให้ใช้ bundler โดยสามารถติดตั้งผ่าน gem ได้ $ gem install bundler
หลักจากติดตั้งเสร็จแล้วให้ไปที่ directory งานของเรา แล้วพิมพ์ว่า $ bundle init
มันจะสร้าง Gemfile
ขึ้นมา (หรือสร้างมือก็ได้)
บรรทัดแรกของ Gemfile
จะต้องมี source "https://rubygems.org"
หรือ ที่อยู่ของ gem repository
หากต้องการเพิ่ม gems ให้ใส่ไปว่า gem "your_gem_name"
เข้าไปใน Gemfile
เช่น
source "https://rubygems.org"gem "fastlane"
gem "cocoapods"gem 'xcpretty'
gem "xcode-install"
พอเราได้ Gemfile
มาแล้ว เราสามารถติดตั้ง gems ได้ด้วยคำสั่ง bundle install ซึ่งคำสั่งนี้จะติดตั้ง gems และสร้าง Gemfile.lock
ขึ้นมา ซึ่งจะระบุ version ของ gems ที่เราลงอย่างละเอียด และถ้าเรา commit Gemfile
และGemfile.lock
เข้าไปใน repository ของงานของเรา แล้วคนเอาไป bundle install
ในเครื่องตัวเองก็จะได้ gems versions เดียวกันทุกคน
Alternative way
ซึ่งจริง ๆ แล้วเราสามารถลง gem ได้โดยไม่ต้องใช้สิทธิ์ root และไม่ต้องการใช้ RVM
หรือrbenv
ได้ (อ้าววว 555) แต่เราก็ไม่สามารถควบคุม version ของ Ruby ได้อยู่ดี
โดยการตั้ง GEM_HOME
และเพิ่ม $GEM_HOME/bin
เข้าไปใน PATH
export GEM_HOME=/Users/<your_name>/.gem
export PATH=$GEM_HOME/bin:$PATH
ซึ่งถ้าใช้เป็นปกติก็สามารถเอาคำสั่งข้างบนไปใส่ไว้ใน ~/.bash_profile
ได้ครับ