SPM 二进制目标,不包括其他框架

问题描述 投票:0回答:1

我正在尝试使用

binaryTarget
Swift Package Manager
集成到项目中。该二进制文件是一个
.zip
,其中包含主
ffmpegkit.xcframework
以及它所依赖的 7 个附加
.xcframework

这是

DerivedData/.../SourcePackages/artifacts/...
解压后的文件夹结构。
Unzipped folder showing the 8 frameworks
这是我的

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 个框架,尽管没有使用。
所以我还想知道两件事:

    是什么让SPM选择嵌入
  1. ffmpegkit.xcframework

    框架而不是其他7个框架?它只是按字母顺序排列的第一个吗?

    
    

  2. 如何让SPM只使用所有已经打包在一起的框架?
ios swift xcode ffmpeg swift-package-manager
1个回答
0
投票

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 和校验和。
    

© www.soinside.com 2019 - 2024. All rights reserved.