Carthage เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์สำหรับโปรเจกต์ Cocoa (iOS, macOS, watchOS, tvOS) ที่สร้างเฟรมเวิร์กไบนารีจากซอร์สโค้ด ต่างจาก CocoaPods ตรงที่ Carthage จะไม่ปรับเปลี่ยนโปรเจกต์โดยอัตโนมัติ — นักพัฒนาจะเพิ่มเฟรมเวิร์กที่สร้างแล้วลงใน Xcode ด้วยตนเอง Carthage เขียนด้วย Swift ใช้ Cartfile เพื่ออธิบายการพึ่งพาและรองรับการสร้างแบบขนาน ตามพื้นที่เก็บ GitHub Carthage รวบรวมดาวได้มากกว่า 15,000 ดวงและยังคงเป็นเครื่องมือเฉพาะกลุ่มแต่เป็นที่ต้องการสำหรับโปรเจกต์ที่ต้องการการแทรกแซงในการกำหนดค่า Xcode น้อยที่สุด
ประเด็นสำคัญ
carthage bootstrap หรือ carthage update — Carthage โคลนพื้นที่เก็บและคอมไพล์เป็น .xcframeworkCarthage เป็นตัวจัดการการพึ่งพาที่มีสถาปัตยกรรมแบบกระจายศูนย์ สร้างขึ้นในปี 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 โคลนพื้นที่เก็บ Git ของแต่ละการพึ่งพา สลับไปยังเวอร์ชันที่ระบุ (แท็ก คอมมิตหรือสาขา) และเรียกใช้ xcodebuild เพื่อสร้างเฟรมเวิร์ก Carthage กำหนดประเภทโปรเจกต์ Xcode (เฟรมเวิร์ก ไดนามิกเฟรมเวิร์ก ไลบรารีแบบสแตติก) โดยอัตโนมัติตามสคีมาการสร้าง หากโปรเจกต์มีหลายสคีมา Carthage ใช้สคีมาเริ่มต้น (แรกตามลำดับตัวอักษร) หลังการสร้าง Carthage คัดลอกเฟรมเวิร์กที่เสร็จแล้วไปยัง Carthage/Build/ และสร้างไฟล์ Cartfile.resolved พร้อมล็อกเวอร์ชันที่แน่นอน Carthage รองรับการแคชเฟรมเวิร์กที่สร้างแล้ว — การสร้างใหม่โดยไม่มีการเปลี่ยนแปลงการพึ่งพาจะถูกข้าม
การพึ่งพาแบบทรานซิทีฟใน Carthage จัดการผ่าน Cartfile.resolved: Carthage สร้างกราฟของการพึ่งพาที่จำเป็นทั้งหมดและสร้างตามลำดับที่ถูกต้อง หากไลบรารีสองตัวขึ้นอยู่กับไลบรารีของบริษัทอื่นเดียวกัน Carthage สร้างมันครั้งเดียวและใช้สำหรับทั้งคู่ Carthage รายงานข้อผิดพลาดในการสร้างโดยระบุเป้าหมายและสาเหตุเฉพาะ — ซึ่งช่วยให้การวินิจฉัยปัญหาง่ายขึ้น
Cartfile เป็นไฟล์กำหนดค่าที่มีไวยากรณ์คล้าย Ruby (รูปแบบ Cartfile) ซึ่งกำหนดการพึ่งพาของโปรเจกต์ Carthage Cartfile อยู่ในรูทของโปรเจกต์ถัดจาก .xcodeproj แต่ละบรรทัดของ Cartfile อธิบายการพึ่งพาหนึ่งรายการ: แหล่งที่มา (URL Git, พื้นที่เก็บ GitHub) และเวอร์ชัน ไวยากรณ์รองรับการล็อกเวอร์ชันผ่านแท็ก คอมมิตและสาขา
# ดีเพนเดนซีพื้นฐาน 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"
Carthage รองรับหลายไดเรกทอรีสำหรับการกำหนดค่าต่างๆ: Cartfile (หลัก), Cartfile.private (สำหรับการพึ่งพาภายในที่ไม่เผยแพร่) และ Cartfile.resolved (สร้างโดยอัตโนมัติ) การพึ่งพาส่วนตัวมีประโยชน์สำหรับไลบรารีที่ใช้เฉพาะในการสร้างสำหรับการพัฒนา เช่น เฟรมเวิร์กทดสอบ
# 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 ติดตั้งผ่าน Homebrew — ตัวจัดการแพ็กเกจมาตรฐานสำหรับ macOS วิธีการอื่น: การติดตั้งจากตัวติดตั้ง .pkg ที่สร้างจาก GitHub หรือสร้างจากซอร์สโค้ด Carthage ต้องการ Xcode with Command Line Tools (รวมถึง xcodebuild) และบน Apple Silicon Mac — Rosetta 2 สำหรับการพึ่งพาแบบเดิมบางส่วน
# การติดตั้ง 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 อย่างชัดเจน
# การอัปเดต 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 ที่มีเป้าหมายเฟรมเวิร์ก — มิฉะนั้นการสร้างจะล้มเหลว
Carthage มีคำสั่งหลักสามคำสั่งสำหรับทำงานกับการพึ่งพา: bootstrap, update และ build carthage bootstrap สร้างการพึ่งพาจาก Cartfile.resolved ที่มีอยู่ — แนะนำสำหรับสภาพแวดล้อม CI และนักพัฒนาที่เข้าร่วมโปรเจกต์ carthage update อัปเดต Cartfile.resolved เป็นเวอร์ชันล่าสุด (โดยเคารพข้อจำกัดของ Cartfile) และดำเนินการสร้าง carthage build สร้างการพึ่งพาที่ระบุทั้งหมดโดยไม่บันทึกเวอร์ชัน
# การติดตั้งครั้งแรก (อัปเดตเวอร์ชัน)
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 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:
# 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"
doneCarthage ไม่ต้องการใช้ .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, CocoaPods และ Swift Package Manager (SPM) เป็นตัวจัดการการพึ่งพาหลักสามตัวในการพัฒนา iOS Carthage โดดเด่นด้วยแนวทางแบบกระจายศูนย์ CocoaPods นำเสนอทะเบียนแบบรวมศูนย์ และ SPM เป็นโซลูชันในตัวของ Apple การเลือกระหว่างพวกเขาขึ้นอยู่กับข้อกำหนดของโปรเจกต์ ขนาดทีมและระดับอัตโนมัติที่ต้องการ
| เกณฑ์ | Carthage | CocoaPods | SPM |
|---|---|---|---|
| สถาปัตยกรรม | กระจายศูนย์ | ทะเบียนรวมศูนย์ | รวมใน 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 เป็นตัวจัดการการพึ่งพาแบบกระจายศูนย์สำหรับแพลตฟอร์ม Apple ต่างจาก CocoaPods ตรงที่ Carthage ไม่ใช้ทะเบียนไลบรารีกลาง ไม่ปรับเปลี่ยนโปรเจกต์ Xcode โดยอัตโนมัติและไม่สร้าง .xcworkspace Carthage สร้างการพึ่งพาเป็นเฟรมเวิร์กไบนารีที่นักพัฒนาเพิ่มด้วยตนเองใน Xcode ในทางกลับกัน CocoaPods ทำให้กระบวนการทั้งหมดเป็นอัตโนมัติผ่าน Podfile
Carthage ติดตั้งผ่าน Homebrew: brew install carthage หรืออีกทางเลือก — ดาวน์โหลด Carthage.pkg จาก GitHub Releases หรือสร้างจากซอร์สโค้ด หลังติดตั้ง ตรวจสอบเวอร์ชัน: carthage version Carthage ต้องการ Xcode with Command Line Tools บน Apple Silicon Mac อาจต้องใช้ Rosetta 2 เพิ่มเติม
Cartfile เป็นไฟล์กำหนดค่าที่นักพัฒนาเขียน: ประกอบด้วยชื่อไลบรารีและตัวดำเนินการเวอร์ชัน (~> 5.9, == 8.0.0, ชื่อสาขา) Cartfile.resolved ถูกสร้างโดยอัตโนมัติระหว่าง carthage update และล็อกเวอร์ชันที่แน่นอนของการพึ่งพาที่ติดตั้งทั้งหมด Cartfile.resolved ควรเก็บใน Git — มันรับประกันการสร้างซ้ำได้บนทุกเครื่อง
Carthage ต้องการให้ไลบรารีมีโปรเจกต์ Xcode หรือ workspace ที่ถูกต้องพร้อมเป้าหมายเฟรมเวิร์ก ตรวจสอบว่าพื้นที่เก็บเข้าถึงได้ (ไม่เป็นส่วนตัวโดยไม่มีคีย์) ระบุเวอร์ชันที่ถูกต้อง (แท็กหรือคอมมิตมีอยู่) และไลบรารีรองรับเวอร์ชัน Xcode ของคุณ ใช้ carthage build --verbose สำหรับการวินิจฉัยโดยละเอียด หากไลบรารีไม่มีเป้าหมายเฟรมเวิร์ก Carthage ไม่สามารถสร้างได้
Carthage ยังคงเกี่ยวข้องสำหรับโปรเจกต์ที่ต้องการการจัดการการพึ่งพาแบบกระจายศูนย์ การควบคุมการรวมอย่างสมบูรณ์และการแทรกแซงในโปรเจกต์ Xcode น้อยที่สุด อย่างไรก็ตาม โปรเจกต์ใหม่ส่วนใหญ่เลือก Swift Package Manager (SPM) — มันถูกรวมใน Xcode ไม่ต้องการการติดตั้งเพิ่มเติมและพัฒนาโดย Apple อย่างต่อเนื่อง Carthage แนะนำสำหรับโปรเจกต์เดิมที่ไปป์ไลน์การสร้างถูกกำหนดไว้แล้ว หรือสำหรับไลบรารีที่ผู้เขียนต้องการให้ผู้ใช้มีอิสระในการเลือกวิธีการรวม
สรุป
brew install carthage และการสร้างการพึ่งพาผ่าน carthage bootstrap หรือ carthage update--no-use-binaries และการกำหนดค่าแคช CIเราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