What's Tuist 🕺
Tuist is a command line tool that helps you generate, maintain and interact with Xcode projects.
It's open source and written in Swift.
Defining your projects 💼
With Tuist, projects are defined in a
Project.swift, also known as manifest. The manifest format abstracts you from the implementation details of Xcode projects. In your manifest you can define which targets your project has, which sources and resources belong to them, as well as the dependencies with targets in the same and other projects. The advantages of defining the projects in a manifest are:
- It can catch misconfigurations and fail early. For example, if a target has an invalid dependency, it’ll let you know before you start compiling the app.
- Since the manifest doesn’t include Xcode implementation details, the likelihood of having git conflicts is significantly lower.
- It makes the configuration easier. The decision on how the project looks is on you. Tuist processes it and manages the complexity for you. One example of that complexity is setting up dependencies between targets.
The example below shows how projects are defined with Tuist:
import ProjectDescription let project = Project(name: "App", targets: [ Target(name: "App", platform: .iOS, product: .app, bundleId: "io.tuist.App", infoPlist: "Info.plist", sources: ["Sources/**", "OtherSources/**"], dependencies: [ /* Target dependencies can be defined here */ /* .framework(path: "framework") */ ]), Target(name: "AppTests", platform: .iOS, product: .unitTests, bundleId: "io.tuist.AppTests", infoPlist: "Tests.plist", sources: "Tests/**", dependencies: [ .target(name: "App") ]) ])
Interacting with your projects 🙇♀️
Tuist leverages project generation to provide a simple and convenient set of commands, standard across all the projects. The commands infer most of the necessary information from your projects, requiring you to pass only the arguments that are strictly necessary.
Having a standard command line interface makes it easier to jump between projects since there’s an interaction language everyone in the team is familiar with.
- 👩💻 Init: Bootstraps a new project. You can specify the platform and the type of project and it’ll generate all the necessary artifacts (Info.plist, AppDelegate, Project.swift, Playgrounds…).
- 💫 Generate: Generates the Xcode workspace and projects to work on a particular project.
- 📦 Build: (Not available yet) Builds the project in the current directory. It supports all the arguments that xcodebuild supports.
- ✅ Test: (Not available yet) Test the project in the current directory. It supports all the arguments that xcodebuild supports.
- 📱 Run: (Not available yet) Runs the project. If the project needs a device to run on, it’ll prompt you to select one.
- 🚀 Release: (Not available yet) Builds and publishes your project on iTunes Connect.
The list of actions will likely grow as we get feedback from you.
Running script (Recommended)
bash <(curl -Ls https://install.tuist.io)
Bootstrap your first project 🌀
tuist init --platform ios tuist generate # Generates Xcode project & workspace
Check out the project "Getting Started" guide to learn more about Tuist and all its features.
Do you want to know more about what Tuist can offer you? Or perhaps want to contribute to the project and you need a starting point? You can check out the project documentation.
Setup for development 👩💻
- Git clone:
git clone firstname.lastname@example.org:tuist/tuist.git
- Generate Xcode project with
swift package generate-xcodeproj.
- Have fun 🤖
Tuist has a suite of unit tests for its various target that can be run via Swift Packager Manager by invoking:
Additionally, Tuist has a few high level acceptance tests written in cucumber and ruby which can be run by invoking:
If your project uses Tuist, you can add the following badge to your project README:
Tuist is a proud supporter of the Software Freedom Conservacy
Help us keep the lights on
0.19.0 - Nov 14, 2019
- XCTAssertThrowsSpecific convenient function to test for specific errors https://github.com/tuist/tuist/pull/535 by @fortmarek
HTTPClientutility class to
TuistEnvKithttps://github.com/tuist/tuist/pull/508 by @pepibumur.
- Breaking Allow specifying a deployment target within project manifests https://github.com/tuist/tuist/pull/541 by @mollyIV
- Add support for sticker pack extension & app extension products https://github.com/tuist/tuist/pull/489 by @Rag0n
- Utility to locate the root directory of a project https://github.com/tuist/tuist/pull/622 by @pepibumur.
TestActionto make XCode gather coverage info only for that targets https://github.com/tuist/tuist/pull/619 by @abbasmousavi
- Enable the library evololution for the ProjectDescription framework https://github.com/tuist/tuist/pull/625 by @pepibumur.
- Add support for watchOS apps https://github.com/tuist/tuist/pull/623 by @kwridan
- Add linting for duplicate dependencies https://github.com/tuist/tuist/pull/629 by @lakpa
- Change dependencies in
Package.resolvedto version from branch https://github.com/tuist/tuist/pull/631 by @fortmarek
TuistSupporthttps://github.com/tuist/tuist/pull/621 by @pepibumur.
TuistUnitTestCasehttps://github.com/tuist/tuist/pull/519 by @pepibumur.
- Change generated object version behaviour to mimic Xcode 11 by @adamkhazi
- Breaking Refine API for Swift Packages https://github.com/tuist/tuist/pull/578 by @ollieatkinson
- Support ability to locate multiple Tuist directories https://github.com/tuist/tuist/pull/630 by @kwridan
- Fix false positive cycle detection https://github.com/tuist/tuist/pull/546 by @kwridan
- Fix test target build settings https://github.com/tuist/tuist/pull/661 by @kwridan
- Fix hosted unit test dependencies https://github.com/tuist/tuist/pull/664/ by @kwridan
0.18.1 - Sep 30, 2019
- Reverting https://github.com/tuist/tuist/pull/494 using variables in
productNamedoesn't evaluate in all usage points within the generated project
0.18.0 - Sep 28, 2019
- New InfoPlist type,
.extendingDefault([:])https://github.com/tuist/tuist/pull/448 by @pepibumur
- Forward the output of the
codesigncommand to make debugging easier when the copy frameworks command fails https://github.com/tuist/tuist/pull/492 by @pepibumur.
- Support for multi-line settings (see how to migrate) https://github.com/tuist/tuist/pull/464 by @marciniwanicki
- Support for SPM https://github.com/tuist/tuist/pull/394 by @pepibumur & @fortmarek & @kwridan & @ollieatkinson
- Xcode 11 Support by @ollieatkinson
- Transitively link static dependency's dynamic dependencies correctly https://github.com/tuist/tuist/pull/484 by @adamkhazi
- Prevent embedding static frameworks https://github.com/tuist/tuist/pull/490 by @kwridan
- Output losing its format when tuist is run through
tuistenvhttps://github.com/tuist/tuist/pull/493 by @pepibumur
- Product name linting failing when it contains variables https://github.com/tuist/tuist/pull/494 by @dcvz
- Build phases not generated in the right position https://github.com/tuist/tuist/pull/506 by @pepibumur
0.17.0 - Aug 14, 2019
tuist graphcommand https://github.com/tuist/tuist/pull/427 by @pepibumur.
- Allow customisation of
productNamein the project Manifest https://github.com/tuist/tuist/pull/435 by @ollieatkinson
- Adding support for static products depending on dynamic frameworks https://github.com/tuist/tuist/pull/439 by @kwridan
- Support for executing Tuist by running
swift project ...https://github.com/tuist/tuist/pull/447 by @pepibumur.
- New manifest model,
TuistConfig, to easily configure Tuist's functionalities https://github.com/tuist/tuist/pull/446 by @pepibumur.
- Adding ability to re-generate individual projects https://github.com/tuist/tuist/pull/457 by @kwridan
- Support multiple header paths https://github.com/tuist/tuist/pull/459 by @adamkhazi
- Allow specifying multiple configurations within project manifests https://github.com/tuist/tuist/pull/451 by @kwridan
- Add linting for mismatching build configurations in a workspace https://github.com/tuist/tuist/pull/474 by @kwridan
- Support for CocoaPods dependencies https://github.com/tuist/tuist/pull/465 by @pepibumur
- Support custom .xcodeproj name at the model level https://github.com/tuist/tuist/pull/462 by @adamkhazi
TuistConfig.compatibleXcodeVersionssupport https://github.com/tuist/tuist/pull/476 by @pepibumur.
- Expose the
.bundleproduct type https://github.com/tuist/tuist/pull/479 by @kwridan
- Ensuring transitive SDK dependencies are added correctly https://github.com/tuist/tuist/pull/441 by @adamkhazi
- Ensuring the correct platform SDK dependencies path is set https://github.com/tuist/tuist/pull/419 by @kwridan
- Update manifest target name such that its product has a valid name https://github.com/tuist/tuist/pull/426 by @kwridan
- Do not create
Derived/InfoPlistsfolder when no InfoPlist dictionary is specified https://github.com/tuist/tuist/pull/456 by @adamkhazi
- Set the correct lastKnownFileType for localized files https://github.com/tuist/tuist/pull/478 by @kwridan
- Update XcodeProj to 7.0.0 https://github.com/tuist/tuist/pull/421 by @pepibumur.
0.16.0 - Jun 21, 2019
DefaultSettings.noneto disable the generation of default build settings https://github.com/tuist/tuist/pull/395 by @pepibumur.
- Version information for tuistenv https://github.com/tuist/tuist/pull/399 by @ollieatkinson
- Add input & output paths for target action https://github.com/tuist/tuist/pull/353 by Rag0n
- Adding support for linking system libraries and frameworks https://github.com/tuist/tuist/pull/353 by @steprescott
- Ensuring the correct default settings provider dependency is used https://github.com/tuist/tuist/pull/389 by @kwridan
- Fixing build settings repeated same value https://github.com/tuist/tuist/pull/391 by @platonsi
- Duplicated files in the sources build phase when different glob patterns match the same files https://github.com/tuist/tuist/pull/388 by @pepibumur.
.dsource files https://github.com/tuist/tuist/pull/396 by @pepibumur.
- Codesign frameworks when copying during the embed phase https://github.com/tuist/tuist/pull/398 by @ollieatkinson
- 'tuist local' failed when trying to install from source https://github.com/tuist/tuist/pull/402 by @ollieatkinson
- Omitting unzip logs during installation https://github.com/tuist/tuist/pull/404 by @kwridan
- Fix "The file couldn’t be saved." error https://github.com/tuist/tuist/pull/408 by @marciniwanicki
- Ensure generated projects are stable https://github.com/tuist/tuist/pull/410 by @kwridan
- Stop generating empty
PBXBuildFilesettings https://github.com/tuist/tuist/pull/415 by @marciniwanicki