cupertino-packages/tuist/XcodeProj
Mihaela Mihaljevic 717311488d data(packages): initial import, 2026-05-27
Per-owner per-repo Swift package source trees, extracted from
codeload.github.com tarballs by `cupertino fetch --source
packages --skip-metadata`. 12 owners covering 137 seed packages
plus transitive dependencies discovered via Package.swift walks
at raw.githubusercontent.com.

Lifted from cupertino-docs/packages/ subtree
(cupertino-docs@26fc51c92). The subtree is being removed from
cupertino-docs in a follow-up commit so per-source-corpus repos
stay separable.

326 MB total, 1 fetch error (logged at fetch time, not blocking
indexer).
2026-05-27 11:35:02 +02:00
..
.mise/tasks data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Documentation data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Fixtures data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Scripts data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Sources/XcodeProj data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Templates data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Tests/XcodeProjTests data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.all-contributorsrc data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.archive.tar.gz data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.mise.toml data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.spi.yml data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.swiftformat data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
.swiftlint.yml data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
CHANGELOG.md data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
cliff.toml data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
CODE_OF_CONDUCT.md data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
LICENSE.md data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
manifest.json data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Package.resolved data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Package.swift data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
README.md data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
renovate.json data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00
Tuist.swift data(packages): initial import, 2026-05-27 2026-05-27 11:35:02 +02:00

XcodeProj

All Contributors

Swift Package Manager Release Code Coverage License

XcodeProj is a library written in Swift for parsing and working with Xcode projects. It's heavily inspired by CocoaPods XcodeProj and xcode.


Projects Using XcodeProj

Project Repository
ProjLint github.com/JamitLabs/ProjLint
rules_xcodeproj github.com/buildbuddy-io/rules_xcodeproj
Rugby github.com/swiftyfinch/Rugby
Sourcery github.com/krzysztofzablocki/Sourcery
Tuist github.com/tuist/tuist
XcodeGen github.com/yonaskolb/XcodeGen
xspm gitlab.com/Pyroh/xspm
Privacy Manifest github.com/stelabouras/privacy-manifest
XcodeProjectCLI github.com/wojciech-kulik/XcodeProjectCLI

If you are also leveraging XcodeProj in your project, feel free to open a PR to include it in the list above.

Installation

Swift Package Manager

Add the dependency in your Package.swift file:

let package = Package(
    name: "myproject",
    dependencies: [
        .package(url: "https://github.com/tuist/XcodeProj.git", .upToNextMajor(from: "8.12.0")),
    ],
    targets: [
        .target(
            name: "myproject",
            dependencies: ["XcodeProj"]),
        ]
)

Scripting

Using swift-sh you can automate project-tasks using scripts, for example we can make a script that keeps a projects version key in sync with the current git tag that represents the projects version:

#!/usr/bin/swift sh
import Foundation
import XcodeProj  // @tuist ~> 8.8.0
import PathKit

guard CommandLine.arguments.count == 3 else {
    let arg0 = Path(CommandLine.arguments[0]).lastComponent
    fputs("usage: \(arg0) <project> <new-version>\n", stderr)
    exit(1)
}

let projectPath = Path(CommandLine.arguments[1])
let newVersion = CommandLine.arguments[2]
let xcodeproj = try XcodeProj(path: projectPath)
let key = "CURRENT_PROJECT_VERSION"

for conf in xcodeproj.pbxproj.buildConfigurations where conf.buildSettings[key] != nil {
    conf.buildSettings[key] = newVersion
}

try xcodeproj.write(path: projectPath)

You could then store this in your repository, for example at scripts/set-project-version and then run it:

$ scripts/set-project-version ./App.xcodeproj 1.2.3
$ git add App.xcodeproj
$ git commit -m "Bump version"
$ git tag 1.2.3

Future adaption could easily include determining the version and bumping it automatically. If so, we recommend using a library that provides a Version object.

References 📚

Contributing

  1. Git clone the repository git@github.com:tuist/xcodeproj.git.
  2. Open Package.swift with Xcode.

License

XcodeProj is released under the MIT license. See LICENSE for details.

Contributors

Thanks goes to these wonderful people (emoji key):

Joseph Colicchio
Joseph Colicchio

🤔
deatondg
deatondg

🤔
Dan Fleming
Dan Fleming

💻
Sascha Schwabbauer
Sascha Schwabbauer

🤔
Marcin Iwanicki
Marcin Iwanicki

🚧
Adam Khazi
Adam Khazi

🚧
Elliott Williams
Elliott Williams

💻
Muukii
Muukii

🖋
Yuya Oka
Yuya Oka

💻
Keith Smiley
Keith Smiley

🖋
Ian Leitch
Ian Leitch

💻
Daniil Subbotin
Daniil Subbotin

💻
Florentin Bekier
Florentin Bekier

💻
Vadim Smal
Vadim Smal

🐛
freddi(Yuki Aki)
freddi(Yuki Aki)

💻
Kristopher Jackson
Kristopher Jackson

💻
Jake Prickett
Jake Prickett

💻
Jake Adams
Jake Adams

💻
matsuji
matsuji

💻
Bogdan Belogurov
Bogdan Belogurov

💻
Chuck Grindel
Chuck Grindel

💻
Michael McGuire
Michael McGuire

💻
C-凡
C-凡

💻
Maxwell Elliott
Maxwell Elliott

💻
Brentley Jones
Brentley Jones

💻
Teameh
Teameh

💻
Johannes Ebeling
Johannes Ebeling

💻
baegteun
baegteun

📖
Alex Kovács
Alex Kovács

📖
Christoffer Winterkvist
Christoffer Winterkvist

💻
Timothy Costa
Timothy Costa

💻
Mary
Mary

💻
Md. Ibrahim Hassan
Md. Ibrahim Hassan

💻
tatagrigory
tatagrigory

💻
Ruslan Alikhamov
Ruslan Alikhamov

💻
Ladislas de Toldi
Ladislas de Toldi

💻
Matt Massicotte
Matt Massicotte

💻
Артем Ворхлик
Артем Ворхлик

💻
Jaewon-Yun
Jaewon-Yun

💻
Mike Gerasymenko
Mike Gerasymenko

💻
Filip Racki
Filip Racki

💻
Kelvin Harron
Kelvin Harron

💻
George Navarro
George Navarro

💻
Maxim
Maxim

💻
Bryan Summersett
Bryan Summersett

💻
Mikhail
Mikhail

💻
Michael
Michael

💻

This project follows the all-contributors specification. Contributions of any kind welcome!