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

omtl5h9j  于 2023-01-25  发布在  Swift
关注(0)|答案(3)|浏览(162)

到目前为止,我找到的是这篇博客文章:It's time to use 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

这篇文章建议采用Komondor,没有PackageConfigs它就没用了。这个想法是在提交期间运行SwiftLint命令。我试着添加这两个项目,但无法在合理的时间内让它工作。在提交期间,我看到如下警告:
非法指令:4 $komondor运行预提交
这仍然是早期的Swift软件包管理器和几乎没有任何信息在互联网上。
理想情况下,我希望有任何解决方案,使我们的团队自动化SwiftLint,理想情况下,这将不需要添加22个依赖项,配置文件,并需要动态库。

jdzmm42g

jdzmm42g1#

从版本0.47.1开始,可以将SwiftLint附加到Swift包。您可以使用.artifactbundle.zip工件:在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"]
    ),
    (...)
]

接下来你需要设置一个插件配置,在你的"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: [:]
            )
        ]
    }
}

就是这样。
如果你需要更多的上下文如何做到这一点,你也可以看看我的存储库在这里:https://github.com/Filozoff/Kukulka

ig9co6j1

ig9co6j12#

Swift中一个名为Package Manager Extensible Build ToolsSE-0303)的提议已经实现,并于2021年10月在Swift 5.6not yet released)中提供。
一个新的目标类型,plugin(与executablelibrary一起)将可用于在构建期间配置命令。这意味着SwiftLint要成为Swift包插件还需要做一些工作。SwiftLint作者可以 * 实现一个包插件,在构建之前创建一个命令来运行Swiftlint。*
我将在此建议实现时以及SwiftLint支持可扩展构建工具时进行更新

dzhpxtsq

dzhpxtsq3#

现在你可以通过Swift Package Manager插件正式使用SwiftLint了,要做到这一点,请添加包依赖项,然后在Package.swift中指定要lint的目标插件:

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

截至2023-01-13,我发现在包依赖中指定最新版本(0.50.3)的exact版本会导致SPM解析依赖失败,使用branch设置为main(如上所述)或特定的revision似乎都有效。
然后,在.swiftlint.yml中,您可以指定要lint的目录:

included:
  - Sources
  - Tests

相关问题