我正在尝试使用
binaryTarget
将 Swift Package Manager
集成到项目中。该二进制文件是一个 .zip
,其中包含主 ffmpegkit.xcframework
以及它所依赖的 7 个附加 .xcframework
。
这是
DerivedData/.../SourcePackages/artifacts/...
解压后的文件夹结构。
这是我的SPM
文件:
Package.swift
现在,当我构建并运行该项目时,它会崩溃并出现
// swift-tools-version: 5.10
import PackageDescription
let package = Package(
name: "converter",
platforms: [
.macOS(.v13),
.iOS(.v14),
],
products: [
.library(
name: "converter",
targets: ["converter"])
],
targets: [
.target(
name: "converter",
dependencies: [
.target(name: "ffmpeg-iOS", condition: .when(platforms: [.iOS])),
.target(name: "ffmpeg-macOS", condition: .when(platforms: [.macOS]))
],
path: "Sources/converter"
),
.binaryTarget(name: "ffmpeg-iOS",
url: "https://github.com/arthenica/ffmpeg-kit/releases/download/v6.0/ffmpeg-kit-full-6.0-ios-xcframework.zip",
checksum: "c87ea1c77f0a8a6ba396c22fc33e9321befb8e85f8e8103046ddeb74fea66182"),
.binaryTarget(name: "ffmpeg-macOS",
url: "https://github.com/arthenica/ffmpeg-kit/releases/download/v6.0/ffmpeg-kit-full-6.0-macos-xcframework.zip",
checksum: "8cab26eecd43b9389d37f64efaf43b9c6baf4e53614b62e6209d8ee8681b94b9")
]
)
错误,因为构建似乎只包含
dyld[85157]: Library not loaded: @rpath
文件夹,而不包含其他文件夹。即使我在任何代码中都没有ffmpegkit.xcframework
,也会发生这种情况。那么是什么让构建选择添加
import ffmpegkit
框架而不是其他框架呢?如何告诉 SPM 在构建时包含这些附加框架?
---- 更新 ----
我后来找到了一种解决方法,尽管并不理想。我创建了一个新的 GitHub 存储库,其中包含 7 个压缩的
ffmpegkit
文件。我已将它们添加为自己的
.xcframework
中的 .binaryTarget
。现在,只要使用该包,它们就会被下载并安装到应用程序中。然而,原始的 Package.swift
仍然包含 7 个框架,尽管没有使用。所以我还想知道两件事:
ffmpegkit.xcframework
框架而不是其他7个框架?它只是按字母顺序排列的第一个吗?
Q1。我认为 SPM 选择嵌入 ffmpegkit.xcframework 框架而不是其他框架的原因很可能是因为 SPM 将每个 binaryTarget 视为一个独立的框架,并且不会尝试查看 .xcframework 内部来解决任何其他依赖项(例如 libav * 框架)。它仅包含 Package.swift 中指定的主框架。在本例中,ffmpegkit.xcframework 是唯一明确列出的框架,因此也是唯一包含的 SPM。
简而言之!我会说SPM并没有超出直接指定的范围。
Q2。要制作 SPM,只需使用已经打包在一起的所有框架。您需要在 Package.swift 文件中显式声明所有依赖框架,即使它们包含在主 ffmpegkit.xcframework 中。 SPM 不会自行解决这些内部依赖关系,因此您必须将所有必需的 .xcframework 文件作为单独的二进制目标包含在内。
让我举例说明如何修改
ffmpegkit
以包含所有依赖框架
Package.swift
将每个
// swift-tools-version: 5.10
import PackageDescription
let package = Package(
name: "converter",
platforms: [
.macOS(.v13),
.iOS(.v14)
],
products: [
.library(
name: "converter",
targets: ["converter"]
)
],
targets: [
.target(
name: "converter",
dependencies: [
.target(name: "ffmpeg-iOS", condition: .when(platforms: [.iOS])),
.target(name: "ffmpeg-macOS", condition: .when(platforms: [.macOS])),
.target(name: "libavcodec-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libavdevice-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libavfilter-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libavformat-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libavutil-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libswresample-iOS", condition: .when(platforms: [.iOS])),
.target(name: "libswscale-iOS", condition: .when(platforms: [.iOS]))
],
path: "Sources/converter"
),
.binaryTarget(
name: "ffmpeg-iOS",
url: "https://github.com/arthenica/ffmpeg-kit/releases/download/v6.0/ffmpeg-kit-full-6.0-ios-xcframework.zip",
checksum: "c87ea1c77f0a8a6ba396c22fc33e9321befb8e85f8e8103046ddeb74fea66182"
),
.binaryTarget(
name: "ffmpeg-macOS",
url: "https://github.com/arthenica/ffmpeg-kit/releases/download/v6.0/ffmpeg-kit-full-6.0-macos-xcframework.zip",
checksum: "8cab26eecd43b9389d37f64efaf43b9c6baf4e53614b62e6209d8ee8681b94b9"
),
.binaryTarget(
name: "libavcodec-iOS",
url: "<url-to-your-zipped-libavcodec.xcframework>",
checksum: "<checksum-of-libavcodec>"
),
.binaryTarget(
name: "libavdevice-iOS",
url: "<url-to-your-zipped-libavdevice.xcframework>",
checksum: "<checksum-of-libavdevice>"
),
.binaryTarget(
name: "libavfilter-iOS",
url: "<url-to-your-zipped-libavfilter.xcframework>",
checksum: "<checksum-of-libavfilter>"
),
.binaryTarget(
name: "libavformat-iOS",
url: "<url-to-your-zipped-libavformat.xcframework>",
checksum: "<checksum-of-libavformat>"
),
.binaryTarget(
name: "libavutil-iOS",
url: "<url-to-your-zipped-libavutil.xcframework>",
checksum: "<checksum-of-libavutil>"
),
.binaryTarget(
name: "libswresample-iOS",
url: "<url-to-your-zipped-libswresample.xcframework>",
checksum: "<checksum-of-libswresample>"
),
.binaryTarget(
name: "libswscale-iOS",
url: "<url-to-your-zipped-libswscale.xcframework>",
checksum: "<checksum-of-libswscale>"
)
]
)
添加为
.xcframework
:我将 7 个附加框架(binaryTarget
、libavcodec
等)中的每一个作为 libavdevice
包含,并具有自己的 URL 和校验和。