Slurp Logo

Build Status Swift Package Manager Compatible Releases

一个 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

安装

  1. $ git clone git@github.com:bitwit/Slurp.git
  2. $ cd Slurp && make
  3. Slurp CLI 现在将被安装,并且 repo 将被复制到 ~/.slurp/clone,以便在你的项目中进行本地引用

将 Slurp 添加到你的项目

在项目根目录中

  1. $ slurp init。 这将在 <project root>/Slurp 中创建一个新的 SlurpTasks 包。
  2. $ slurp edit 将打开 SlurpTasks Xcode 项目,但你也可以将此项目添加到你的常规工作区。
  3. $ slurp 将运行你的 SlurpTasks 可执行文件

你的第一个 slurp 任务

一个基本的 Sources/SlurpTasks/main.swift 文件看起来像

import Slurp

let slurp = Slurp()

slurp.register("sayHello", Shell(arguments: ["echo", "hello world"]))

try! slurp.runAndExit(taskName: "sayHello")

在 Xcode 中开发和运行

当你从 XCode 运行你的 Tasks 时,它将从构建文件夹执行。 为了解决这个问题,有几种方法可以正确设置当前工作目录

  1. 在你的 main.swift 顶部设置它
Slurp.currentWorkingDirectory = "/path/to/app"
  1. 将其作为环境变量传递

$ SLURP_CWD=/path/to/app slurp

  1. 在任务流程中的任何时候更改它
slurp
    .register("example") {
        return slurp
            |> CWD("~/Development/personal/Slurp")
            |> ...
    }

注意:你也可以通过 SLURP_CWD 将其作为环境变量传递。 这可以在你的任务 scheme 的配置中设置

此 git repo 包含一个 xcworkspace 和示例应用程序,它们模仿了这个建议的结构。

当前可用任务

编写你自己的任务

有 3 种方法可以构建你自己的任务

  1. 只需注册一个 RxSwift Observable

    let myTaskObservable: Observable<Int> = Observable.create { observer in
    	observer.onNext(100)
    	observer.onCompleted()
    	return Disposables.create()
    }
    
    slurp
    .register("myTask") {
        return myTaskObservable
    }
  2. 直接或通过继承使用 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) 
    }
  3. 使你的类符合 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 上找到我