Carthage: คืออะไร ตัวจัดการการพึ่งพาแบบกระจายศูนย์

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-12 เวลาอ่าน: 8 นาที

Carthage เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์สำหรับโปรเจกต์ Cocoa (iOS, macOS, watchOS, tvOS) ที่สร้างเฟรมเวิร์กไบนารีจากซอร์สโค้ด ต่างจาก CocoaPods ตรงที่ Carthage จะไม่ปรับเปลี่ยนโปรเจกต์โดยอัตโนมัติ — นักพัฒนาจะเพิ่มเฟรมเวิร์กที่สร้างแล้วลงใน Xcode ด้วยตนเอง Carthage เขียนด้วย Swift ใช้ Cartfile เพื่ออธิบายการพึ่งพาและรองรับการสร้างแบบขนาน ตามพื้นที่เก็บ GitHub Carthage รวบรวมดาวได้มากกว่า 15,000 ดวงและยังคงเป็นเครื่องมือเฉพาะกลุ่มแต่เป็นที่ต้องการสำหรับโปรเจกต์ที่ต้องการการแทรกแซงในการกำหนดค่า Xcode น้อยที่สุด

ประเด็นสำคัญ

  • Carthage เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์: ไม่มีทะเบียนกลาง ไลบรารีเชื่อมต่อโดยตรงจากพื้นที่เก็บ Git
  • Cartfile เป็นไฟล์กำหนดค่าที่แสดงรายการการพึ่งพา เวอร์ชันและแหล่งที่มา (Git, GitHub, GitLab)
  • การสร้างเฟรมเวิร์ก ทำด้วย carthage bootstrap หรือ carthage update — Carthage โคลนพื้นที่เก็บและคอมไพล์เป็น .xcframework
  • การรวมเข้ากับ Xcode เป็นแบบ manual: นักพัฒนาเพิ่มเฟรมเวิร์กที่สร้างแล้วใน General → Frameworks, Libraries, and Embedded Content
  • Cartfile.resolved ล็อกเวอร์ชันที่แน่นอนของการพึ่งพา ทำให้มั่นใจในการสร้างซ้ำได้คล้ายกับ Podfile.lock
  • Carthage vs CocoaPods vs SPM: Carthage ให้การควบคุมสูงสุดแต่ต้องทำงานด้วยตนเองมากกว่า; CocoaPods ทำให้ทุกอย่างเป็นอัตโนมัติ; SPM อยู่ใน Xcode ในตัว

Carthage คืออะไร?

Carthage เป็นตัวจัดการการพึ่งพาที่มีสถาปัตยกรรมแบบกระจายศูนย์ สร้างขึ้นในปี 2014 โดยนักพัฒนาจากชุมชน Swift Carthage ไม่ใช้ทะเบียนข้อกำหนดกลาง — แต่ละไลบรารีเชื่อมต่อโดยตรงจากพื้นที่เก็บ Git ผ่าน URL หรือชื่อบน GitHub Carthage ดาวน์โหลดซอร์สโค้ด สร้างเป็นเฟรมเวิร์กไบนารี (.xcframework หรือ .framework) และมอบสิ่งประดิษฐ์ที่พร้อมสำหรับการรวมด้วยตนเองในโปรเจกต์ Xcode ให้กับนักพัฒนา

สถาปัตยกรรมของ Carthage ประกอบด้วยสามองค์ประกอบ: เครื่องมือ CLI carthage, ไฟล์กำหนดค่า Cartfile และไดเรกทอรี Carthage/Build/ พร้อมเฟรมเวิร์กที่สร้างแล้ว ความแตกต่างหลักระหว่าง Carthage และ CocoaPods คือการไม่มีการปรับเปลี่ยน .xcodeproj โดยอัตโนมัติ Carthage ไม่สร้าง .xcworkspace ไม่กำหนดค่าแฟลกคอมไพเลอร์ และไม่สร้าง Pods.xcconfig นักพัฒนาเพิ่มเฟรมเวิร์กลงในโปรเจกต์ด้วยตนเองผ่าน Xcode ซึ่งให้การควบคุมกระบวนการรวมอย่างสมบูรณ์

