问题标签 [module-map]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
35 浏览

json - 破解模块映射以公开文件私有结构?

我正在实现我自己的 JSON 编码器/解码器,即 Swift 的Encoder&Decoder协议。

问题是,我只想覆盖JSONEncoderFoundation 中已经提供的一小部分功能。JSONEncoder,与它的名字相反,它不是真正的 Swift Encoder。相反,它包装了一个 fileprivate 类_JSONEncoder,它实现了所有必需的Encoder功能。

要编写我自己的定制编码器,我可以:

  • 从头开始编写我自己的 JSON 编码器。
  • _JSONEncoder从源本身复制粘贴和修改。

两者都不是特别吸引人的解决方案。编写自己的编码器是一项艰巨而艰巨的任务,我毫不怀疑它会充满错误。_JSONEncoder另一方面,每次对原始源文件进行更新时,复制粘贴迫使我笨拙地检查和移植修复。

我宁愿只_JSONEncoder暴露并包装它的Encoder相关函数,同时根据需要注入我自己的代码。

0 投票
1 回答
1787 浏览

swift - iOS框架中缺少必需的模块

试图制作一个使用伞头文件来使用一些 c 代码的 Swift 框架。但是在示例应用程序中导入它时,它会显示缺少所需模块的警告。我知道它将 module.modulemap 文件的路径指向框架项目,而不是指向实际框架文件中的路径。

如何更改此路径或解决此问题。

TIA

0 投票
0 回答
1212 浏览

ios - 如何创建 Swift 导入子模块

目前我们已经模块化了我们的 Swift 项目,使用了多个目标。目标编译为 .framework 文件,这些文件是更高目标的依赖项。我们有一个 Common 模块目标、几个 Product 模块目标和原始 App 目标。Common 将包含非常低级的代码、共享库以及可能由多个产品目标共享的任何特定代码。

所以应用程序会做:

Product1 目标代码可能会:

通常流程是 Common -> Product* -> App,Common 永远不会引用另一个方向。

不幸的是,Common 已经变得很大,并且有很多代码可能不是每次导入都需要的。

我希望能够在 Swift 中实现的是这样的:

我研究了模块映射,它允许设置导入子模块,但它都集中在 Objective-C 头文件上,而不是 Swift。有快速变化吗?

具体需求是我们想创建一个只使用部分功能的轻量级SDK,并且一旦我们“导入Common”,它就会使SDK膨胀,并且它还增加了对相当多不相关的cocoa-pods的依赖. 我们可以在 SDK 目标文件中逐个文件包含文件,但希望模块化能让事情变得更简单。

编辑

看来我可以使用以下内容:

可能在我的代码中创建部分导入的印象。但是,modulemaps 似乎是 Objective-c 中为您创建子模块的一种方式。我不想编写 100 个类导入来导入子模块在一次导入中可能执行的 200 个文件中的一半。所以还在寻找思路。

0 投票
0 回答
68 浏览

xcode - 如何在 Xcode Playground 中使用 C 模块映射?

我在工作区中有一个 Xcode 操场和项目,因此我可以将这些项目导入操场。

在我尝试导入使用 C 模块映射的项目之前,此设置一直有效。项目本身导入,但我收到诸如error: missing required module 'CNIOAtomics'.

有没有办法在 Xcode 游乐场中导入使用模块映射的 C 模块映射和包?

0 投票
0 回答
960 浏览

c - Swift 编译器错误:找不到“Files.h”文件

我有一个具有以下文件结构的 Xcode 项目:

如果我从目标中删除 MyPlugin.swift,一切都编译得很好。将其添加到目标会输出以下错误:

Swift 编译器错误:找不到“Files.h”文件

内容MyPlugin-Bridging-Header.h很简单:

在搜索路径中可以正确找到它,但是它具有以下行,这sdk.h是发生错误的地方。

我搜索的所有内容都提到了创建一个module.modulemap文件,所以我已经尝试过以下操作,但它不能修复错误:

我目前想知道如果#include我要修复的语句在 sdk.h 中而不是直接在桥接头中,这个模块映射是否会起作用?

附加设置信息:

Xcode 10,Swift 4.2,部署目标:10.9,架构:x86_64

0 投票
1 回答
671 浏览

macos - 如何在模块化 Swift 框架中使用 libproc.h?

我已经遵循了其他 类似 问题的所有步骤,但我仍然被卡住了。

我需要使用函数通过它proc_pidpathlibproc.hPID 获取 BSD 进程的路径。但是,libproc.h它不是模块化标题,所以我不能将它包含在我的伞形标题中:

一行代码读取

很公平; 现在我尝试将它包含在我的模块映射中:

好吧,现在我得到了这个错误呕吐,它似乎认为我的项目中有许多系统模块/头文件:

一长串错误,例如

我不知道还能做什么。就像我说的,我已经尝试按照其他 类似 问题的所有步骤进行操作,但没有成功。在这里可以做什么?我该如何使用proc_pidpath?是否有另一种更 Swift-in-modular-framework 友好的方式从进程 ID 获取路径?

我不想启用“允许框架模块中的非模块化包含”,因为这违背了模块化框架的目的。

0 投票
0 回答
3088 浏览

