【问题标题】:Getting 'no such module' error when importing a Swift Package Manager dependency导入 Swift 包管理器依赖项时出现“没有这样的模块”错误
【发布时间】:2019-12-01 14:17:56
【问题描述】:

我正在运行 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 中解决了

标签: xcode11 swift-package-manager


【解决方案1】:

通过 Swift 包管理器添加库(在我的例子中为 FASwiftUI)后,我必须将其添加到

项目设置 -> 常规 -> 我的目标 -> Frameworks, Libraries, and Embedded Content

在导入语句中可见。

我没有添加任何脚本让它工作。

【讨论】:

  • 谢谢。真的帮我节省了一些时间?
  • 我通过将“FASwiftUI”添加到我的 Swift 包的包文件中的依赖项数组来解决它。请参阅下面的答案以获取更多信息。
  • 最佳答案,谢谢
  • 你救了我,伙计。
  • 我有一个几年前开始使用旧 Xcode 的项目,我只有一个“嵌入式内容”部分是空的,不允许添加任何现有的包。它允许克隆。但是当我克隆它时,没有任何新的事情发生,该部分仍然是空的,我无法导入模块。有什么我想念的吗?可能是什么问题?
【解决方案2】:

根据@AlexandreMorgado 的回答,似乎最好在编译源之前在构建阶段运行此脚本。然后它在归档时工作。

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

【讨论】:

  • 我已经更新了脚本,在复制之前检查Release文件夹是否存在,以避免编译过程中出现错误消息(在构建Debug构建配置时可能会出现这种情况)
  • 请注意,这似乎弄乱了包的构建配置:一旦为发布配置构建了它们,即使您想进行调试构建也将使用它! (直到你清理项目)
  • 注意“编译源之前”,否则不起作用。
  • 不幸的是,这个解决方案似乎不适用于 Xcode 11.3.1。
  • 它说'没有这样的模块“XXX”'。
【解决方案3】:

事实证明,Swift 包管理器隐含地依赖于项目的配置名称。我将它们放在 live/qa 而不是 Release/Debug,然后将它们改回来解决了这个问题。很奇怪,但我希望它可以为您节省一些麻烦亲爱的读者。

【讨论】:

  • 天哪,我希望苹果在 Xcode 11 测试版结束后解决这个问题。
  • 我仍然可以在 Xcode 11 (11A420a) 中看到这一点,即“实时”版本。有人可以确认这种行为吗?
  • 我也有同样的问题:/
  • 这是已知的苹果 Xcode 问题。 forums.swift.org/t/custom-build-configuration-names/29167
  • 这在 Xcode 15 beta 1 上仍然是一个问题
【解决方案4】:

在解决这个问题整整一周后,我开发了一种使用方案和预操作的解决方法。

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

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

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

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

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

【讨论】:

  • 我创建了一个新的环境,例如 staging 并且有上述问题。你有什么解决办法吗?兄弟
  • @logan.Nguyen,您是否再次尝试构建?有时这种解决方法第一次会失败,因为编译过程可以在文件被复制之前执行,但是当你再次运行时它会起作用。
  • 这对我有用。谢谢!但是,在创建存档时却没有。在将预操作添加到存档阶段时也是如此。您是否也知道如何解决这个问题?
  • @Menno,我没有用这种方法测试存档。但是 sliwinski.lukas 刚刚发布了解决此问题的替代方法。
  • 请记住,这已被确认为 Xcode 错误,可以在对我原始答案的评论中看到。因此,我会牢记这一点并密切注意修复,以消除任何变通方法。
【解决方案5】:

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

我的 SwiftUI 预览画布中出现“没有这样的模块 'FASwiftUI'”。

我通过将“FASwiftUI”添加到包文件中的依赖项数组中来解决它,如下所示:

// 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"])
    ]
)

【讨论】:

    【解决方案6】:

    我刚刚遇到了一个类似的问题,发现我的方案引用了旧配置,不再存在的配置。一旦我将它们更新为正确的配置,构建就会成功。

    (我在原帖发布一年多后才发表此评论。我遇到的可能与最初报告的完全不同。不过,我花了很长时间才找到问题所在,所以我想留个便条,可能会节省其他人的时间。)

    【讨论】:

      【解决方案7】:

      清除派生数据解决了我的问题。我有 Microsoft Azure Devops CI 管道,要清除派生数据,我必须编辑 Xcode 构建任务并在“操作”字段中添加以下命令:clean

      【讨论】:

        【解决方案8】:

        什么对我有用:我删除了我的 import WebMIDIKit 行并再次添加。

        【讨论】:

          【解决方案9】:

          根据@sliwinski.lukas 的回答,在我的情况下,${CONFIGURATION} 正在输出“Release”,所以它只是在复制 Release 文件夹本身,这并不好。我只是硬编码了我的配置名称,然后翻转了 Release 和 MyConfiguration,它就起作用了。我将以下代码放在“构建阶段”选项卡中的“编译源”之前:

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

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              为了保持增量构建工作,我必须指定“修复 SPM”构建阶段的输出文件,如下所示:

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-11-09
                • 2022-01-28
                • 2022-10-22
                • 1970-01-01
                • 1970-01-01
                • 2016-03-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多