导入Swift Package Manager依赖项时出现“没有这样的模块”错误

97

我正在运行Xcode 11 Beta 4。 我正在使用CocoaPods,并希望将我的依赖项作为静态库而不是框架与Swift Package Manager一起使用。 在使用Xcode 11创建的新项目中,可以成功导入该依赖项,但是在我现有的CocoaPods工作区中,则无法导入。

我认为这可能与此链接警告在Xcode中有关:

directory not found for option '-L/Users/username/Library/Developer/Xcode/DerivedData/App-axanznliwntexmdfdskitsxlfypz/Build/Products/Release-iphoneos

在警告发出后,我去查看目录是否存在,并且确实存在。除了 CocoaPods 的存在之外,我没有找到任何新创建的项目和我的旧项目之间有任何实质性的区别。希望能得到任何指针。


似乎在Xcode 11.3中已经解决。 - Menno
14个回答

210

在使用 Swift Package Manager 添加库(例如 FASwiftUI)后,我需要将其添加到

项目设置 -> 我的目标 -> 常规 -> 框架、库和嵌入内容

才能在导入语句中看到它。

我没有添加任何脚本来使其工作。

输入图像描述信息


12
谢谢。真的帮助我节省了一些时间。 - inexcitus
1
我通过在我的Swift Package的包文件中将“FASwiftUI”添加到依赖项数组中来解决了这个问题。有关更多信息,请参见下面的答案。 - Lucas C. Feijo
我有一个几年前用旧Xcode开始的项目,只有一部分“嵌入式内容”为空,并且不允许添加任何现有软件包。虽然它允许克隆,但是当我克隆时,没有任何新的反应,该部分仍然为空,我无法导入模块。我错过了什么吗?问题可能出在哪里? - ramzesenok
2
总是很有趣,当你遇到某些问题导致速度变慢时,在SO上找到了解决方案,但无法再次点赞,因为你已经点过了。我现在很想给你第二个赞。 - RyuX51

39

解决方案

let package = Package(
    name: "PackageName",
    dependencies: [
       // YOU MUST ADD THE DEPENDENCY BOTH HERE [1] AND BELOW [2]
      .package(url: "https://github.com/mattmaddux/FASwiftUI", from: "1.0.4")
    ],
    targets: [
        .target(
            name: "PackageName",
            /*[2]*/ dependencies: ["FASwiftUI"], // [2] <<<--------- Added here as well
    ]
)

解释

我正在开发一个 Swift 包,必须向导入它的任何人提供 FontAwesome 图标。

在我的 SwiftUI 预览画布中,我遇到了“没有这样的模块 'FASwiftUI'”。

通过将“FASwiftUI”添加到包的依赖数组以及目标本身的依赖数组中,我解决了这个问题。

完整的 Package.swift 文件

// 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: "PackageName",
    platforms: [
        .macOS(.v11),
        .iOS(.v14)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "PackageName",
            targets: ["PackageName"])
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/nalexn/ViewInspector", from: "0.8.1"),
        .package(url: "https://github.com/mattmaddux/FASwiftUI", from: "1.0.4")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "PackageName",
            dependencies: ["FASwiftUI"], // <<<--------- Added this here
            resources: [
                .process("Assets")
            ]
        ),
        .testTarget(
            name: "PackageNameTests",
            dependencies: ["PackageName", "ViewInspector"])
    ]
)

谢谢,这正是我在谷歌搜索时遇到的问题! - hesselbom
我无法向Package.swift文件中添加任何内容--它似乎是只读的。 - benwiggy
这意味着您正在尝试编辑 Xcode 为您作为依赖项检出的存储库,它应该是只读的。如果您无法访问要更改的 lib 的存储库,则可以 fork 它。 - Lucas C. Feijo
找到这个信息花了太多时间在谷歌上搜索。我相信它已经被记录在某个地方,但我不记得在其他任何地方看到过。感谢您的发布。 - Josh Hudnall
3
您可能需要将其添加为:.product(name: "FASwiftUI", package: "-无论包的名称是什么-").target dependencies而不仅仅是作为“FASwiftUI”。 - P. Ent

34

事实证明,Swift Package Manager 隐式依赖于项目的配置名称。我将它们命名为live/qa而不是Release/Debug,改回来后问题得到解决。非常奇怪,但我希望这能为您节省一些麻烦,亲爱的读者。


