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). |
||
|---|---|---|
| .. | ||
| .mise/tasks | ||
| Documentation | ||
| Fixtures | ||
| Scripts | ||
| Sources/XcodeProj | ||
| Templates | ||
| Tests/XcodeProjTests | ||
| .all-contributorsrc | ||
| .archive.tar.gz | ||
| .mise.toml | ||
| .spi.yml | ||
| .swiftformat | ||
| .swiftlint.yml | ||
| CHANGELOG.md | ||
| cliff.toml | ||
| CODE_OF_CONDUCT.md | ||
| LICENSE.md | ||
| manifest.json | ||
| Package.resolved | ||
| Package.swift | ||
| README.md | ||
| renovate.json | ||
| Tuist.swift | ||
XcodeProj
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 project’s version key in sync with the current
git tag that represents the project’s 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 📚
- Xcode Project File Format
- pbexplorer
- pbxproj identifiers
- mob-pbxproj
- Xcodeproj
- Nanaimo
- Facebook Buck
Contributing
- Git clone the repository
git@github.com:tuist/xcodeproj.git. - Open
Package.swiftwith Xcode.
License
XcodeProj is released under the MIT license. See LICENSE for details.
Contributors ✨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!