Carthage ใช้การสร้างการพึ่งพาแบบขนาน ซึ่งช่วยเร่งกระบวนการบนโปรเซสเซอร์แบบหลายคอร์อย่างมาก แต่ละการพึ่งพาถูกสร้างเป็นเป้าหมายแยกต่างหาก และ Carthage แก้ปัญหากราฟของการพึ่งพาแบบทรานซิทีฟโดยอัตโนมัติ โดยสร้างตามลำดับที่ถูกต้อง ตามเกณฑ์มาตรฐานของชุมชน Carthage สร้างการพึ่งพา 15–20 รายการโดยเฉลี่ยใน 30–60 วินาทีบน Mac สมัยใหม่ ซึ่งเร็วกว่า CocoaPods สำหรับโปรเจกต์ที่มีไลบรารีจำนวนมาก Carthage รองรับทุกแพลตฟอร์ม Apple: iOS, macOS, watchOS และ tvOS และตั้งแต่เวอร์ชัน 0.38+ — สร้าง .xcframework สากลสำหรับรองรับซิมูเลเตอร์และอุปกรณ์ Apple Silicon

Carthage ทำงานอย่างไร

Carthage โคลนพื้นที่เก็บ Git ของแต่ละการพึ่งพา สลับไปยังเวอร์ชันที่ระบุ (แท็ก คอมมิตหรือสาขา) และเรียกใช้ xcodebuild เพื่อสร้างเฟรมเวิร์ก Carthage กำหนดประเภทโปรเจกต์ Xcode (เฟรมเวิร์ก ไดนามิกเฟรมเวิร์ก ไลบรารีแบบสแตติก) โดยอัตโนมัติตามสคีมาการสร้าง หากโปรเจกต์มีหลายสคีมา Carthage ใช้สคีมาเริ่มต้น (แรกตามลำดับตัวอักษร) หลังการสร้าง Carthage คัดลอกเฟรมเวิร์กที่เสร็จแล้วไปยัง Carthage/Build/ และสร้างไฟล์ Cartfile.resolved พร้อมล็อกเวอร์ชันที่แน่นอน Carthage รองรับการแคชเฟรมเวิร์กที่สร้างแล้ว — การสร้างใหม่โดยไม่มีการเปลี่ยนแปลงการพึ่งพาจะถูกข้าม

การพึ่งพาแบบทรานซิทีฟใน Carthage จัดการผ่าน Cartfile.resolved: Carthage สร้างกราฟของการพึ่งพาที่จำเป็นทั้งหมดและสร้างตามลำดับที่ถูกต้อง หากไลบรารีสองตัวขึ้นอยู่กับไลบรารีของบริษัทอื่นเดียวกัน Carthage สร้างมันครั้งเดียวและใช้สำหรับทั้งคู่ Carthage รายงานข้อผิดพลาดในการสร้างโดยระบุเป้าหมายและสาเหตุเฉพาะ — ซึ่งช่วยให้การวินิจฉัยปัญหาง่ายขึ้น

Cartfile: โครงสร้าง ไวยากรณ์และตัวอย่าง

Cartfile เป็นไฟล์กำหนดค่าที่มีไวยากรณ์คล้าย Ruby (รูปแบบ Cartfile) ซึ่งกำหนดการพึ่งพาของโปรเจกต์ Carthage Cartfile อยู่ในรูทของโปรเจกต์ถัดจาก .xcodeproj แต่ละบรรทัดของ Cartfile อธิบายการพึ่งพาหนึ่งรายการ: แหล่งที่มา (URL Git, พื้นที่เก็บ GitHub) และเวอร์ชัน ไวยากรณ์รองรับการล็อกเวอร์ชันผ่านแท็ก คอมมิตและสาขา

ruby
# ดีเพนเดนซีพื้นฐาน Carthage
github "Alamofire/Alamofire" ~> 5.9
github "SnapKit/SnapKit" ~> 5.7
github "onevcat/Kingfisher" == 8.0.0

คำสั่ง github "Owner/Repo" เป็นรูปแบบย่อสำหรับพื้นที่เก็บ GitHub Carthage สร้าง URL https://github.com/Owner/Repo.git โดยอัตโนมัติ สำหรับ GitLab, Bitbucket และโฮสต์ Git อื่นๆ จะใช้ URL เต็ม: git "https://gitlab.com/owner/repo.git" ตัวดำเนินการเวอร์ชัน: ~> 5.9 (เวอร์ชันใดก็ได้ตั้งแต่ 5.9 ถึง 6.0 ไม่รวม 6.0), == 8.0.0 (เวอร์ชันที่แน่นอน), >= 1.0 (เวอร์ชันต่ำสุด) สามารถล็อกคอมมิตเฉพาะผ่าน github "owner/repo" "abc1234"

