CocoaPods Trunk คือบริการฝั่งเซิร์ฟเวอร์ของระบบนิเวศ CocoaPods ที่ออกแบบมาเพื่อเผยแพร่ โฮสต์ และจัดการไลบรารี pod Trunk เข้ามาแทนที่กลไกการเผยแพร่แบบเก่าผ่าน GitHub repositories และ forks โดยมอบโครงสร้างพื้นฐานแบบรวมศูนย์พร้อมการยืนยันตัวตน การจัดการเซสชัน การกำหนดเวอร์ชัน และการตรวจสอบก่อนการเผยแพร่ นักพัฒนา iOS และ macOS ใช้ pod trunk push เพื่อส่งไลบรารีไปยังทะเบียนสาธารณะ
ประเด็นสำคัญ
pod trunk register พร้อมการยืนยันทางอีเมลpod trunk push ผ่านการตรวจสอบ การ linting และการอัปโหลดไปยังทะเบียนpod trunk me, pod trunk add-owner, pod trunk deprecate สำหรับการดูแล podCocoaPods Trunk คือโครงสร้างพื้นฐานเซิร์ฟเวอร์ที่เปิดตัวในปี 2015 สำหรับการเผยแพร่ไลบรารี pod แบบรวมศูนย์ ก่อน Trunk แต่ละ pod ถูกแจกจ่ายผ่าน Git repository: นักพัฒนาต้องสร้าง repository สาธารณะ เพิ่มไฟล์ podspec และส่ง Pull Request ไปยัง repository กลาง CocoaPods/Specs วิธีการนี้ต้องมีการตรวจสอบด้วยตนเองและทำให้เกิดความล่าช้าในการเผยแพร่อัปเดต
Trunk แก้ปัญหาเหล่านี้โดยการให้ API แบบรวมสำหรับการเผยแพร่ อัปเดต และจัดการ pod บริการประกอบด้วยสี่องค์ประกอบหลัก:
สถาปัตยกรรมของ Trunk สร้างขึ้นบนสแต็ก Ruby on Rails พร้อมฐานข้อมูล PostgreSQL บริการใช้ HTTP API ในรูปแบบ JSON สำหรับการดำเนินการทั้งหมด และไคลเอ็นต์ CLI pod trunk เป็นส่วนหนึ่งของการแจกจ่าย CocoaPods ซึ่งติดตั้งพร้อมกับ gem หลัก cocoapods
จนถึงปัจจุบัน มี pod มากกว่า 100,000 ตัวที่เผยแพร่ผ่าน Trunk โดยมียอดดาวน์โหลดรวมเกิน 50 พันล้านครั้ง บริการประมวลผลคำขอเผยแพร่และอัปเดตนับพันรายการต่อวันจากนักพัฒนาทั่วโลก
ก่อนเผยแพร่ pod คุณต้องลงทะเบียนกับ Trunk กระบวนการประกอบด้วยขั้นตอนเดียว — คำสั่ง pod trunk register:
pod trunk register your@email.com 'Your Name' --description='MacBook Pro, การพัฒนา iOS'หลังจากรันคำสั่ง ลิงก์ยืนยันจะถูกส่งไปยังอีเมลที่ระบุ การคลิกลิงก์จะเปิดใช้งานบัญชีและสร้างโทเค็นเซสชันที่เก็บไว้ในเชนคีย์ของระบบ (Keychain บน macOS, gnome-keyring หรือเทียบเท่าบน Linux) โทเค็นจะถูกใช้โดยอัตโนมัติในการดำเนินการ pod trunk ทั้งหมดที่ตามมา
พารามิเตอร์ --description เป็นทางเลือกแต่แนะนำ — ช่วยระบุเซสชันเมื่อดูเซสชันที่ใช้งานอยู่ผ่าน pod trunk me หากคุณทำงานจากหลายเครื่อง (เวิร์กสเตชัน, เซิร์ฟเวอร์ CI) คำอธิบายจะช่วยแยกแยะเซสชันหนึ่งจากอีกเซสชันหนึ่ง
ในการตรวจสอบสถานะการยืนยันตัวตน ให้ใช้คำสั่ง:
pod trunk meผลลัพธ์แสดงอีเมล ชื่อ รายการ pod ของคุณ (หากเคยเผยแพร่แล้ว) และเซสชันที่ใช้งานอยู่ ตัวอย่างผลลัพธ์:
- Name: Your Name
- Email: your@email.com
- Since: 2024-03-15 10:30 UTC
- Pods:
- MyLibrary
- AnotherPod
- Sessions:
- 2024-03-15 10:30 UTC - MacBook Pro, การพัฒนา iOSบนเซิร์ฟเวอร์ CI (GitHub Actions, GitLab CI, Jenkins) การยืนยันตัวตนทำผ่านโทเค็นที่ส่งผ่านตัวแปรสภาพแวดล้อม COCOAPODS_TRUNK_TOKEN สามารถรับโทเค็นได้ด้วยคำสั่ง:
pod trunk me --token-onlyโทเค็นนี้ถูกเก็บไว้ในการตั้งค่า CI เป็นตัวแปรลับ และใช้ในขั้นตอนการเผยแพร่โดยไม่ต้องลงทะเบียนซ้ำ ตัวอย่างสำหรับ GitHub Actions:
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}สำคัญ: โทเค็นให้สิทธิ์เข้าถึงเต็มรูปแบบในการจัดการ pod ที่เชื่อมโยงกับบัญชี อย่าเผยแพร่ใน repositories สาธารณะหรือแชร์กับบุคคลที่สาม หากถูกบุกรุก สามารถเพิกถอนโทเค็นได้ผ่าน pod trunk remove-session หรือลบเซสชันทั้งหมดผ่านแผงควบคุมบนเว็บไซต์ CocoaPods
ไฟล์ podspec (.podspec หรือ .podspec.json) คือแมนิเฟสต์ของไลบรารีที่ประกอบด้วยข้อมูลเมตา การพึ่งพา ข้อมูลแพลตฟอร์ม และรายละเอียดซอร์สโค้ด Trunk ใช้ไฟล์นี้สำหรับการตรวจสอบและการลงทะเบียน pod podspec ขั้นต่ำสำหรับการเผยแพร่มีลักษณะดังนี้:
Pod::Spec.new do |s|
s.name = 'MyLibrary'
s.version = '0.1.0'
s.summary = 'คำอธิบายสั้น ๆ ของไลบรารี'
s.description = 'คำอธิบายโดยละเอียดพร้อมคำอธิบายความสามารถ'
s.homepage = 'https://github.com/username/MyLibrary'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Your Name' => 'your@email.com' }
s.source = { :git => 'https://github.com/username/MyLibrary.git', :tag => s.version.to_s }
s.source_files = 'Sources/**/*.{swift,h,m}'
s.platform = :ios, '12.0'
s.swift_version = '5.7'
endฟิลด์สำคัญของ podspec:
MAJOR.MINOR.PATCH Trunk ไม่ยอมรับการเผยแพร่ซ้ำของเวอร์ชันเดียวกัน — ต้องเพิ่มหมายเลขMIT, Apache-2.0, BSD หรือใบอนุญาตโอเพนซอร์สอื่น ๆก่อนเผยแพร่ ตรวจสอบความถูกต้องของ podspec ด้วย linter:
pod lib lint MyLibrary.podspecLinter ตรวจสอบไวยากรณ์ ฟิลด์ที่จำเป็น ความถูกต้องของเส้นทางไฟล์ และความสามารถในการแก้ไขการพึ่งพา หากในกระบวนการ linting ใช้แหล่งข้อมูลส่วนตัว ให้เพิ่มแฟล็ก --sources เพื่อข้ามการดาวน์โหลดเครือข่าย (ตรวจสอบเฉพาะในเครื่อง) ให้ใช้แฟล็ก --local-only
คำสั่งหลักสำหรับการเผยแพร่ pod คือ pod trunk push มันส่งไฟล์ podspec ไปยังเซิร์ฟเวอร์ Trunk ซึ่งผ่านการตรวจสอบอย่างสมบูรณ์และลงทะเบียนในทะเบียนสาธารณะ ไวยากรณ์:
pod trunk push MyLibrary.podspecแฟล็ก --allow-warnings อนุญาตให้เผยแพร่เมื่อมีคำเตือน โดยค่าเริ่มต้น คำเตือนใด ๆ จะบล็อกการเผยแพร่ หากไลบรารีของคุณมีคำเตือนที่ทราบซึ่งไม่ส่งผลต่อการทำงาน คุณสามารถใช้แฟล็กนี้ได้ สำคัญ: ข้อผิดพลาดจะบล็อกการเผยแพร่เสมอ โดยไม่คำนึงถึงแฟล็ก
แฟล็ก --synchronous ทำให้คำขอเป็นแบบซิงโครนัส — เทอร์มินัลรอให้การตรวจสอบฝั่งเซิร์ฟเวอร์เสร็จสมบูรณ์ โดยค่าเริ่มต้น คำสั่งจะคืนการควบคุมทันทีหลังจากส่ง และเซิร์ฟเวอร์ประมวลผลการเผยแพร่แบบอะซิงโครนัส โหมดซิงโครนัสมีประโยชน์ใน CI/CD เมื่อขั้นตอนถัดไปของ pipeline ขึ้นอยู่กับความสำเร็จของการเผยแพร่
แฟล็ก --skip-import-validation ข้ามการตรวจสอบการนำเข้าไลบรารีไปยังโปรเจกต์ทดสอบ ซึ่งช่วยเร่งการเผยแพร่แต่ไม่รับประกันว่าไลบรารีจะคอมไพล์จริง ใช้แฟล็กนี้เฉพาะเมื่อคุณมั่นใจในความถูกต้องของการ build
ตัวอย่างการเผยแพร่ด้วยตัวเลือกทั่วไป:
pod trunk push MyLibrary.podspec \
--allow-warnings \
--synchronous \
--skip-import-validationหลังจากการเผยแพร่สำเร็จ Trunk ส่งคืน JSON พร้อมรายละเอียด:
Congrats
MyLibrary (0.1.0) successfully published
Pod URL: https://cocoapods.org/pods/MyLibraryไลบรารีพร้อมให้ติดตั้งผ่าน Podfile ในโปรเจกต์ iOS หรือ macOS ใด ๆ โดยปกติ ดัชนีการค้นหาของ CocoaPods จะอัปเดตภายในไม่กี่นาที แต่ในกรณีที่พบไม่บ่อย การจัดทำดัชนีอาจใช้เวลาถึงหนึ่งชั่วโมง
ข้อจำกัดสำคัญ: เวอร์ชัน pod ที่เผยแพร่แล้ว ไม่สามารถลบได้ เพื่อป้องกันไม่ให้โปรเจกต์ที่ใช้เวอร์ชันนี้อยู่เสียหาย หากการเผยแพร่มีข้อผิดพลาด คุณสามารถเผยแพร่เวอร์ชันถัดไปพร้อมการแก้ไขได้ แต่ไม่สามารถย้อนกลับได้ ข้อยกเว้นคือ pod trunk delete ซึ่งมีให้เฉพาะเจ้าหน้าที่ CocoaPods และใช้ในกรณีร้ายแรง (การละเมิดใบอนุญาต, โค้ดที่เป็นอันตราย)
CocoaPods Trunk มีคำสั่งหลายคำสั่งสำหรับดูแล pod ที่เผยแพร่แล้ว:
ในการโอนสิทธิ์การเผยแพร่ pod ให้นักพัฒนาคนอื่น ให้ใช้คำสั่ง:
pod trunk add-owner MyLibrary developer@email.comหลังจากการดำเนินการ เจ้าของใหม่จะได้รับสิทธิ์เข้าถึงเต็มรูปแบบในการจัดการ pod: การเผยแพร่เวอร์ชันใหม่ การเพิ่มและลบเจ้าของอื่น การทำเครื่องหมาย pod ว่าล้าสมัย ผู้ใช้ Trunk ที่ลงทะเบียนแล้วทุกคนสามารถเป็นเจ้าของได้ — การลงทะเบียนล่วงหน้าเป็นสิ่งจำเป็น
หากนักพัฒนาออกจากโปรเจกต์หรือไม่ควรมีสิทธิ์เข้าถึง pod อีกต่อไป:
pod trunk remove-owner MyLibrary developer@email.comเฉพาะเจ้าของปัจจุบันเท่านั้นที่สามารถลบเจ้าของได้ ไม่สามารถลบเจ้าของคนสุดท้ายของ pod ได้ — ต้องเพิ่มเจ้าของใหม่ก่อน ซึ่งป้องกันไม่ให้ pod ไร้เจ้าของและถูกทอดทิ้ง
หากไลบรารีไม่ได้รับการดูแลอีกต่อไป คุณสามารถทำเครื่องหมายว่าล้าสมัย (deprecated) ซึ่งไม่ได้ลบ pod ออกจากทะเบียน แต่เพิ่มคำเตือนให้ผู้ใช้ระหว่างการติดตั้ง:
pod trunk deprecate MyLibraryคุณสามารถระบุ pod ทดแทนได้:
pod trunk deprecate MyLibrary --in-favor-of=NewLibraryเมื่อติดตั้ง pod ที่ล้าสมัย CocoaPods จะแสดงคำเตือนในเทอร์มินัลและแนะนำให้เปลี่ยนไปใช้ pod ทดแทนที่ระบุ นี่เป็นวิธีที่ถูกต้องในการยุติการสนับสนุนไลบรารีโดยไม่ทำให้การ build ของโปรเจกต์ที่มีอยู่เสียหาย
ข้อมูล pod สามารถดูได้ผ่านคำสั่ง pod trunk info:
pod trunk info MyLibraryคำสั่งแสดงเวอร์ชัน pod ทั้งหมด วันที่เผยแพร่ รายชื่อเจ้าของ และสถานะ (ใช้งานอยู่/ล้าสมัย) หากต้องการดูรายละเอียดของเวอร์ชันเฉพาะ ให้ใช้ pod spec cat MyLibrary 0.1.0
เมื่อทำงานกับ Trunk นักพัฒนามักพบข้อผิดพลาดทั่วไป มาดูข้อผิดพลาดที่พบบ่อยที่สุด:
อาการ: [!] Authentication failed. You need to register a session first.
สาเหตุ: โทเค็นเซสชันหายไปหรือหมดอายุ โทเค็นมีอายุการใช้งานจำกัด (ค่าเริ่มต้น 30 วันโดยไม่มีกิจกรรม)
วิธีแก้ไข: รัน pod trunk register your@email.com 'Your Name' อีกครั้ง หากคุณใช้ CI ให้ตรวจสอบตัวแปรสภาพแวดล้อม COCOAPODS_TRUNK_TOKEN ว่าอัปเดตหรือไม่ และสร้างโทเค็นใหม่หากจำเป็น
อาการ: [!] You have already pushed version 0.1.0 for MyLibrary.
สาเหตุ: พยายามเผยแพร่เวอร์ชันที่มีอยู่ซ้ำ Trunk ไม่อนุญาตให้เขียนทับเวอร์ชัน
วิธีแก้ไข: เพิ่มเวอร์ชันใน podspec ตามการกำหนดเวอร์ชันเชิงความหมาย หากคุณทำผิดใน podspec ให้เผยแพร่เวอร์ชันถัดไปพร้อมการแก้ไข
อาการ: [!] The spec did not pass validation. ERROR | [iOS] file patterns: Source files did not match any file.
สาเหตุ: เส้นทางไปยังไฟล์ต้นฉบับในฟิลด์ source_files ไม่ถูกต้อง
วิธีแก้ไข: ตรวจสอบเส้นทางใน podspec รัน pod lib lint ในเครื่องจนกว่าข้อผิดพลาดทั้งหมดจะได้รับการแก้ไข จากนั้นเผยแพร่ซ้ำ ใช้รูปแบบ glob: Classes/**/*.{h,m}, Sources/MyLibrary/**/*.swift
อาการ: [!] Connection to trunk.cocoapods.org failed. Timeout.
สาเหตุ: ปัญหาเครือข่ายหรือเซิร์ฟเวอร์ Trunk ไม่พร้อมใช้งานชั่วคราว
วิธีแก้ไข: ตรวจสอบความพร้อมใช้งานของเซิร์ฟเวอร์: curl -I https://trunk.cocoapods.org หากเซิร์ฟเวอร์ตอบสนอง ให้ลองอีกครั้งในอีกไม่กี่นาที IP ของคุณอาจถูกบล็อก — ลองจากการเชื่อมต่ออื่นหรือผ่าน VPN
อาการ: [!] You do not have permission to push to MyLibrary.
สาเหตุ: คุณไม่ใช่เจ้าของ pod ซึ่งเกิดขึ้นหากมีคนลงทะเบียน pod ด้วยชื่อนั้นไว้แล้ว
วิธีแก้ไข: ติดต่อเจ้าของ pod ปัจจุบัน (สามารถดูได้ผ่าน pod trunk info MyLibrary) และขอให้พวกเขาเพิ่มคุณผ่าน pod trunk add-owner หากชื่อ pod ถูกใช้แล้ว ให้พิจารณาชื่ออื่น
คำถามที่พบบ่อย
วิธีการเก่าต้องการ Pull Request ด้วยตนเองไปยัง CocoaPods/Specs repository Trunk ทำให้กระบวนการเป็นอัตโนมัติ: คุณรันคำสั่งเดียว pod trunk push และเซิร์ฟเวอร์จะตรวจสอบ podspec เพิ่มในทะเบียน และอัปเดตดัชนีการค้นหา Trunk ยังเพิ่มการจัดการการเข้าถึง (เจ้าของหลายคน) โทเค็นเซสชัน และการจัดเก็บข้อมูลเมตาแบบรวมศูนย์
เป็นไปไม่ได้ — Trunk ห้ามลบเวอร์ชันที่เผยแพร่แล้วเพื่อรักษาความสมบูรณ์ของการพึ่งพา หากเวอร์ชันมีข้อผิดพลาดร้ายแรง ให้เผยแพร่เวอร์ชันใหม่พร้อมการแก้ไขและทำเครื่องหมายเวอร์ชันที่มีปัญหาเป็นล้าสมัยผ่าน pod trunk deprecate การลบอย่างสมบูรณ์มีให้เฉพาะผู้ดูแล CocoaPods ในกรณีพิเศษเท่านั้น
ไม่ได้ ฟิลด์ s.author ต้องมีอีเมล Trunk ใช้เพื่อเชื่อมโยง pod กับบัญชีของเจ้าของ ที่อยู่ต้องตรงกับอีเมลที่ใช้ระหว่าง pod trunk register หากอีเมลใน podspec ต่างกัน การเผยแพร่จะถูกปฏิเสธ
โดยปกติ pod จะปรากฏในการค้นหา CocoaPods ภายใน 5–15 นาที ในกรณีที่พบไม่บ่อย การจัดทำดัชนีอาจใช้เวลาถึงหนึ่งชั่วโมง อย่างไรก็ตาม pod พร้อมให้ติดตั้งผ่าน Podfile ทันทีหลังจากได้รับการตอบกลับที่สำเร็จจาก Trunk — คุณเพียงแค่ต้องระบุเวอร์ชันหรือช่วงที่แน่นอนใน Podfile
หากคุณมีเซสชันที่ใช้งานอยู่ (โทเค็นยังไม่หมดอายุ) ให้เปลี่ยนอีเมลของคุณผ่าน pod trunk register new@email.com — การลงทะเบียนใหม่จะเชื่อมโยง pod กับที่อยู่ใหม่ หากเซสชันหมดอายุ ให้ติดต่อฝ่ายสนับสนุน CocoaPods ผ่าน GitHub Issues หลักฐานการเป็นเจ้าของ pod อาจเป็นความสามารถในการสร้าง commit ใน Git repository ของ pod
สรุป
pod trunk register พร้อมการยืนยันทางอีเมลและการจัดเก็บโทเค็นเซสชันอัตโนมัติpod trunk push ผ่านการตรวจสอบฝั่งเซิร์ฟเวอร์; เมื่อเผยแพร่แล้ว เวอร์ชันไม่สามารถลบได้pod trunk add-owner และ pod trunk remove-ownerCOCOAPODS_TRUNK_TOKEN สำหรับการเผยแพร่อัตโนมัติใน pipelinesเราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