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") ]) ])
Although we encourage defining the manifests in Swift, Tuist also supports JSON and Yaml formats.
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)
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/tuist/install/master/install)"
Optionally, you can use Mint:
mint install tuist/tuist
Bootstrap your first project 🌀
tuist init --platform ios --product application tuist generate # Generates Xcode project
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:
- 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.12.0 - Mar 11, 2019
- Rename manifest group to
Manifesthttps://github.com/tuist/tuist/pull/227 by @pepibumur.
- Rename manifest target to
Project-Manifesthttps://github.com/tuist/tuist/pull/227 by @pepibumur.
- Replace swiftlint with swiftformat https://github.com/tuist/tuist/pull/239 by @pepibumur.
- Bump xcodeproj version to 6.6.0 https://github.com/tuist/tuist/pull/248 by @pepibumur.
- Fix an issue with Xcode not being able to reload the projects when they are open https://github.com/tuist/tuist/pull/247
- Support array for
resourcespaths https://github.com/tuist/tuist/pull/201 by @dangthaison91
- Integration tests for
generatecommand https://github.com/tuist/tuist/pull/208 by @marciniwanicki & @kwridan
- Frequently asked questions to the documentation https://github.com/tuist/tuist/pull/223/ by @pepibumur.
- Generate a scheme with all the project targets https://github.com/tuist/tuist/pull/226 by @pepibumur
- Documentation for contributors https://github.com/tuist/tuist/pull/229 by @pepibumur
- Support for Static Frameworks https://github.com/tuist/tuist/pull/194 @ollieatkinson
- Up attribute from the
Projectmodel https://github.com/tuist/tuist/pull/228 by @pepibumur.
- Support for YAML and JSON formats as Project specifications https://github.com/tuist/tuist/pull/230 by @ollieatkinson
- Changed default value of SWIFT_VERSION to 4.2 @ollieatkinson
- Added fixture tests for ios app with static libraries @ollieatkinson
- Bundle id linting failing when the bundle id contains variables https://github.com/tuist/tuist/pull/252 by @pepibumur
- Include linked library and embed in any top level executable bundle https://github.com/tuist/tuist/pull/259 by @ollieatkinson
0.11.0 - Feb 14, 2019
- Breaking Up can now be specified via
Setup.swifthttps://github.com/tuist/tuist/issues/203 by @marciniwanicki & @kwridan
- Schemes generation https://github.com/tuist/tuist/pull/188 by @pepibumur.
- Environment variables per target https://github.com/tuist/tuist/pull/189 by @pepibumur.
- Danger warn that reminds contributors to update the docuementation https://github.com/tuist/tuist/pull/214 by @pepibumur
- Rubocop https://github.com/tuist/tuist/pull/216 by @pepibumur.
- Fail init command if the directory is not empty https://github.com/tuist/tuist/pull/218 by @pepibumur.
- Verify that the bundle identifier has only valid characters https://github.com/tuist/tuist/pull/219 by @pepibumur.
- Merge documentation from the documentation repository https://github.com/tuist/tuist/pull/222 by @pepibumur.
- Danger https://github.com/tuist/tuist/pull/186 by @pepibumur.
- Swiftlint style issues https://github.com/tuist/tuist/pull/213 by @pepibumur.
- Use environment tuist instead of the absolute path in the embed frameworks build phase https://github.com/tuist/tuist/pull/185 by @pepibumur.
- JSON and YAML manifests https://github.com/tuist/tuist/pull/190 by @pepibumur.
0.10.2 - Dec 20, 2018
- Processes not stopping after receiving an interruption signal https://github.com/tuist/tuist/pull/180 by @pepibumur.
0.10.1 - Dec 20, 2018
- Replace ReactiveTask with SwiftShell https://github.com/tuist/tuist/pull/179 by @pepibumur.
- Carthage up command not running when the
Cartfile.resolvedfile doesn't exist https://github.com/tuist/tuist/pull/179 by @pepibumur.
0.10.0 - Dec 20, 2018
- Don't generate the Playgrounds group if there are no playgrounds https://github.com/tuist/tuist/pull/177 by @pepibumur.
- Tuist up command https://github.com/tuist/tuist/pull/158 by @pepibumur.
.csource files https://github.com/tuist/tuist/pull/178 by @pepibumur.