ตัวอย่าง Cartfile ที่สมบูรณ์

Carthage รองรับหลายไดเรกทอรีสำหรับการกำหนดค่าต่างๆ: Cartfile (หลัก), Cartfile.private (สำหรับการพึ่งพาภายในที่ไม่เผยแพร่) และ Cartfile.resolved (สร้างโดยอัตโนมัติ) การพึ่งพาส่วนตัวมีประโยชน์สำหรับไลบรารีที่ใช้เฉพาะในการสร้างสำหรับการพัฒนา เช่น เฟรมเวิร์กทดสอบ

ruby
# Cartfile — ดีเพนเดนซีหลัก
github "Alamofire/Alamofire" ~> 5.9
github "SwiftyJSON/SwiftyJSON" ~> 4.0
github "realm/realm-swift" ~> 10.0

# แบบเต็ม URL สำหรับ GitLab
git "https://gitlab.com/company/internal-lib.git" == 2.1.1

# สาขาการพัฒนา
github "marmelroy/PhoneNumberKit" "development"

github และ git เป็นแหล่งที่มาสองประเภทใน Cartfile ชนิดแรกเฉพาะสำหรับ GitHub และสร้าง URL โดยอัตโนมัติ ชนิดที่สองสำหรับพื้นที่เก็บ Git สาธารณะหรือส่วนตัวใดๆ ที่มี URL เต็ม เวอร์ชันสามารถระบุเป็นแท็ก (== 2.1.1), ช่วงเชิงความหมาย (~> 5.9), ชื่อสาขา ("development") หรือแฮชคอมมิต ("a1b2c3d") ช่วงเชิงความหมาย (~>) แนะนำสำหรับการพึ่งพาที่ปฏิบัติตาม SemVer — ซึ่งป้องกันการเปลี่ยนแปลงที่ทำลายความเข้ากันได้ระหว่างการอัปเดต

Cartfile.resolved ถูกสร้างโดยอัตโนมัติหลัง carthage update มันล็อกเวอร์ชันที่แน่นอนของการพึ่งพาที่ติดตั้งทั้งหมด รวมถึงแบบทรานซิทีฟ ไฟล์นี้ควรเก็บใน Git — หากไม่มีมัน คำสั่ง carthage bootstrap บนเครื่องอื่นจะสร้างไลบรารีตามกฎเดียวกัน แต่เวอร์ชันอาจแตกต่าง carthage outdated แสดงรายการการพึ่งพาที่ล้าสมัยซึ่งมีเวอร์ชันใหม่ให้ใช้

การติดตั้งและกำหนดค่า Carthage

Carthage ติดตั้งผ่าน Homebrew — ตัวจัดการแพ็กเกจมาตรฐานสำหรับ macOS วิธีการอื่น: การติดตั้งจากตัวติดตั้ง .pkg ที่สร้างจาก GitHub หรือสร้างจากซอร์สโค้ด Carthage ต้องการ Xcode with Command Line Tools (รวมถึง xcodebuild) และบน Apple Silicon Mac — Rosetta 2 สำหรับการพึ่งพาแบบเดิมบางส่วน

bash
# การติดตั้ง Carthage ผ่าน Homebrew
brew install carthage

# ตรวจสอบเวอร์ชัน
carthage version

# การติดตั้งจาก .pkg (หาก Homebrew ไม่พร้อมใช้งาน)
# ดาวน์โหลด Carthage.pkg จาก GitHub Releases และติดตั้งด้วยตนเอง

หลังจากติดตั้ง Carthage การเริ่มต้นโปรเจกต์เริ่มต้นด้วยการสร้าง Cartfile ในรูทของโปรเจกต์ Carthage ไม่มีคำสั่ง init — ไฟล์ถูกสร้างด้วยตนเองในโปรแกรมแก้ไขข้อความ หลังจากเติมการพึ่งพาลงใน Cartfile แล้ว นักพัฒนาจะเรียกใช้ carthage bootstrap (ถ้ามี Cartfile.resolved อยู่แล้ว) หรือ carthage update (การติดตั้งครั้งแรกหรืออัปเดต) Carthage โคลนพื้นที่เก็บ สร้างเฟรมเวิร์กและวางไว้ใน Carthage/Build/

