An RxSwift implementation of a command line task runner.
Currently, RxTask does not support Linux. RxTask relies on some functionality in Foundation that is currently not available in the Linux port. This will be re-evaluated after the Swift 3.1 release. PRs in this area are quite welcome! 👍
github "RxSwiftCommunity/RxTask"import PackageDescription let package = Package( name: "YOUR_PROJECT_NAME", targets: [], dependencies: [ .Package(url: "https://github.com/RxSwiftCommunity/RxSwift.git", majorVersion: 0) ] )Creating a task is as simple as providing a launchPath to the executable.
let task = Task(launchPath: "/bin/ls")Optionally, you can provide arguments, a workingDirectory, and an environment.
let task = Task(launchPath: "/bin/echo", arguments: ["$MESSAGE"], environment: ["MESSAGE": "Hello World!"])Tasks can be launched with the launch() method. This produces a self-contained process. This means the same task can be launch()ed multiple times producing separate processes.
The output of launch() is a Observable<TaskEvent>. TaskEvent is an enum that is used to report significant events in the task lifetime. The possible events are:
launch(command: String)stdOut(Data)stdErr(Data)exit(statusCode: Int)
Note: Currently an event is only considered successful if it exits with a statusCode of 0. Other exit statuses will be considered a TaskError.
If you create a task that expects input, you can provide an Observable<Data> for stdin when you are launch()ing the Task. Data will be written to stdin as soon as it is emitted by the Observable.
If you are only concerned with whether a Task has completed successfully, you can use the built-in operator justExitStatus().
Task(launchPath: "/bin/ls").launch() .justExitStatus() .subscribe(onNext: { exitStatus in /* ... */ }) .disposed(by: disposeBag)Alternatively, if you are only interested in the output of a Task, you can use the operator justOutput(). This will send the output of both stdout and stderr.
Task(launchPath: "/bin/ls").launch() .justOutput() .subscribe(onNext: { output in /* ... */ }) .disposed(by: disposeBag)TaskError is an Error that will be emitted under the following situations:
uncaughtSignal: TheTaskterminated with an uncaught signal (e.g.SIGINT).exit(statusCode: Int): TheTaskexited with a non-zero exit code.
Full docs can be found here.