为我们的Swift软件包运行SwiftLint的简单方法

Bor*_* Y. 6 swift swift-package-manager swiftlint

到目前为止,我发现的是这篇博客文章:是时候使用Swift Package Manager了,建议将SwiftLint和其他工具与集成Package.swift

我能够将依赖关系添加到包文件中,并成功构建和测试,但是SwiftLint从未警告我有关语法违规的信息。

在Xcode项目中使用此“构建阶段”步骤之前,请执行以下操作:

if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
Run Code Online (Sandbox Code Playgroud)

文章建议采用蒙犬本身毫无用处没有PackageConfigs。这个想法是在提交期间运行SwiftLint命令。我试图添加两个项目,但无法在合理的时间内使它正常工作。在提交期间,我看到如下警告:

非法指示:4 $ komondor运行前提交

对于Swift Package Manager来说,这还处于初期,互联网上几乎没有信息。

理想情况下,我希望有任何可以使我们的团队自动化SwiftLint的解决方案,理想情况下,不需要添加22个依赖项,配置文件和动态库。

Jos*_*own 8

您现在可以通过Swift Package Manager 插件正式使用 SwiftLint 。为此,请添加包依赖项,然后在要检查的目标中指定插件Package.swift

let package = Package(
    ...
    dependencies: [
        .package(url: "https://github.com/realm/SwiftLint", branch: "main")
    ],
    targets: [
        .target(
            ...
            plugins: [.plugin(name: "SwiftLintPlugin", package: "SwiftLint")]
        )
    ]
)
Run Code Online (Sandbox Code Playgroud)

截至 2023 年 1 月 13 日,我发现在包依赖项中指定exact最新版本 ( 0.50.3) 会导致 SPM 无法解析依赖项。使用branch集合main(如上所述)或特定的revision两者似乎都有效。

然后,在 中.swiftlint.yml,您可以指定要 lint 的目录:

included:
  - Sources
  - Tests
Run Code Online (Sandbox Code Playgroud)


小智 7

从 0.47.1 版本开始,可以将 SwiftLint 附加到 Swift Package。您可以使用.artifactbundle.zipartefact: 在您的Package.swift

(...)
targets: [
    .binaryTarget(
        name: "SwiftLintBinary",
        url: "https://github.com/realm/SwiftLint/releases/download/0.47.1/SwiftLintBinary-macos.artifactbundle.zip",
        checksum: "cdc36c26225fba80efc3ac2e67c2e3c3f54937145869ea5dbcaa234e57fc3724"
    ),
    .plugin(
        name: "SwiftLintPlugin",
        capability: .buildTool(),
        dependencies: ["SwiftLintBinary"]
    ),
    .target(
        name: "YourPackageName",
        dependencies: [],
        plugins: ["SwiftLintPlugin"]
    ),
    (...)
]
Run Code Online (Sandbox Code Playgroud)

接下来您必须设置插件配置。在“Plugins/SwiftLintPlugin”目录中创建一个“plugin.swift”文件:

import PackagePlugin

@main
struct SwiftLintPlugins: BuildToolPlugin {
    
    func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
        return [
            .buildCommand(
                displayName: "Linting \(target.name)...",
                executable: try context.tool(named: "swiftlint").path,
                arguments: [
                    "lint",
                    "--in-process-sourcekit",
                    "--path",
                    target.directory.string   // only lint the files in the target directory
                ],
                environment: [:]
            )
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样。

如果您需要更多背景信息,您还可以在此处查看我的存储库: https: //github.com/Filozoff/Kukulka


Ben*_*rth 6

Swift 中的一项名为Package Manager Extensible Build Tools ( SE-0303 ) 的提案已实施,并可在Swift 5.6中使用,截至 2021 年 10 月,该版本尚未发布。

新的目标类型plugin(与executable和一起library)将可用于在构建期间配置命令。这意味着 SwiftLint 需要做一些工作才能成为 Swift 包插件。SwiftLint 作者可以实现一个包插件,该插件在构建之前创建一个运行 Swiftlint 的命令。


我将在该提案实施时以及 SwiftLint 支持可扩展构建工具时进行更新

  • Swift 5.6 现已发布,有什么方法可以将 swiftlint 作为插件运行吗? (2认同)