การอัปเดต Carthage ทำผ่าน brew upgrade carthage เวอร์ชันตรวจสอบด้วย carthage version เวอร์ชันเสถียรล่าสุด ณ กลางปี 2025 คือ 0.40 พร้อมรองรับ .xcframework เริ่มต้น การสร้างแบบขนานที่ปรับปรุงแล้วและการรองรับ Swift 6 อย่างเต็มที่ ตั้งแต่เวอร์ชัน 0.39 Carthage หยุดสร้าง .framework แบบเดิมโดยไม่มีชิมความเข้ากันได้ — แนะนำให้ระบุ --use-xcframeworks อย่างชัดเจน

bash
# การอัปเดต Carthage ผ่าน Homebrew
brew upgrade carthage

# ติดตั้งเวอร์ชันเฉพาะ
brew install carthage@0.39

# ติดตั้งใหม่ทั้งหมด
brew uninstall carthage && brew install carthage

หมายเหตุ: Carthage ไม่สร้าง .xcworkspace และไม่ปรับเปลี่ยน .xcodeproj ต่างจาก CocoaPods ตรงที่ Carthage ปล่อยให้การควบคุมการกำหนดค่า Xcode อย่างสมบูรณ์แก่นักพัฒนา ซึ่งหมายความว่าหลังจากติดตั้งการพึ่งพาแล้ว คุณต้องเพิ่มเฟรมเวิร์กลงใน Xcode ด้วยตนเอง (ดูส่วน «การรวมเฟรมเวิร์ก Carthage เข้ากับ Xcode») Carthage ยังต้องการให้การพึ่งพาแต่ละรายการมีโปรเจกต์ Xcode หรือ workspace ที่มีเป้าหมายเฟรมเวิร์ก — มิฉะนั้นการสร้างจะล้มเหลว

การสร้างเฟรมเวิร์ก: bootstrap และ update

Carthage มีคำสั่งหลักสามคำสั่งสำหรับทำงานกับการพึ่งพา: bootstrap, update และ build carthage bootstrap สร้างการพึ่งพาจาก Cartfile.resolved ที่มีอยู่ — แนะนำสำหรับสภาพแวดล้อม CI และนักพัฒนาที่เข้าร่วมโปรเจกต์ carthage update อัปเดต Cartfile.resolved เป็นเวอร์ชันล่าสุด (โดยเคารพข้อจำกัดของ Cartfile) และดำเนินการสร้าง carthage build สร้างการพึ่งพาที่ระบุทั้งหมดโดยไม่บันทึกเวอร์ชัน

bash
# การติดตั้งครั้งแรก (อัปเดตเวอร์ชัน)
carthage update --use-xcframeworks --platform iOS

# สร้างใหม่ด้วยเวอร์ชันที่ล็อกไว้
carthage bootstrap --use-xcframeworks --platform iOS

# สร้างการพึ่งพาเพียงรายการเดียว
carthage build Alamofire --platform iOS

แฟลก --use-xcframeworks สั่งให้ Carthage สร้าง .xcframework สากลแทน .framework แบบเดิม ซึ่งรับประกันการรองรับทั้งซิมูเลเตอร์และอุปกรณ์จริง รวมถึง Apple Silicon Mac โดยไม่ต้องใช้สคริปต์เพิ่มเติม แฟลก --platform iOS จำกัดการสร้างบนแพลตฟอร์ม iOS เดียว — ซึ่งช่วยเร่งกระบวนการอย่างมาก โดยเฉพาะถ้าโปรเจกต์มีไลบรารีข้ามแพลตฟอร์ม

Carthage รองรับการสร้างแบบขนานผ่านแฟลก --cache-builds ซึ่งแคชเฟรมเวิร์กที่สร้างแล้ว ในการสร้างใหม่ Carthage ตรวจสอบแฮชคอมมิต Git และหากโค้ดไม่เปลี่ยน จะข้ามการคอมไพล์ สำหรับเซิร์ฟเวอร์ CI แนะนำให้แคชไดเรกทอรี Carthage/Build/ และ ~/Library/Caches/carthage/ Carthage ยังรองรับ --verbose สำหรับการบันทึกโดยละเอียดและ --no-use-binaries สำหรับการบังคับสร้างจากซอร์สโค้ด (ถ้านักพัฒนาไม่เชื่อถือไบนารีที่สร้างไว้ล่วงหน้า)

