【问题标题】:How to integrate SwiftLint with an iOS app using Swift Package Manager?如何使用 Swift 包管理器将 SwiftLint 与 iOS 应用程序集成?
【发布时间】:2019-12-19 01:34:27
【问题描述】:

我正在 Xcode 11(beta 5)中创建一个新的 iOS 应用程序,我想尝试使用 Swift 包管理器而不是 CocoaPods 来管理依赖项。

使用 SwiftLint 和 CocoaPods 时的一个常见模式是添加 SwiftLint 作为依赖项,然后添加构建阶段以执行 ${PODS_ROOT}/SwiftLint/swiftlint;这样,所有开发人员最终都使用相同版本的 SwiftLint。

如果我尝试在 Xcode 中添加 SwiftLint 作为 SwiftPM 依赖项,我需要的可执行目标将被禁用:

我能够通过创建一个没有产品或目标的虚拟Package.swift 并在我的构建阶段运行swift run swiftlint 来伪造它,但它感觉很奇怪:

// swift-tools-version:5.1
import PackageDescription

let package = Package(
    name: "dummy-package",
    products: [],
    dependencies: [
        .package(url: "https://github.com/realm/SwiftLint.git", from: "0.34.0")
    ],
    targets: []
)

有没有办法在不创建虚拟包的情况下做到这一点?或者 Swift 包管理器不是这个特定用例的正确工具?

【问题讨论】:

  • FWIW:目前有一个new/future/accepted feature 是 WIP,这将使我们能够做你想做的事情,甚至更多。让我们希望它很快就会来到我们身边!

标签: ios xcode11 swift-package-manager swiftlint


【解决方案1】:

所有滥用 iOS 代码依赖管理器来运行构建工具的方法都是 hacky 和奇怪的。

版本 SPM 兼容工具依赖项的正确方法是使用 Mint: A package manager that installs and runs Swift CLI packages。另见Better iOS projects: How to manage your tooling with mint

【讨论】:

    【解决方案2】:

    我使用xcodegen 生成一个能够运行脚本的 Xcode 项目。这让我在开发包时可以在 Xcode 中看到 swiftlint 警告。

    此工具从project.yml 定义创建一个 Xcode 项目。在该定义中,您可以添加一个运行 swiftlint 的脚本作为编译后任务。 Example.

    这种方法的优点:

    • Xcode 中的 swiftlint 警告。
    • Xcode 设置超出了 SPM 提供的范围。

    缺点:

    • 您依赖的第三方工具可能会损坏或消失。但是,您可以随时删除此依赖项并返回以在 Xcode 中编辑 Package.swift。
    • 你需要学会写project.yml文件。
    • 如果您使用 SPM 包,您需要自己生成包访问器。

    关于生成捆绑访问器的一句话。从 Xcode 项目工作时需要这样做,因为只有 SPM 会为项目生成文件 resource_bundle_accessor.swift。如果您在使用 Xcode 打开Package.swift 后已经编译,文件应该在这里:

    find ~/Library/Developer/Xcode/DerivedData* -iname resource_bundle_accessor.swift
    

    您可以将它添加到项目中,但如果您正在创建一个框架,则捆绑访问器可以很简单:

    import class Foundation.Bundle
    
    // This file is only used when using a xcodegen-generated project.
    // Otherwise this file should not be in the path.
    
    private class BundleFinder {}
    
    extension Foundation.Bundle {
        static var module = Bundle(for: BundleFinder.self)
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2022-11-11
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多