一个用于获取所有使用的 Swift Package 依赖项的命令行工具。
输出包括所有 Package.resolved
的信息以及检出目录中的许可证。 您还可以生成 JSON、PLIST、Settings.bundle 或 PDF 文件。
此外,还有一个 Swift Package 可以从应用程序的 bundle 中读取生成的 package-list 文件,或者使用预构建的 SwiftUI 和 UIKit 用户界面。
brew tap FelixHerrmann/tap
brew install swift-package-list
mint install FelixHerrmann/swift-package-list
克隆或下载此仓库,然后运行 make install
、make update
或 make uninstall
。
打开终端并运行 swift-package-list <项目路径>
,其中 <项目路径> 是您要生成列表的项目文件的路径。 目前支持以下类型:
*.xcodeproj
用于 Xcode 项目*.xcworkspace
用于 Xcode 工作区Package.swift
用于 Swift PackagesProject.swift
用于 Tuist 项目Dependencies.swift
用于带有 外部依赖项的 Tuist 项目此外,您可以指定以下选项:
选项 | 描述 |
---|---|
--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 文件最新
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
Copy Bundle Resources
阶段之上package-list.json
现在,package-list 文件将在每次构建时更新,并且可以从应用程序的 bundle 中打开。 您可以手动执行此操作,也可以使用 Swift Package 来执行此操作。
如果您有 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
如果您使用 Homebrew 在 Apple Silicon Mac 上安装了命令行工具,则 Xcode 将无法识别 swift-package-list 命令。 这是因为 Homebrew 使用自己的 /bin 目录,而 Xcode 的 PATH 环境变量不知道该目录。 有 2 种简单的方法可以解决此问题
export PATH="$PATH:/opt/homebrew/bin"
作为第一行添加到您的构建脚本ln -s /opt/homebrew/bin/swift-package-list /usr/local/bin/swift-package-list
如果您使用 Mint 安装了命令行工具,则 Xcode 将无法识别 swift-package-list 命令。 这是因为 Mint 使用自己的 /bin 目录,而 Xcode 的 PATH 环境变量不知道该目录。 有 2 种简单的方法可以解决此问题
export PATH="$PATH:$HOME/.mint/bin/"
作为第一行添加到您的构建脚本ln -s $HOME/.mint/bin/swift-package-list /usr/local/bin/swift-package-list
您还可以生成一个 Settings.bundle
文件,以在“设置”应用中显示致谢。 这与其他文件类型的工作方式略有不同,因为设置 Bundle 是多个文件的集合,并且可能已存在于您的应用中。 只需在命令执行时指定 --output-type settings-bundle
。
重要提示:与其它文件不同,Root.plist
和 Root.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 的文档。
在 macOS 上,更常见的是显示 Acknowledgments.pdf
文件。 因此,您可以选择生成包含所有许可证的 PDF。 只需在命令执行时指定 --output-type pdf
。
它使用项目的文件名(不带扩展名)作为产品名称,如果存在,则使用项目文件中的 organization-name。 您可以在项目的文件检查器中设置该名称,如此处所示。
创建并添加到项目后,可以像下面这样从应用程序的 bundle 中轻松访问它
import SwiftPackageList
let url = Bundle.main.acknowledgementsURL
然后,您可以使用 QuickLook,NSWorkspace.open(_:) 或任何其他方法来显示 PDF。
要提供带有许可证的自定义 Package 或其他项目,您可以使用 --custom-packages-file-path
选项,并使用以下格式的 JSON 文件
[
{
"branch" : null,
"identity" : "custom-package-example",
"license" : null,
"location" : "",
"name" : "CustomPackageExample",
"revision" : null,
"version" : null
}
]
在此示例中,所有可选字段都具有空值,可以省略,其他字段是必需的。
从 bundle 加载生成的 package-list 文件,或使用一些预构建的 UI 组件。
按照此处所示将 Package 添加到您的项目。
它包含 2 个库; SwiftPackageList
用于加载数据,SwiftPackageListUI
用于获取类似 iOS 设置的用户界面。
import SwiftPackageList
let packageProvider = JSONPackageProvider()
do {
let packages = try packageProvider.packages()
// use packages
} catch {
print(error)
}
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文件。