SwiftPackageList

Xcode Build SwiftLint

一个用于获取所有使用的 Swift Package 依赖项的命令行工具。

输出包括所有 Package.resolved 的信息以及检出目录中的许可证。 您还可以生成 JSON、PLIST、Settings.bundle 或 PDF 文件。

此外,还有一个 Swift Package 可以从应用程序的 bundle 中读取生成的 package-list 文件,或者使用预构建的 SwiftUI 和 UIKit 用户界面。

命令行工具

安装

使用 Homebrew

brew tap FelixHerrmann/tap
brew install swift-package-list

使用 Mint

mint install FelixHerrmann/swift-package-list

从源代码安装

克隆或下载此仓库,然后运行 make installmake updatemake uninstall

用法

打开终端并运行 swift-package-list <项目路径>,其中 <项目路径> 是您要生成列表的项目文件的路径。 目前支持以下类型:

此外,您可以指定以下选项:

选项 描述
--custom-derived-data-path <custom-derived-data-path> DerivedData 文件夹的自定义路径。
--custom-source-packages-path <custom-source-packages-path> SourcePackages 文件夹的自定义路径。
--custom-packages-file-path <custom-packages-file-path> 包含自定义 Package 的文件的路径,该文件格式与 JSON 输出相同。(可以多次重复此选项)
--output-type <output-type> package-list 的输出类型。(值:stdout、json、plist、settings-bundle、pdf;默认:stdout)
--output-path <output-path> package-list 文件将存储的路径。(stdout 输出类型不需要)
--custom-file-name <custom-file-name> 要使用的自定义文件名,而不是默认文件名。
--requires-license 将跳过没有许可证文件的 Package。
--ignore-package <package-identity> 将跳过具有指定标识的 Package。(可以多次重复此选项)
--version 显示版本。
-h, --help 显示帮助信息。

构建工具插件

将此工具添加到您的项目中的最简单方法是使用提供的构建工具插件,该插件可用于 Xcode 项目和 Swift Packages。

对于 Xcode 项目,只需在将此 Package 添加到项目的 Package Dependencies 后,将其添加到 Target 的 Build Phases 选项卡中的 Run Build Tool Plug-ins 部分; 对于 Swift Packages,请在 Package.swift 清单中进行配置,如此处所述。

默认情况下,这将使用带有 --requires-license 的 JSON 输出,但您可以在项目的根目录中创建一个 swift-package-list-config.json 来配置该行为,包括项目和目标特定的行为(目标配置优先于项目配置)。 配置中的所有内容都是可选的,并且具有以下格式

{
    "projectPath" : "Project.xcworkspace",
    "project" : {
        "outputType" : "plist",
        "requiresLicense" : false
    },
    "targets" : {
        "Target 1" : {
            "outputType" : "settings-bundle",
            "requiresLicense" : true
        },
        "Target 2" : {
            "outputType" : "json",
            "requiresLicense" : true,
            "ignorePackages" : [
                "swift-package-list",
                "swift-argument-parser",
            ],
            "customPackagesFilePaths" : [
                "custom-packages.json",
            ]
        }
    }
}

添加和配置后,文件将在每次构建过程中生成,并且可以在应用程序的 bundle 中找到。 然后,您可以手动打开它们,或者使用包含的 Swift Package 中的各种选项。

注意

使用 Xcode Cloud 时,将 defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES 添加到 ci_post_clone.sh,这将禁用插件验证。

运行脚本阶段

您可以轻松地在 Xcode 项目的目标中设置运行脚本阶段,以自动保持 package-list 文件最新

  1. 打开相应的目标,然后单击Build Phases 部分下的加号
  2. 选择New Run Script Phase,然后将以下脚本添加到代码框中
if command -v swift-package-list &> /dev/null; then
    OUTPUT_PATH=$SOURCE_ROOT/$TARGETNAME
    swift-package-list "$PROJECT_FILE_PATH" --output-type json --output-path "$OUTPUT_PATH" --requires-license
else
    echo "warning: swift-package-list not installed"
fi
  1. 将阶段移动到 Copy Bundle Resources 阶段之上
  2. 您可以选择通过双击标题来重命名阶段
  3. 构建您的项目 (cmd + b)
  4. 右键单击侧边栏中的 targets 文件夹,然后选择Add Files to "<project-name>"
  5. 在 Finder 窗口中选择 package-list.json

现在,package-list 文件将在每次构建时更新,并且可以从应用程序的 bundle 中打开。 您可以手动执行此操作,也可以使用 Swift Package 来执行此操作。

Xcode 工作区 (CocoaPods)

