Sylvester 1.0

Sylvester 1.0

Chris Zielinski维护。




Sylvester😼

Carthage compatible Pod Version codebeat badge Swift Version GitHub license PRs Welcome
Header

一个类型安全的、XPC支持的SourceKitten (SourceKit) 接口,附带一些糖。


寻找...

  • 一个针对macOS的Floating Action Button?请查看Fab。🛍️.
  • 一个针对macOS的Bubble Text Field?请查看BubbleTextField💬.
  • 一个集成的基于Spotlight的macOS入门和帮助库?请查看Enlighten💡.

特性

  • 类型安全,不再有 dictionaries 和 SourceKitRepresentable
  • 可选的XPC服务,符合沙盒。
  • 可继承的接口。
  • 全面测试套件。

要求

  • macOS 10.12+

模块

Sylvester框架有两种构建配置,它们在通知SourceKit的方式上有所不同

  • Sylvester — 从嵌入的应用或进程中直接通信。此模块不适合沙箱环境。
  • SylvesterXPC — 通过 XPC 服务进行通信。该模块提供权限分离、增强稳定性,且适合沙箱环境。

📌 注意: XPC 服务本身不能沙盒化(因为固有的依赖项:xcrun、xcodebuild、sourcekitd),并需要额外的 代码签名步骤

安装

Sylvester 可以使用 Carthage 或 CocoaPods 进行安装。

使用 CocoaPods

📣 重要: 当前 XPC 服务(以及/或 SylvesterXPC 模块)对 CocoaPods 安装不可用。

pod "Sylvester"

使用 Carthage

github "chriszielinski/Sylvester"

依赖项

Sylvester / SylvesterXPC 依赖于以下框架/库,因此请确保它们也包含在 嵌入框架 阶段

  • SylvesterCommon.framework
  • SourceKittenFramework.framework
  • SWXMLHash.framework
  • Yams.framework

Embed Frameworks Phase

代码签名

如果您决定使用 SylvesterXPC 模块,您需要在其 SylvesterXPC.framework (即 嵌入框架 阶段之前)嵌入前添加一个 Run Script 阶段。请确保壳启动路径为 /bin/sh(默认值)。然后对于 Carthage 安装,请执行存储库 脚本 目录中的 code_sign_carthage.sh 脚本。

"$SRCROOT/Carthage/Checkouts/Sylvester/Scripts/code_sign_carthage.sh"

Code Sign Phase

对于其他安装,根据需要修改脚本的路径。

支持请求

请求
代码完成 SKCodeCompletion
代码完成会话 SKCodeCompletionSession
文档信息 SKDocInfo
编辑器打开 SKEditorOpen
模块信息 SKModule
Swift 文档 SKSwiftDocs
语法映射 SKSyntaxMap
自定义YAML SKYAMLRequest

其他有趣的功能

类型 方法
XCRun SylvesterInterface.shared.xcRun(arguments:)
XcodeBuild SylvesterInterface.shared.xcodeBuild(arguments:currentDirectoryURL:)
Bash命令 SylvesterInterface.shared.executeBash(command:currentDirectoryURL:)
启动子进程 SylvesterInterface.shared.launch(subprocess:)

子类化

大多数标准请求都是一些通用类的具体子类。你想有自己的子类?没问题,这可能做到。

SKSubstructure, SKEntity

也称为SKBaseSubstructure(或SKBaseEntity),一个常见的罪魁祸首。

📌 注意:子类化SKBaseEntity使用类似的语法。

final class BetterSubstructureSubclass: SKBaseSubstructure, SKFinalSubclass {

    var iAmAnImportantProperty: String = "🚶‍♂️"

    public override func decodeChildren(from container: DecodingContainer) throws -> [SKBaseSubstructure]? {
        return try decodeChildren(BetterSubstructureSubclass.self, from: container)
    }

    /// The default iterator for `SKChildren` does a pre-order (NLR) depth-first search (DFS) traversal; however, if you want something else, for instance:
    class FunctionSubstructureIterator<Substructure: BetterSubstructureSubclass>: SKPreOrderDFSIterator<Substructure> {

        override func next() -> Substructure? {
            guard let nextSubstructure = super.next()
                else { return nil }

            if nextSubstructure.isFunction {
                return nextSubstructure
            } else {
                return next()
            }
        }

    }

    override class func iteratorClass<Substructure: BetterSubstructureSubclass>() -> SKPreOrderDFSIterator<Substructure>.Type {
        return FunctionSubstructureIterator.self
    }

}

SKEditorOpen, SKSwiftDocs

这是一个使用上面声明的 BetterSubstructureSubclassSKSwiftDocs 子类的例子

📌 注意:子类化SKEditorOpen使用相同的语法,除了它从SKGenericEditorOpen继承。

class BetterSwiftDocs: SKGenericSwiftDocs<BetterSubstructureSubclass> {

    var mySuperCoolProperty: String = "😎"

}

SKModule

以下是一个使用上述声明的 BetterSwiftDocsBetterSubstructureSubclass 类的 SKModule 子类的例子

class BetterModule: SKGenericModule<BetterSubstructureSubclass, BetterSwiftDocs> {}

文档

您可以在此处探索文档。

// 待办

  • 添加对其他请求的支持。

社区

  • 发现了一个错误?打开一个问题
  • 有什么功能想法?打开一个问题完成后自己做 & PR😅(或者你可以打开一个🙄).
  • 想要贡献吗?提交一个 Pull Request

贡献者

框架和库

Sylvester 依赖于 Swift 社区的出色贡献,尤其是

许可证

Sylvester 可在 MIT 许可证下使用,更多信息请参阅 LICENSE 文件。