ios - 未能集成 Swift 和 Objective-C 框架

我正在尝试向现有的基于 Objective-C 的框架添加 swift 支持,并且在将框架集成到应用程序时遇到编译错误(仅框架构建良好)。

我的目标是能够从 swift、Objective-C 项目标头中访问,为了实现这一点,我一直在使用 modulemap 文件来列出所有项目文件,如下所示:http: //nsomar.com/project- and-private-headers-in-a-swift-and-objective-c-framework/

我的目录结构如下:

module.modulemap 文件如下所示:

foo是公开的,barbaz有项目成员资格。如果bar.h包含foo(例如#import "Foo.h"),则构建应用程序将失败并出现以下错误:

知道我做错了什么吗?因为我不确定为什么导入该公共标头会导致这种错误。

0 投票
1 回答
514 浏览

clang - 如何在 .modulemap 中递归添加多个头文件?

例如,这个 .modulemap 有效:

但是这个没有:

那么如何在 .modulemap 中递归添加多个头文件呢?

0 投票
1 回答
3623 浏览

ios - 混合 Objective-C/Swift 框架的模块映射位置和编译器设置

背景:我正在将大型旧混合语言代码库转换为框架。我遇到了问题,所以我想我会从一个最小的测试项目开始,看看事情是如何工作的。我遇到了更多的问题。这是带有 Xcode 10.2.1 的 Swift 5.0。

我创建了一个名为 TestFramework 的新 iOS 框架项目。TestFramework 有以下源文件:

  • OCTest.[hm], 有一个私有类
  • OCPublic.[hm],只有一个公共类。它调用 OCTest。
  • STest.swift,只有一个公共类。它同时调用 OCPublic 和 OCTest。

我还有以下两个伞头,与源文件位于同一文件夹中:

  • TestFramework.h,这是自动创建的一个 Xcode。我只加了#import "OCPublic.h"
  • TestFramework_Private.h. 它有两行:

    /li>

它们都与Xcode 自动创建的所有其他内容TestFramework一起位于该文件夹中。Info.plist

我设法通过carthage build --archive以下模块映射和构建设置在测试应用程序中成功编译、构建框架包并使用生成的框架:

  • TestFramework/module.modulemap存在并且是空的。
  • TestFramework/module.private.modulemap存在以下几行:

    /li>
  • MODULEMAP_FILE和in buildMODULEMAP_PRIVATE_FILE设置都未设置。

  • SWIFT_INCLUDE_PATHS$(PROJECT_DIR)/TestFramework
  • DEFINES_MODULE是真的。

如果我将任何内容 ( framework module TestFramework { … }) 添加到module.modulemap或尝试制作MODULEMAP_FILEMODULEMAP_PRIVATE_FILE指向他们的文件(使用值TestFramework/module.modulemapTestFramework/module.private.modulemap

STest.swift如果我删除空的主模块映射,我会在尝试导入它的地方得到 No such module 'TestFramework_Private' 。

如果我尝试将私有内容移动到单独的文件夹中并进行更改SWIFT_INCLUDE_PATHSMODULEMAP_PRIVATE_FILE则会出现更多构建错误。

* 设置是否有一些MODULEMAP应该起作用的值,在主模块映射中有或没有内容?如果我想将东西移动到不同的文件夹中,我应该怎么做?

0 投票
1 回答
814 浏览

swift - 将模块映射用于 Swift 框架时,OpenSSL 库的非模块化标头

我正在尝试使用 XCode 将 OpenSSL 库静态链接到我的 Swift 框架。网上提到的大多数方法都不正确,因为他们建议使用 Import path ( SWIFT_INCLUDE_PATHS)。结果,框架二进制文件被锁定到文件系统中的特定位置,并且二进制文件本身不可移植。虽然这不是世界末日,但我仍然希望能够通过 Carthage 分发二进制文件,并且遵循上述方法并不能实现这一点。

我尝试使用框架的总括头文件创建自己的模块映射,并将 OpenSSL 库作为显式模块包括在内,遵循以下文章中描述的方法:https ://badootech.badoo.com/bundling-c-library-在-swift-framework-3d9dae950774

这是我的模块映射文件,我将其路径插入到MODULEMAP_FILE构建配置变量中。

其中shim.hfile 是一个头文件,如下所示:

这里的问题是,在尝试编译有关包含非模块化头文件的项目时出现错误。

我试图将所有头文件作为公共头文件(conf.h,evp.h等)包含到 XCode 项目中。但是问题仍然存在,大概是因为它无法使用 header 包含的语法#include <openssl/conf.h>。将包含更改为#include "conf.h"etc. 有效,但是随后将相同样式的头包含与conf.h来自 Open SSL 库的所有其他头文件一起使用,因此这并没有真正的帮助。

我真的不想为了让它工作而修改 OpenSSL 库中的每个头文件,似乎必须有一些更简单的方法来解决这个问题。

有没有办法不必将这些标头包含到 XCode 项目中,以便它们仍然可以使用原始语法#include <openssl/conf.h>

我尝试设置HEADER_SEARCH_PATHS到每个标题的相对路径openssl/conf.h等的路径,但它根本没有帮助。

谢谢。