如果您有 Xcode 工作区而不是标准的 Xcode 项目,则一切工作原理完全相同,您只需要对运行脚本阶段的脚本进行稍微修改即可

if command -v swift-package-list &> /dev/null; then
    OUTPUT_PATH=$SOURCE_ROOT/$TARGETNAME
    WORKSPACE_FILE_PATH=${PROJECT_FILE_PATH%.xcodeproj}.xcworkspace
    swift-package-list "$WORKSPACE_FILE_PATH" --output-type json --output-path "$OUTPUT_PATH" --requires-license
else
    echo "warning: swift-package-list not installed"
fi

Apple Silicon 上的 Homebrew 故障排除

如果您使用 Homebrew 在 Apple Silicon Mac 上安装了命令行工具,则 Xcode 将无法识别 swift-package-list 命令。 这是因为 Homebrew 使用自己的 /bin 目录,而 Xcode 的 PATH 环境变量不知道该目录。 有 2 种简单的方法可以解决此问题

Mint 故障排除

如果您使用 Mint 安装了命令行工具,则 Xcode 将无法识别 swift-package-list 命令。 这是因为 Mint 使用自己的 /bin 目录,而 Xcode 的 PATH 环境变量不知道该目录。 有 2 种简单的方法可以解决此问题

设置 Bundle

您还可以生成一个 Settings.bundle 文件,以在“设置”应用中显示致谢。 这与其他文件类型的工作方式略有不同,因为设置 Bundle 是多个文件的集合,并且可能已存在于您的应用中。 只需在命令执行时指定 --output-type settings-bundle

重要提示:与其它文件不同,Root.plistRoot.strings 文件只有在不存在时才会被创建,否则会删除现有的配置。 确保您正确设置 Acknowledgements.plist 作为子面板,如下所示

<dict>
    <key>Type</key>
    <string>PSChildPaneSpecifier</string>
    <key>Title</key>
    <string>Acknowledgements</string>
    <key>File</key>
    <string>Acknowledgements</string>
</dict>

有关如何设置和使用设置 Bundle 的更多信息,请参阅 Apple 的文档

PDF

在 macOS 上,更常见的是显示 Acknowledgments.pdf 文件。 因此,您可以选择生成包含所有许可证的 PDF。 只需在命令执行时指定 --output-type pdf

它使用项目的文件名(不带扩展名)作为产品名称,如果存在,则使用项目文件中的 organization-name。 您可以在项目的文件检查器中设置该名称,如此处所示。

创建并添加到项目后,可以像下面这样从应用程序的 bundle 中轻松访问它

import SwiftPackageList

let url = Bundle.main.acknowledgementsURL

然后,您可以使用 QuickLookNSWorkspace.open(_:) 或任何其他方法来显示 PDF。

自定义 Package

要提供带有许可证的自定义 Package 或其他项目,您可以使用 --custom-packages-file-path 选项,并使用以下格式的 JSON 文件

[
    {
        "branch" : null,
        "identity" : "custom-package-example",
        "license" : null,
        "location" : "",
        "name" : "CustomPackageExample",
        "revision" : null,
        "version" : null
    }
]

在此示例中,所有可选字段都具有空值,可以省略,其他字段是必需的。

Swift Package

从 bundle 加载生成的 package-list 文件,或使用一些预构建的 UI 组件。

要求

用法

按照此处所示将 Package 添加到您的项目。

它包含 2 个库; SwiftPackageList 用于加载数据,SwiftPackageListUI 用于获取类似 iOS 设置的用户界面。

SwiftPackageList

import SwiftPackageList

let packageProvider = JSONPackageProvider()
do {
    let packages = try packageProvider.packages()
    // use packages
} catch {
    print(error)
}

SwiftPackageListUI

import SwiftPackageListUI

let acknowledgmentsViewController = SPLAcknowledgmentsTableViewController()
acknowledgmentsViewController.canOpenRepositoryLink = true
navigationController.pushViewController(acknowledgmentsViewController, animated: true)
import SwiftPackageListUI

var body: some View {
    NavigationStack {
        AcknowledgmentsList()
    }
}

本地化

设置 Bundle 和 UI 组件目前已本地化为以下语言

名称 代码
阿拉伯语 ar
简体中文 zh-Hans
繁体中文 zh-Hant
英语 en
法语 fr
德语 de
印地语 hi
意大利语 it
日语 ja
波兰语 pl
葡萄牙语 pt
俄语 ru
西班牙语 es
土耳其语 tr
乌克兰语 uk

如果某种语言有错误或缺失,请随时创建 issue 或打开 pull request。

已知限制

许可证

SwiftPackageList 在 MIT 许可证下可用。 有关更多信息,请参见LICENSE文件。