一个 Swift 任务运行器和文件监视器,你可以从 Xcode 工作区或命令行运行它。它提供了构建和部署 iOS 应用程序所需的一切,只需运行一个 XCode Scheme 即可。灵感来源于 Gulp.js。
将你的 Slurp Task 模块构建为可执行文件。 从你的 CI 服务器、命令行或 Xcode 运行它。 例如,以下代码构建并将 iOS 应用程序部署到 iTunes App Store
import Slurp
import SlurpXCTools
let xcBuildConfig = XcodeBuild.Config(...)
let uploadConfig = ApplicationLoader.Config(...)
let slurp = Slurp()
slurp
.register("buildAndDeploy") {
return slurp
|> Pod.Install()
|> Version(.incrementBuildNumber, all: true)
|> Version(.setMarketingVersion("1.0.1"), all: true)
|> XcodeBuild([.archive, .export], config: xcBuildConfig)
|> ApplicationLoader(.uploadApp, config: uploadConfig)
}
try! slurp.runAndExit(taskName: "buildAndDeploy")
这对于涉及从第三方工具(例如,图形编辑器)生成文件的开发工作流程非常有用。 如果你正在寻找在不使用 Xcode 的情况下使用 Swift 进行开发的方法,这对于自动运行测试和 linters 也可能很有用。
import Slurp
let slurp = Slurp()
slurp.watch(paths: ["Tests/**.swift"], recursive: true)
.flatMap { _ in
return try! slurp.run(taskName: "runTests")
}
.subscribe(onError: { err in
print(err)
})
RunLoop.main.run() // Keep the task running indefinitely
$ git clone git@github.com:bitwit/Slurp.git
$ cd Slurp && make
~/.slurp/clone
,以便在你的项目中进行本地引用在项目根目录中
$ slurp init
。 这将在 <project root>/Slurp
中创建一个新的 SlurpTasks 包。$ slurp edit
将打开 SlurpTasks Xcode 项目,但你也可以将此项目添加到你的常规工作区。$ slurp
将运行你的 SlurpTasks 可执行文件一个基本的 Sources/SlurpTasks/main.swift
文件看起来像
import Slurp
let slurp = Slurp()
slurp.register("sayHello", Shell(arguments: ["echo", "hello world"]))
try! slurp.runAndExit(taskName: "sayHello")
当你从 XCode 运行你的 Tasks 时,它将从构建文件夹执行。 为了解决这个问题,有几种方法可以正确设置当前工作目录
Slurp.currentWorkingDirectory = "/path/to/app"
$ SLURP_CWD=/path/to/app slurp
slurp
.register("example") {
return slurp
|> CWD("~/Development/personal/Slurp")
|> ...
}
注意:你也可以通过
SLURP_CWD
将其作为环境变量传递。 这可以在你的任务 scheme 的配置中设置
此 git repo 包含一个 xcworkspace 和示例应用程序,它们模仿了这个建议的结构。
xcodebuild
)agvtool
)altool
)pod
)有 3 种方法可以构建你自己的任务
只需注册一个 RxSwift Observable
let myTaskObservable: Observable<Int> = Observable.create { observer in
observer.onNext(100)
observer.onCompleted()
return Disposables.create()
}
slurp
.register("myTask") {
return myTaskObservable
}
直接或通过继承使用 BasicTask
类。 可以使用 RxSwift Observable 或具有 (Error?, T?) -> Void
方法签名的回调函数来初始化它
open class BasicTask<T>: SlurpTask {
public init(observable: Observable<T>)
public convenience init(asyncTask: @escaping ( (Error?, T?) -> Void ) -> Void)
}
使你的类符合 SlurpTask
协议
public protocol SlurpTask {
associatedtype OutputType
func onPipe<U>(from input: U) -> Observable<OutputType>
}
注意:
onPipe<U>
的通用格式主要是在那里为了后代考虑,因为所有当前任务都不会消耗前一个任务的输出。 这将来可能会改变,特别是对于文件系统管理任务
选项 2 和 3,涉及符合 SlurpTask
,有资格与其他任务进行管道连接。
为了方便和简洁,Slurp 使用了管道操作符,即 |>
。 这是调用 func pipe(to: SlurpTask)
的替代方法。
return slurp
|> XcodeBuild([.archive, .export], config: xcBuildConfig)
|> ApplicationLoader(.uploadApp, config: uploadConfig)
相当于
return slurp
.pipe(to: XcodeBuild([.archive, .export], config: xcBuildConfig))
.pipe(to: ApplicationLoader(.uploadApp, config: uploadConfig))
一些未来的愿望/计划。 非常欢迎请求和贡献!
请随时 提出问题 或 在 Twitter 上找到我