π§ͺ Shell
Shell is a Β΅-library written Swift to run shell tasks.
π
Install Swift Package Manager
Add the dependency in your Package.swift
file:
let package = Package(
name: "myproject",
dependencies: [
.package(url: "https://github.com/tuist/shell.git", .upToNextMajor(from: "2.2.0")),
],
targets: [
.target(
name: "myproject",
dependencies: ["Shell"]),
]
)
CocoaPods
Add the following line to your project Podfile:
pod "Shell", "2.2.0"
pod "ShellTesting", "2.2.0"
pod "RxShell", "2.2.0"
Carthage
Add the following line to your project Cartfile:
github "tuist/shell" "2.2.0"
Marathon
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
π
Usage 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"])
β
Testing 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"))
π
RxShell Shell comes with a package, RxShell
that adds a reactive extension using RxSwift to the interface of Shell
.
subject.run(["xcodebuild", "-project", "Shell", "-scheme", "Shell"]).subscribe {
print("Compilation completed")
}
π©βπ»
Setup for development - Git clone:
[email protected]:tuist/shell.git
- Generate Xcode project with
swift package generate-xcodeproj
. - Open
Shell.xcodeproj
. - Have fun
π€
Open source
Tuist is a proud supporter of the Software Freedom Conservacy