使用 Swift Package Dependency 安装时 SwiftLint 的路径应该是啥

Posted

技术标签:

【中文标题】使用 Swift Package Dependency 安装时 SwiftLint 的路径应该是啥【英文标题】:What should be the path of SwiftLint when installed with Swift Package Dependency使用 Swift Package Dependency 安装时 SwiftLint 的路径应该是什么 【发布时间】:2021-11-25 16:40:08 【问题描述】:

我已经安装了带有 Swift Package Dependancy 的 SwiftLint。如手册中所述,我在 Build Phases 中添加了以下 Run 脚本:

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

运行我的项目时,我收到警告消息:

警告:未安装 SwiftLint,请从以下位置下载 https://github.com/realm/SwiftLint

所以我猜你的系统找不到 swiftlint 可执行文件。如果安装了 Swift Package Dependency,它在哪里?

【问题讨论】:

artsy.github.io/blog/2019/01/05/its-time-to-use-spm 或 blog.apptekstudios.com/2019/12/spm-xcode-build-tools ? @Larme,不幸的是,我在这些博客中没有找到答案。也许您会考虑创建一个空项目并尝试使用 SPM 安装 SwiftLint。也许它会对你有用,世界其他地方也会受益。 :) 我没有测试,但链接示例似乎很先进。特别是 blog.apptekstudios.com/2019/12/spm-xcode-build-tools 换句话说:不要依赖 XCode SPM 集成,而是使用 Package.swift 以旧方式进行集成,在此添加您需要的依赖项。然后在构建阶段,您可以“检索该“Package.swift”,并使用swift run etc.“运行它”(这将下载链接的包,构建并运行)。这将允许您访问 Swiftlint、SwiftFormat 等,并在构建阶段使用它。它就像一个工具的“辅助项目”。 @Larme SwiftFormat 适用于 SPM,不幸的是 SwiftLint 不适用。 然而,那里给出了解决方案。这也是SwiftFormat在他们的自述文件中给出的解决方案:github.com/nicklockwood/SwiftFormat#xcode-build-phase 【参考方案1】:

你不能,你可以同时。

Xcode 中“集成”的 Swift 包管理器 (SPM) 可用于将代码“嵌入”到您的应用中。 不嵌入可执行文件(如 Swiftlint)。

因此,解决方案是在您的应用旁边创建一个带有 SPM 的“并行”项目。

在以下两个链接中有描述:

It's time to use Swift Package ManagerUsing SPM for Xcode build phase tools

所以这个想法是有一个Package.swiftSwiftlint,构建/运行它,然后它应该启动Swiftlint。 第一次,它将获取代码,构建然后运行。所以可能需要一些时间。

这也是SwiftFormat在他们的ReadMe上给出的解决方案。

在这里应用,这里是文件层次结构。我添加了一个文件夹和一个文件。

MyProject:
.
├── BuildTools
│   └── Package.swift
├── MyProject
│   ├── .swiftlint.yml
│   ├── AppDelegate.swift
│   ├── Assets.xcassets
│   │   ├── AppIcon.appiconset
│   │   │   └── Contents.json
│   │   └── Contents.json
│   ├── Base.lproj
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Info.plist
│   ├── SceneDelegate.swift
│   └── ViewController.swift
└── MyProject.xcodeproj

Build Phases 脚本中:

cd BuildTools
SDKROOT=(xcrun --sdk macosx --show-sdk-path)
#swift package update #Uncomment this line temporarily to update the version used to the latest matching your BuildTools/Package.swift file
swift run -c release swiftlint "$SRCROOT" --config ../MyProject/.swiftlint.yml --path ../MyProject

Package.swift 是:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "BuildTools",
    platforms: [.macOS(.v10_11)],
    dependencies: [
         .package(url: "https://github.com/Realm/SwiftLint", from: "0.44.0")
    ],
    targets: [.target(name: "BuildTools", path: "")]
)

由于我们正在创建另一个项目并且没有利用集成的 Xcode 集成解决方案,因此使用 MintHomeBrew 等解决方案可能会更好。例如,Mint 是一个“完整的 SPM 工具”。如果您有更多工具,将它们集中到一个中可能确实是一个很好的解决方案。

【讨论】:

我给了你积分,因为你很好,花时间写了一个详细的答案,但不幸的是它对我不起作用。我创建了一个新项目,添加了一个 SwiftLint 包,添加了 BuildTools 文件夹和带有上述内容的 Package.swift,并添加了 Build Phases 脚本。运行时,我收到以下错误:没有名为“swiftlint”的可执行产品。您是否遇到过同样的问题,还是顺利进行? 我也必须不时清理派生数据。当我试图理解我链接的教程时,我首先遇到了这个问题。因为我有 Swiftlint 和 Homebrew(我认为),所以我不认为它很难通过它,但我不是 100% 确定(我不想删除它,测试并重新安装它),但是我认为我的解决方案有效。您不会在新项目中添加 Swiftlint 包。

以上是关于使用 Swift Package Dependency 安装时 SwiftLint 的路径应该是啥的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 13如何使用本地Swift包(Swift Package)

Xcode 13如何使用本地Swift包(Swift Package)

你可以在 iOS 应用程序中使用 Package.swift 而不是使用 .xcodeproj 吗?

从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift

Swift Package Manager 无法解析 1.4 以上的 Kitura 版本

Xcode 使用Swift Package 来添加第三方库