คำสั่งการกระทำ
carthage updateอัปเดต Cartfile.resolved และสร้างเฟรมเวิร์กทั้งหมด
carthage bootstrapสร้างเฟรมเวิร์กจาก Cartfile.resolved ที่มีอยู่โดยไม่อัปเดต
carthage buildสร้างการพึ่งพาที่ระบุโดยไม่ล็อกเวอร์ชัน
carthage outdatedแสดงรายการการพึ่งพาที่มีการอัปเดตพร้อมใช้งาน
carthage checkoutโคลนเฉพาะพื้นที่เก็บโดยไม่สร้าง

การรวมเฟรมเวิร์ก Carthage เข้ากับ Xcode

การรวม เฟรมเวิร์ก Carthage เข้ากับ Xcode ทำด้วยตนเองในสี่ขั้นตอน หลังจากเรียกใช้ carthage update หรือ bootstrap เฟรมเวิร์กที่สร้างแล้วทั้งหมดอยู่ใน Carthage/Build/iOS/ (หรือแพลตฟอร์มที่เกี่ยวข้อง) นักพัฒนาเปิดโปรเจกต์ Xcode เลือกเป้าหมายแอปและเพิ่มเฟรมเวิร์กใน General → Frameworks, Libraries, and Embedded Content สำหรับเฟรมเวิร์กขณะทำงาน (ไลบรารีไดนามิก) ต้องเลือก «Embed & Sign» — มิฉะนั้นแอปจะหยุดทำงานเมื่อเปิดด้วยข้อผิดพลาด «dyld: Library not loaded»

Carthage สำหรับไลบรารีแบบสแตติกง่ายกว่า — ไม่ต้องการเฟสฝังตัวเพราะเชื่อมโยงโดยตรงกับไฟล์ปฏิบัติการของแอป อย่างไรก็ตาม Carthage สร้างเฟรมเวิร์กไดนามิกเป็นค่าเริ่มต้น (ยกเว้นไลบรารีสแตติกที่กำหนดค่าอย่างชัดเจน) สำหรับโปรเจกต์ที่การลดขนาดแอปเป็นสิ่งสำคัญ แนะนำให้ใช้การเชื่อมโยงแบบสแตติกผ่านการตั้งค่า Xcode

ขั้นตอนเพิ่มเติมคือการเพิ่ม Input Files ใน Build Phase → Run Script Carthage ต้องการสคริปต์เพื่อลบสิ่งประดิษฐ์ซิมูเลเตอร์ออกจากเฟรมเวิร์กที่สร้างแล้ว (strip simulator architectures) สคริปต์นี้จำเป็นสำหรับการสร้าง App Store:

