เหตุใดฉันจึงใช้ Ruby Versioning Manager เป็น iOS Developer

Dec 10 2022
หากคุณเคยร่วมงานกับฉันสักครั้ง คุณต้องได้ยินฉันแนะนำให้ใช้ Ruby versioning manager เช่น rbenv เท่าที่ฉันเขียนคู่มือความคิดสำหรับคู่มือการเริ่มต้นวิศวกรใหม่ที่บริษัทที่ฉันทำงานด้วยโดยใช้ rbenv เป็นข้อกำหนด

หากคุณเคยทำงานกับฉันในบาง ครั้งคุณต้องได้ยินฉันแนะนำให้ใช้ Ruby versioning manager เช่นrbenv เท่าที่ฉันเขียนคู่มือความคิดสำหรับคู่มือการเริ่มต้นวิศวกรใหม่ที่บริษัทที่ฉันทำงานด้วยโดยใช้rbenvเป็นข้อกำหนด แต่ทำไมต้องกังวลที่จะใช้พวกเขา?

บทความนี้เป็นเหมือนเหตุผลและย่อหน้ามากมายที่มีเรื่องราวเบื้องหลังและเหตุผล ดังนั้น คุณไม่ควรข้ามและอ่านตั้งแต่ต้นจนจบแทนที่จะมองหาส่วน TL;DR

ภาพถ่ายโดย superlens photography จาก Pexels: https://www.pexels.com/photo/elegant-silver-ring-with-red-precious-stone-4595716/

เราใช้ Ruby เพื่ออะไรในฐานะ iOS Developer?

หลายสิ่งหลายอย่าง! ประเภทของ มีเครื่องมือมากมายที่ใช้เป็นเครื่องมือเสริมหรือยูทิลิตี้ที่เขียนด้วย Ruby โดยเฉพาะเครื่องมือที่พัฒนาแล้วในช่วงหลายปีที่ผ่านมา ตัวอย่างเช่น Cocoapods และปลั๊กอิน ในบางจุดก่อนที่ Apple จะตัดสินใจสร้าง SPM เราสามารถพูดได้อย่างปลอดภัยว่าพวกเราเกือบทุกคนใช้ Cocoapods เป็นเครื่องมือหลักในการจัดการการขึ้นต่อกันของบุคคลที่สาม เครื่องมืออื่น ๆ ที่ใช้งานบ่อยมากซึ่งฉันอยากจะพูดถึงคือ Xcodegen และ Fastlane ใช่ทั้งสองเขียนด้วย Ruby เช่นกัน มีเครื่องมือและสคริปต์ยูทิลิตี้มากมายที่เขียนด้วย Ruby ภาษาเป็นส่วนหนึ่งของกิจกรรมพื้นฐานประจำวันของคุณไม่ว่าคุณจะชอบหรือไม่ก็ตาม

เราไม่มี Ruby ในตัวใน MacOS ของเราแล้วหรือ ทำไมเราต้องใช้อีก

ใช่พวกเราทำ. MacOS-es มี Ruby ของตัวเองติดตั้งอยู่ในรูทระบบ และใช่ มันทำงานเหมือนกับ Ruby ปกติและจะทำงานเป็นส่วนใหญ่ คำหลักที่นี่เป็นส่วนใหญ่ โดยปกติแล้ว คนส่วนใหญ่ไม่มีปัญหาเกี่ยวกับเครื่องมือใด ๆ เกี่ยวกับเครื่องมือที่ใช้ Ruby ที่กล่าวถึงก่อนหน้านี้ในการทำงานประจำวัน แต่จนกระทั่งอาการสะอึกเล็กน้อยที่เริ่มขึ้นเมื่อไม่กี่ปีก่อน ยุคใหม่ของ Apple ซิลิคอน

Apple Silicon, arm64 และ Ruby gem ที่ล้าสมัย

เนื่องจากความแตกต่างของประเภทสถาปัตยกรรมที่ใช้โดย Macbook รุ่นใหม่ ซึ่งเป็นสถาปัตยกรรมที่ใช้ Apple Silicon arm64 จึงจำเป็นต้องรองรับอัญมณี Ruby ที่ล้าสมัยจำนวนมาก ผู้คนจำนวนมากที่ยังใหม่ต่อปัญหาประเภทนี้กำลังค้นหา StackOverflow และติดตามวิธีแก้ปัญหาโดยใช้ Rosseta2 หรือเพิ่มพารามิเตอร์-arch x86_64เพื่อดำเนินการกับเทอร์มินัล ซึ่ง… ฉันไม่ชอบ!

ยิ่งโค้ดเบสของคุณใช้เครื่องมือที่ใช้ Ruby gems toolings มากเท่าไหร่ โอกาสที่คุณจะได้รับปัญหานี้ก็จะยิ่งมากขึ้นเท่านั้น

แต่ถ้าฉันบอกคุณว่าอัญมณี Ruby นั้นไม่ได้ล้าสมัยและไม่ได้รับการดูแลเสมอไป อัญมณีที่แตกหักส่วนใหญ่ปล่อยการรองรับล่าสุดสำหรับสถาปัตยกรรม arm64 สามารถรันได้บน Apple Silicon! ไม่จำเป็นต้องใช้ Rosseta อีกต่อไป!

