标签: swiftpm

具有多个目标和共享源的框架

A我有一个包含两个目标(和)的框架,B其文件结构如下:

FooFramework
|__ A
     |__ Foo.swift
     |__ Bar.swift
     |__ Foobar.swift
|__ B
     |__ Barfoo.swift
Run Code Online (Sandbox Code Playgroud)

BA基本上有的源的子集(其中B被设置为目标),例如B仅使用Foo.swiftBar.swift,但不使用Foobar.swift

现在我有一个应用程序需要框架AB(在单独的目标中)。

此时我不确定如何设置Package.swift文件以使此设置起作用。每当我打开Package.swiftinXcode并尝试构建框架时B,编译器都会抱怨 in 中缺少类型Barfoo.swift,因为它们包含在Bar.swift.

这就是我设置Package.swift文件的方式:

// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "Framework",
    platforms: [
        .iOS(.v11),
        .macOS(.v10_15)
    ],
    products: [
        .library(
            name: "A",
            targets: ["A"]),
        .library(
            name: "B",
            targets: ["B"]), …
Run Code Online (Sandbox Code Playgroud)

ios swift swift-package-manager swiftpm

9
推荐指数
0
解决办法
1777
查看次数

带有不安全构建标志的 Swift 包依赖项:目标完整性错误

TL; 博士

尝试在 Xcode 的 iOS 项目中使用本地 Swift 包依赖项时,我收到以下错误:

The package product 'DlibWrapper' cannot be used as a dependency of this target because it uses unsafe build flags.

(我使用不安全标志来指定静态库位置)

我还尝试将该包作为基于远程分支的依赖项导入,但无论如何它都失败了。

根据Swift 论坛上的这篇文章,该问题已在不久前解决,并且已经合并了相应的拉取请求

问题出现在 Swift 5.2.4 (Xcode 11.6) 和 5.3 (Xcode 12 beta 3) 中。

任何线索可能是什么问题?


细节

我正在尝试构建一个包装dlib库并在 iOS 应用程序中使用它的 Swift 包。由于平台原因,我无法使用.systemLibrary目标链接dlib. 所以我在一个静态库中预编译它并与包装器代码打包在一起,如下所示:

DlibWrapper/
  Libraries/
    dlib/
      include/
          ...
      lib/
        arm64/
          libdlib.a

  Sources/
    CWrapper/
      include/
        module.modulemap
        cwrapper.h
      cwrapper.cpp

    SwiftWrapper/
      SwiftWrapper.swift

  Package.swift
Run Code Online (Sandbox Code Playgroud)

的简化内容 …

xcode ios swift dlib swiftpm

7
推荐指数
1
解决办法
1716
查看次数

忽略系统包中声明的目标“swift-nio-zlib-support”

自从升级到 Xcode 12.5 以来,我从 SPM 收到了这个警告(我认为),我有两个问题:

  1. 这是什么意思?
  2. 我能做些什么来解决/隐藏它?

将不胜感激任何回应。我在谷歌上找不到这些问题的好的答案。

xcode ios swift swiftpm

7
推荐指数
1
解决办法
452
查看次数

SwiftPM 中目标的条件依赖

我正在构建一个自定义的 swift 包,它的依赖项之一是一个 xcframework 包(Bugfender),并且仅适用于 iOS(和 Mac Catalyst)。可以理解的是,当我尝试在 Xcode (12.5) 中编译此包时,我收到一条错误,指出无法找到该包的 mac 库(所有 iOS 特定代码都包含在 #if os(iOS) 块中)。

基于此(https://github.com/apple/swift-evolution/blob/master/proposals/0273-swiftpm-conditional-target-dependency.md)除了Swift包规范之外,我想我可以使用一个条件排除 mac 的依赖关系,但是当我尝试以下 Swift.package 文件时,在为 mac 构建时仍然遇到相同的错误。这是一个错误还是我做错了什么?看起来它也应该基于这篇文章工作(Swift package manager: How best to indicates platform dependent code?

// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "GTSApplicationLogging",
    platforms: [
        .iOS(.v12), .macOS(.v10_13),
    ],
    products: [
        // Products define the executables and libraries a package produces, and …
Run Code Online (Sandbox Code Playgroud)

swift swiftpm

7
推荐指数
0
解决办法
1021
查看次数

Swift 包管理器 - 在包的故事板中设置自定义类失败

我正在尝试为 iOS 框架实现对 Swift 包管理器的支持,我们使用该框架在我们的主项目中与 Carthage 链接。该框架的名称是“OptionsSheetKit”

该框架包含外观UIViewController的复制品和具有视图控制器设计的故事板。UIAlertController.sheet

当我从框架内创建视图控制器的实例时,如下所示:

let content = UIStoryboard(name: "OptionsSheet", bundle: .module).instantiateViewController(withIdentifier: PickerViewController.identifier) as? PickerViewController
Run Code Online (Sandbox Code Playgroud)

该应用程序编译并运行,但是所有自定义设置类不再设置,我在 XCode 的调试区域中收到此警告:

2021-02-23 17:19:15.606835+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.607631+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608020+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608378+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface Builder file.
2021-02-23 17:19:15.608776+0200 OptionsSheetKitExample[23732:6479875] [Storyboard] Unknown class _TtC31OptionsSheetKit_OptionsSheetKit19SheetViewController in Interface …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift swift-package-manager swiftpm

5
推荐指数
1
解决办法
912
查看次数

如何使用提供两个库的本地 Swift Package?

我有一个本地 swift 包Foo,它提供了两个不同的库FooFooB。现在我想在另一个本地包Bar 中使用它们。我只能通过路径声明来获取整个包。有没有办法命名/指定应使用哪个库?我想在我的Bar包中使用FooB

let package = Package(
    name: "Foo",
    products: [
        .library(name: "Foo", targets: ["Foo"]),
        .library(name: "FooB", targets: ["FooB"])
    ]

...)
Run Code Online (Sandbox Code Playgroud)
let package = Package(
    name: "Bar",
   dependencies: [
        .package(path: "Foo"),
        .package(path: "FooB") // this one does not work
    ],

...)
Run Code Online (Sandbox Code Playgroud)
// inside package Bar

import Foo
import FooB // this is throwing "no such module 'FooB'"
Run Code Online (Sandbox Code Playgroud)

code-structure swift swift-package-manager swiftpm

5
推荐指数
1
解决办法
865
查看次数

FBLPromise 在 CocoaPods 和 SwiftPM 中崩溃

我们已经从 CocoaPods 迁移有一段时间了,但并不是每个依赖项都进行了转换。就像 Firebase 一样

我对重复符号有类似的问题,但现在我面临着新的问题,这可能是因为我在 SwiftPM 和 CocoaPods 中都使用了依赖项。

运行我的(示例)项目后它崩溃了:

-[FBLPromise firebaseInstallationID]: unrecognized selector sent to instance 0x600003f5a430
Run Code Online (Sandbox Code Playgroud)

顶部有警告:

objc[93047]: Class FBLPromise is implemented in both
/xxx/SampleProject.app/Frameworks/FBLPromises.framework/FBLPromises (0x10b3f09a8) and 
/xxx/SampleProject.app/SampleProject (0x10af736f0).
One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)

在更新到 Firebase SDK v6.26.0 之前,我只会收到第一个警告,但更新后它崩溃了。

我看到了一篇关于如何在库中使用 Firebase 的文档,以及一个关于类似崩溃的GitHub 问题。但除了降级之外,似乎没有什么可以解决这个崩溃问题。

我上传了一个示例项目:https://github.com/basvankuijck/SampleProjectFirebaseCrash

删除 SwiftPM Promises 依赖项不是一个选项,因为实际项目正在使用对 Promises 具有依赖项的 SwiftPM 依赖项。

Podfile并没有那么花哨,SampleProject 仅使用一个SwiftPM 依赖项

谁知道如何让 SwiftPM 和 CocoaPods …

ios cocoapods firebase swiftpm

4
推荐指数
1
解决办法
1969
查看次数

Swift CLI --xunit-output 选项对我不起作用

我正在运行 Xcode 13.1 / Swift 5.5.1。

我有一个包,里面有一些单元测试;该Package.swift文件使用swift-tools-version:5.5.

当我从 CLI 构建和测试我的包时,如下所示:

$ swift test --xunit-output results.xml
Run Code Online (Sandbox Code Playgroud)

测试运行并通过(大约有 20 个),但没有 XML 输出文件写入我的当前目录。

我是否错误地使用了此命令行选项,或者此功能不起作用?

swift swift5 swiftpm

3
推荐指数
1
解决办法
356
查看次数

仅当从 Xcode 运行时,Swift 包调用 /usr/bin/swift 时出现“无法打开 macho 文件...符号链接级别过多”错误

我正在 Swift 中开发一个命令行应用程序,它将调用来swift初始化包、编译东西、测试东西等。我正在使用 swift 包管理器和 Xcode。在我的工具中,我swiftProcess. 如果我从命令行运行我的工具,那么效果很好。但是,如果我从 Xcode 运行我的工具,一些奇怪的事情会打印到标准错误中。特别是,我得到

Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift for reading: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)

是什么原因造成的?有什么方法可以避免它,或者我可以不从 Xcode 运行/测试这个实用程序吗?

以下是重现步骤:

mkdir XcodeRedirectionTest
cd XcodeRedirectionTest
swift package init
open Package.swift
Run Code Online (Sandbox Code Playgroud)

然后在 中Tests/XcodeRedirectionTestTests/XcodeRedirectionTestTests.swift,粘贴

Failed to open macho file at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift for reading: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)

在 Xcode 中测试失败并显示

file://.../XcodeRedirectionTest/Tests/XcodeRedirectionTestTests/XcodeRedirectionTestTests.swift: test failure: XcodeRedirectionTestTests.testExample() failed: XCTAssertEqual failed: ("2021-05-18 19:43:18.084463-0400 swift[2836:4100702] Failed to open macho file …
Run Code Online (Sandbox Code Playgroud)

xcode swift swiftpm

2
推荐指数
1
解决办法
766
查看次数