bash
# Run Script สำหรับ App Store (strip simulator architectures)
FRAMEWORKS_DIR="${SRCROOT}/Carthage/Build/iOS"
for framework in "$FRAMEWORKS_DIR"/*.framework; do
  bash "$BUILD_DIR/src/scripts/strip-framework.sh" "$framework"
done

Carthage ไม่ต้องการใช้ .xcworkspace — การพึ่งพาทั้งหมดถูกสร้างเป็นเฟรมเวิร์กไบนารีแล้ว Carthage ทำงานโดยตรงกับ .xcodeproj ต่างจาก CocoaPods ที่สร้าง workspace ซึ่งช่วยให้การควบคุมเวอร์ชันและการตั้งค่า CI ง่ายขึ้น เนื่องจากการพึ่งพาของ Carthage ไม่เปลี่ยนการกำหนดค่าโปรเจกต์ Xcode การเปลี่ยนแปลงเดียวคือการเพิ่มเฟรมเวิร์กลงในเป้าหมาย ซึ่งบันทึกใน .pbxproj

ขั้นตอนการกระทำ
1เรียกใช้ carthage update --use-xcframeworks
2ลากเฟรมเวิร์กจาก Carthage/Build/ ไปยัง General → Frameworks
3ตั้งค่า Embed & Sign สำหรับเฟรมเวิร์กไดนามิก
4เพิ่ม Run Script Phase เพื่อลบสถาปัตยกรรมซิมูเลเตอร์
5สร้างโปรเจกต์ — เฟรมเวิร์กควรเชื่อมโยงโดยอัตโนมัติ

Carthage vs CocoaPods vs Swift Package Manager

Carthage, CocoaPods และ Swift Package Manager (SPM) เป็นตัวจัดการการพึ่งพาหลักสามตัวในการพัฒนา iOS Carthage โดดเด่นด้วยแนวทางแบบกระจายศูนย์ CocoaPods นำเสนอทะเบียนแบบรวมศูนย์ และ SPM เป็นโซลูชันในตัวของ Apple การเลือกระหว่างพวกเขาขึ้นอยู่กับข้อกำหนดของโปรเจกต์ ขนาดทีมและระดับอัตโนมัติที่ต้องการ

เกณฑ์CarthageCocoaPodsSPM
สถาปัตยกรรมกระจายศูนย์ทะเบียนรวมศูนย์รวมใน Xcode
ภาษากำหนดค่าCartfile (คล้าย Ruby)Podfile (Ruby DSL)Package.swift (Swift)
การรวม Xcodeด้วยตนเอง (ลากและวาง)ผ่าน workspaceในตัว
การพึ่งพาทรานซิทีฟอัตโนมัติอัตโนมัติอัตโนมัติ
ทะเบียนไลบรารีไม่มี (พื้นที่เก็บ Git)100,000+ ใน Specs~65,000
การรองรับทรัพยากรไม่ใช่ (ชุดทรัพยากร)ใช่ (Resources)
ความเร็วในการสร้างเร็ว (ขนาน)ปานกลางเร็ว
การควบคุมการรวมสมบูรณ์อัตโนมัติอัตโนมัติ

Carthage ถูกเลือกสำหรับโปรเจกต์ที่ต้องการการแทรกแซงในการกำหนดค่า Xcode น้อยที่สุดและการควบคุมกระบวนการรวมอย่างสมบูรณ์ Carthage เหมาะสำหรับไลบรารีและเฟรมเวิร์กโอเพนซอร์สที่ผู้เขียนต้องการให้ผู้ใช้สร้างการพึ่งพาได้อย่างอิสระ Carthage ยังเป็นที่นิยมในหมู่นักพัฒนาที่ให้ความสำคัญกับปรัชญา UNIX: แต่ละเครื่องมือทำสิ่งหนึ่งได้ดี CocoaPods ยังคงเป็นมาตรฐานสำหรับโปรเจกต์องค์กรที่มีการพึ่งพาหลายสิบรายการซึ่งระบบอัตโนมัติมีความสำคัญ SPM เป็นตัวเลือกสำหรับโปรเจกต์ใหม่เพราะมันถูกรวมใน Xcode และพัฒนาโดย Apple อย่างต่อเนื่อง

การย้าย ระหว่างตัวจัดการต้องใช้แนวทางที่แตกต่าง Carthage → SPM: ลบเฟรมเวิร์กออกจาก Xcode ลบ Cartfile และเพิ่ม Package Dependencies ผ่าน File → Add Package Dependencies Carthage → CocoaPods: ลบเฟรมเวิร์ก Carthage สร้าง Podfile เพิ่มการพึ่งพาและเรียกใช้ pod init && pod install เมื่อย้ายจาก Carthage ไป CocoaPods หรือ SPM ความจำเป็นในการอัปเดตเฟรมเวิร์กด้วยตนเองจะหายไป — การพึ่งพาทั้งหมดอัปเดตด้วยคำสั่งเดียว Carthage ยังคงเกี่ยวข้องสำหรับโปรเจกต์ที่การหลีกเลี่ยงการล็อกผู้ขายและการรักษาความโปร่งใสของการสร้างการพึ่งพาเป็นสิ่งสำคัญ

ปัญหาทั่วไปและวิธีแก้ไข

Carthage เป็นเครื่องมือที่เสถียร แต่นักพัฒนาพบปัญหาทั่วไปเป็นระยะ โดยเฉพาะเมื่อสร้างบนเซิร์ฟเวอร์ CI อัปเดต Xcode หรือเปลี่ยนเวอร์ชัน Swift ปัญหาส่วนใหญ่แก้ไขได้ด้วยการล้างแคช กำหนดค่า --use-xcframeworks อย่างถูกต้องและตรวจสอบเวอร์ชัน iOS ขั้นต่ำ

ข้อผิดพลาด «The file manager returned an error» — เกิดขึ้นเมื่อแคช Carthage เสียหายหรือมีข้อขัดแย้งสิทธิ์ไฟล์ วิธีแก้: ลบแคชด้วย rm -rf ~/Library/Caches/carthage และเริ่ม carthage bootstrap ใหม่ การลบไดเรกทอรี Carthage/ ในโปรเจกต์และสร้างใหม่ก็ช่วยได้เช่นกัน บนเซิร์ฟเวอร์ CI ควรอัปเดตแคช Carthage เฉพาะเมื่อ Cartfile.resolved เปลี่ยนแปลง

ข้อผิดพลาด «No such module» — ไม่พบเฟรมเวิร์กใน Xcode แม้ว่าการสร้าง Carthage จะสำเร็จ วิธีแก้: ตรวจสอบเส้นทางเฟรมเวิร์กใน General → Frameworks, Libraries, and Embedded Content เฟรมเวิร์กควรอยู่ใน Carthage/Build/iOS/ ตรวจสอบให้แน่ใจว่าเพิ่ม .xcframework อย่างถูกต้อง (ลากอีกครั้ง) สำหรับเฟรมเวิร์กไดนามิก ตรวจสอบ Embed & Sign หากข้อผิดพลาดยังคงอยู่ ให้เพิ่ม FRAMEWORK_SEARCH_PATHS ใน Build Settings

ข้อผิดพลาดในการสร้างเนื่องจากความไม่เข้ากันของ Swift — ไลบรารีถูกสร้างสำหรับเวอร์ชัน Swift ที่แตกต่างจากโปรเจกต์ วิธีแก้: ใช้ carthage update --no-use-binaries เพื่อบังคับสร้างจากซอร์สโค้ดด้วยเวอร์ชัน Swift เดียวกัน หากไลบรารีไม่คอมไพล์ภายใต้เวอร์ชันปัจจุบัน ให้ใช้ .xcconfig เพื่อระบุเวอร์ชัน Swift หรือ fork ไลบรารี ตั้งแต่ Carthage 0.39 --use-xcframeworks จะรวมเวอร์ชัน Swift ที่ถูกต้องในไบนารีโดยอัตโนมัติ

ปัญหาการสร้าง CI — Carthage บน CI ต้องการการกำหนดค่าแคชที่เหมาะสม วิธีแก้: แคช Carthage/Build/ และ ~/Library/Caches/carthage/ ใช้ carthage bootstrap --use-xcframeworks --platform iOS แทน update บน CI เพื่อไม่ให้เปลี่ยนเวอร์ชัน การดำเนินการ Carthage อย่างเป็นทางการพร้อมใช้งานสำหรับ GitHub Actions สำหรับ Jenkins — ปลั๊กอิน CarthageBuild Carthage อาจล้มเหลวบน macOS ที่ไม่มี GUI — วิธีแก้: ติดตั้ง brew install xcode-build-server หรือเพิ่มแฟลก -UseModernBuildSystem=NO

ปัญหาสาเหตุวิธีแก้
ข้อผิดพลาด file managerแคชเสียหายล้าง ~/Library/Caches/carthage/
No such moduleเฟรมเวิร์กไม่ได้เพิ่มใน Xcodeตรวจสอบ Frameworks ในเป้าหมาย
Swift ไม่เข้ากันเวอร์ชัน Swift ต่างกัน--no-use-binaries หรือ Carthage เวอร์ชันใหม่กว่า
ข้อผิดพลาด CIขาดแคชหรือ GUIกำหนดค่าแคช Carthage/Build/
ไลบรารีไม่สร้างไม่มีโปรเจกต์ Xcode สำหรับไลบรารีตรวจสอบโครงสร้างพื้นที่เก็บ

คำถามที่พบบ่อย

Carthage คืออะไรและแตกต่างจาก CocoaPods อย่างไร?

Carthage เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์สำหรับแพลตฟอร์ม Apple ต่างจาก CocoaPods ตรงที่ Carthage ไม่ใช้ทะเบียนไลบรารีกลาง ไม่ปรับเปลี่ยนโปรเจกต์ Xcode โดยอัตโนมัติและไม่สร้าง .xcworkspace Carthage สร้างการพึ่งพาเป็นเฟรมเวิร์กไบนารีที่นักพัฒนาเพิ่มด้วยตนเองใน Xcode ในทางกลับกัน CocoaPods ทำให้กระบวนการทั้งหมดเป็นอัตโนมัติผ่าน Podfile

วิธีติดตั้ง Carthage บน macOS?

Carthage ติดตั้งผ่าน Homebrew: brew install carthage หรืออีกทางเลือก — ดาวน์โหลด Carthage.pkg จาก GitHub Releases หรือสร้างจากซอร์สโค้ด หลังติดตั้ง ตรวจสอบเวอร์ชัน: carthage version Carthage ต้องการ Xcode with Command Line Tools บน Apple Silicon Mac อาจต้องใช้ Rosetta 2 เพิ่มเติม

Cartfile แตกต่างจาก Cartfile.resolved อย่างไร?

Cartfile เป็นไฟล์กำหนดค่าที่นักพัฒนาเขียน: ประกอบด้วยชื่อไลบรารีและตัวดำเนินการเวอร์ชัน (~> 5.9, == 8.0.0, ชื่อสาขา) Cartfile.resolved ถูกสร้างโดยอัตโนมัติระหว่าง carthage update และล็อกเวอร์ชันที่แน่นอนของการพึ่งพาที่ติดตั้งทั้งหมด Cartfile.resolved ควรเก็บใน Git — มันรับประกันการสร้างซ้ำได้บนทุกเครื่อง

ทำไม Carthage ไม่สร้างไลบรารีจาก Cartfile ของฉัน?

Carthage ต้องการให้ไลบรารีมีโปรเจกต์ Xcode หรือ workspace ที่ถูกต้องพร้อมเป้าหมายเฟรมเวิร์ก ตรวจสอบว่าพื้นที่เก็บเข้าถึงได้ (ไม่เป็นส่วนตัวโดยไม่มีคีย์) ระบุเวอร์ชันที่ถูกต้อง (แท็กหรือคอมมิตมีอยู่) และไลบรารีรองรับเวอร์ชัน Xcode ของคุณ ใช้ carthage build --verbose สำหรับการวินิจฉัยโดยละเอียด หากไลบรารีไม่มีเป้าหมายเฟรมเวิร์ก Carthage ไม่สามารถสร้างได้

ควรใช้ Carthage ในปี 2025–2026 หรือไม่?

Carthage ยังคงเกี่ยวข้องสำหรับโปรเจกต์ที่ต้องการการจัดการการพึ่งพาแบบกระจายศูนย์ การควบคุมการรวมอย่างสมบูรณ์และการแทรกแซงในโปรเจกต์ Xcode น้อยที่สุด อย่างไรก็ตาม โปรเจกต์ใหม่ส่วนใหญ่เลือก Swift Package Manager (SPM) — มันถูกรวมใน Xcode ไม่ต้องการการติดตั้งเพิ่มเติมและพัฒนาโดย Apple อย่างต่อเนื่อง Carthage แนะนำสำหรับโปรเจกต์เดิมที่ไปป์ไลน์การสร้างถูกกำหนดไว้แล้ว หรือสำหรับไลบรารีที่ผู้เขียนต้องการให้ผู้ใช้มีอิสระในการเลือกวิธีการรวม

สรุป

  • Carthage เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์สำหรับ iOS, macOS, watchOS และ tvOS ที่สร้างเฟรมเวิร์กจากแหล่งพื้นที่เก็บ Git
  • Cartfile เป็นไฟล์กำหนดค่าที่มีไวยากรณ์รองรับพื้นที่เก็บ GitHub, URL Git ใดๆ และการกำหนดเวอร์ชันเชิงความหมาย
  • การติดตั้ง ทำผ่าน brew install carthage และการสร้างการพึ่งพาผ่าน carthage bootstrap หรือ carthage update
  • การรวม Xcode เป็นด้วยตนเอง: เฟรมเวิร์กถูกเพิ่มใน General → Frameworks, Libraries, and Embedded Content ด้วยตัวเลือก Embed & Sign
  • Cartfile.resolved ล็อกเวอร์ชันที่แน่นอนของการพึ่งพาทั้งหมด ทำให้มั่นใจในการสร้างซ้ำบน CI และทุกเครื่องของทีม
  • ปัญหาทั่วไป (แคช, Swift ไม่เข้ากัน, ข้อผิดพลาด CI) แก้ไขด้วยการล้างแคช แฟลก --no-use-binaries และการกำหนดค่าแคช CI
  • การเลือกตัวจัดการ: Carthage — สำหรับการควบคุมสมบูรณ์, CocoaPods — สำหรับระบบอัตโนมัติ, SPM — สำหรับโปรเจกต์ใหม่ที่มีการรวมในตัว

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม