เราไม่ควรใช้ “sudo gem”!!

Wasith T. (Bai-Phai)
odds.team
Published in
2 min readAug 11, 2018

รู้หมือไร่ เราสามารถ 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

  1. เมื่อเรามี 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 ได้ครับ

--

--

Wasith T. (Bai-Phai)
odds.team

ตบมือเป็นกำลังใจให้ผมด้วยนะครับ 😘