สิ่งเดียวที่โดยปกติแล้วอัญมณีเหล่านั้นต้องการคือการเรียกใช้ในเวอร์ชัน Ruby 3.xx ที่ใหม่กว่าแทนที่จะเป็นเวอร์ชัน 2.6.x ในตัว

แทนที่จะใช้ Rosetta เป็นวิธีแก้ปัญหาแบบแพตช์ ฉันเลือกที่จะรันเครื่องมือของฉันบน 3.x x ตัวอย่างทับทิม

เหตุใดเราจึงไม่อัปเดต Ruby ของ MacOS ของเรา

เรารู้อยู่แล้วว่าอินสแตนซ์ Ruby ในตัววางอยู่บน System root ของเราซึ่งอยู่ที่/usr/bin/rubyซึ่งเป็นผู้ใช้ root หรือที่รู้จักในชื่อ The system superuser

นี่คือเหตุผลที่ทุกครั้งที่คุณพยายามติดตั้ง gem ใหม่ทั่วโลก คุณต้องใช้sudoในคำสั่งของคุณ แนวทางปฏิบัตินี้อาจนำไปสู่ปัญหาด้านความปลอดภัยที่ไม่ต้องการหากคุณไม่ใส่ใจ

ด้วยวิธีนี้ ฉันไม่ต้องใช้sudoทุกครั้งที่ต้องการติดตั้ง Ruby gems เพิ่มเติม

Apple ยังมีเหตุผลที่จะไม่ส่งตัวอย่าง Ruby รุ่นใหม่ไปยัง macOS ที่เราไม่รู้จัก ฉันต้องการรับประกันความเสถียรของ macOS ดังนั้นจึงเป็นการดีกว่าหากเราทำบางอย่างนอกอินสแตนซ์ root ของระบบและทำทุกความต้องการของเรา เช่น อัปเดตและติดตั้ง Ruby gems เพิ่มเติมในตำแหน่งนั้น

เปลี่ยนเวอร์ชัน Ruby ทุกครั้งที่คุณต้องการ (เพิ่มเติม)

ประเด็นก่อนหน้านี้ได้กล่าวไปแล้วว่ามันช่วยให้คุณไม่ต้องปวดหัวเกี่ยวกับการจัดการกับอัญมณีที่ใช้งานไม่ได้เพื่อใช้กับเครื่อง Apple Silicon โดยไม่มีการจำลอง Rosetta สำหรับคนส่วนใหญ่ การโน้มน้าวให้พวกเขาใช้ Ruby versioning manager ก็เพียงพอแล้ว แต่ในกรณีของฉัน เนื่องจากฉันดูแลเวิร์กโฟลว์ iOS CI/CD และ 'ช่วยเหลือ' วิศวกรคนอื่นๆ เพื่อจัดการกับสิ่งเหล่านี้ (การแก้ไขปัญหาเครื่องมือ) ฉันมักจะต้องการความยืดหยุ่นในสภาพแวดล้อม Ruby ของฉัน ตัวอย่างเช่น Xcode CI Server ยังคงใช้เวอร์ชัน 2.6.x (และในกรณีของฉัน มันทำงานได้ดีเนื่องจากยังเป็นเครื่อง Intel) บางครั้งฉันก็ต้องพบว่าตัวเองเปลี่ยนไปใช้เวอร์ชันที่คล้ายกันในเครื่องของฉันเพื่อให้ง่าย ในการตั้งค่าบันเดิล Gemlock.file หรือบางครั้ง ฉันต้องติดตั้ง Ruby ใหม่เพื่อจำลองและทดสอบว่าสมาชิกใหม่ที่มีเครื่อง Clean slate สามารถทำตามคำแนะนำการเริ่มต้นใช้งานของเราได้หรือไม่ การมีตัวจัดการเวอร์ชัน Ruby สามารถช่วยในเรื่องประเภทนี้ได้

ขั้นตอนการใช้งานและติดตั้ง rbenv

ฉันจะใช้ rbenv เป็นตัวจัดการเวอร์ชันทับทิมที่ฉันเลือก คุณสามารถใช้ตัวจัดการการกำหนดเวอร์ชันทับทิมประเภทอื่นเพื่อรับสิทธิประโยชน์ที่กล่าวถึงก่อนหน้านี้

  1. ติดตั้งHomebrewโดยคัดลอกและวางลงในเทอร์มินัลของคุณ
  2. 
    /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    

    brew install rbenv ruby-build
    

    rbenv install 3.1.1
    rbenv global 3.1.1
    

บทสรุป

สมมติว่าคุณมีปัญหาหรือไม่สามารถสร้างอัญมณี/เครื่องมือทับทิมในการพัฒนา iOS ของคุณแบบวันต่อวันได้เนื่องจากเครื่อง Apple ซิลิกอน และถูกบังคับให้ใช้ Rosetta ในเทอร์มินัลของคุณ ในกรณีนั้น คุณสามารถลองทำตามบทความนี้ หลีกเลี่ยง Ruby ในตัวในรูทระบบของ macOS ของคุณ และสนุกกับการอยู่ห่างจาก sudo โดยสิ้นเชิง

ไชโย!