哦,亲爱的,我希望苹果在我们退出Xcode 11测试版后能够解决这个问题。 - Binkan Salaryman
3
这是一个已知的苹果Xcode问题。详情请参见https://forums.swift.org/t/custom-build-configuration-names/29167。 - sliwinski.lukas
谢谢!将配置名称从“Production”更改回“Release”解决了我的问题。 - Manny
2
这在 Xcode 15 beta 1 上仍然是一个问题。 - William Grand
1
这也是Xcode 14的问题。 - IBAction
显示剩余3条评论

33
根据@AlexandreMorgado的回答,似乎最好在编译源代码之前的Build阶段运行此脚本。然后它可以在归档时正常工作。

在这里输入图片描述

if [ -d "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" ] && [ "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" != "${SYMROOT}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/" ] 
then
  cp -f -R "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" "${SYMROOT}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/"
fi

1
我已经更新了脚本,以在复制之前检查Release文件夹是否存在,以避免编译期间出现错误消息(当您构建Debug构建配置时可能会出现这种情况)。 - sliwinski.lukas
请注意,这似乎会破坏软件包的构建配置:一旦它们已经为“发布”配置构建,即使您想进行“调试”构建,也会使用该构建(直到您清理该项目)。 - Christian Schnorr
2
请注意在“编译源代码之前”的步骤,否则它将无法正常工作。 - jomafer
5
很遗憾,这个解决方案似乎在Xcode 11.3.1上不起作用。 - Vin Gazoil
您遇到了什么问题?对我来说它仍然有效。 - sliwinski.lukas
3
提示:没有“XXX”模块。 - Vin Gazoil

13

经过一整个星期的奋斗,我使用了方案和预处理操作来开发一种解决方法。

我有一个名为“Beta”的配置,因此Xcode无法编译SPM依赖项。 我意识到Xcode将SPM依赖项编译为Swift模块,并将文件添加到DeriverData中Build / Products / Release-iphoneos文件夹中。

因此,我在Xcode中创建了一个方案,并在构建前操作中添加了这个运行脚本:

enter image description here

cp -f -R "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" "${SYMROOT}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/"

在构建过程之前,此脚本会将 Xcode 默认生成的 Release-iphoneos 文件夹中的文件和模块复制到我的情况下的 Beta-iphoneos 配置文件夹中。

从 Release-iphoneos 复制内容到 $configuration$-iphoneos 文件夹后,Xcode 应该可以正确编译、构建和运行您的项目。


我创建了一个新环境,例如分期付款,遇到了上述问题。你有任何解决方案吗?兄弟。 - logan.Nguyen
@logan.Nguyen,你尝试重新构建了吗?有时候这个解决方法第一次会失败,因为编译过程可能在文件被复制之前执行,但是当你再次运行它时,它就可以工作了。 - alemorgado
这对我有用。谢谢!但是在创建存档时它没有起作用。还有,在添加预操作到存档阶段时也是如此。您可能有解决这个问题的想法吗? - Menno
@Menno,我没有使用这种方法进行归档测试。但是sliwinski.lukas刚刚发布了一种替代方法来解决这个问题。 - alemorgado
1
请记住,这已经确认是Xcode的一个bug,正如在我的原始答案评论中所看到的那样。因此,我建议您牢记这一点,并密切关注修复程序,以便消除任何解决方法。 - Adar Hefer

7
我遇到了类似的问题,发现我的方案引用了旧的配置,而这些配置已经不存在了。一旦我更新为正确的配置,构建就成功了。
(我在原始帖子发布后一年多才留下这个评论。可能我遇到的问题与最初报告的问题完全不同。但是,我花了相当长的时间来跟踪问题,所以我想留下一条注释,可能可以节省其他人的时间。)

2

根据@sliwinski.lukas的回答,在我的情况下,${CONFIGURATION}输出了“Release”,因此它只是复制了Release文件夹本身,这是无用的。我简单地硬编码了我的配置名称,并翻转了Release和MyConfiguration,然后它就起作用了。我在“Build Phases”选项卡中的“Compile Sources”之前放置了以下代码:

cp -f -R "${SYMROOT}/MyConfiguration${EFFECTIVE_PLATFORM_NAME}/" "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" || true

同样重要的是,我必须将其添加到使用SPM的项目中,而不是主应用程序中。


2

我的解决方法:我删除了import WebMIDIKit这行代码,然后再次添加。


2
清除派生数据解决了我的问题。我使用的是 Microsoft Azure Devops CI Pipeline。要清除派生数据,必须编辑 Xcode 构建任务,并在“Actions”字段中添加此命令:clean。请注意保留 HTML 标签。

1
我刚在命令行运行xcodebuild时遇到了类似的问题。我传递了CONFIGURATION_BUILD_DIR=build,但发现它需要是一个绝对路径CONFIGURATION_BUILD_DIR=$(pwd)/build解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接