Shell is a µ-library written Swift to run shell tasks.
Add the dependency in your Package.swift
file:
let package = Package(
name: "myproject",
dependencies: [
.package(url: "https://github.com/tuist/shell.git", .upToNextMajor(from: "1.0.2")),
],
targets: [
.target(
name: "myproject",
dependencies: ["shell"]),
]
)
Add the following line to your project Podfile:
pod "Shell", "1.0.2"
Add the following line to your project Cartfile:
github "tuist/shell" "1.0.2"
If you want to use Shell in a Marathon script, either add it to your Marathonfile
(see the Marathon repo for instructions on how to do that), or point Marathon to Shell using the inline dependency syntax:
import Shell // https://github.com/tuist/shell.git
To run commands in the system, you need to create an instance of Shell
:
let shell = Shell()
Shell exposes methods for running the commands synchronously, asynchronously, and capturing the output:
// Synchronous running
let result = shell.sync(["xcodebuild", "-project", "Shell", "-scheme", "Shell"])
// Asynchronous running
shell.async(["xcodebuild", "-project", "Shell", "-scheme", "Shell"]) { result in
// Process the result
})
// Capturing output
let result = shell.capture(["xcode-select", "-p"])
We understand how inconvenient testing might be in Swift and thus, we designed Shell's API to facilitate testing by avoiding many syntactic sugar and static interfaces. The library comes with a library, ShellTesting
that you can import in your tests target to mock the Shell
interface and stub the result of running commands:
import ShellTesting
let mock = Shell.mock()
let xcodebuild = XcodeBuild(shell: mock)
shell.succeed(["xcodebuild", "-project", "Shell.xcodeproj", "-scheme", "Shell"])
XCTAssertNoThrow(try xcodebuild.build(project: "Shell.xcodeproj", scheme: "Shell"))
- Git clone:
git@github.com:tuist/shell.git
- Generate Xcode project with
swift package generate-xcodeproj
. - Open
Shell.xcodeproj
. - Have fun 🤖
Tuist is a proud supporter of the Software Freedom Conservacy