现今Swift包中的二进制目标

在北京线咨询治疗白癜风医院 http://www.bdfyy999.com/m/
文章目录了解二进制在Swift中的演化下令行对象关系论断

在iOS和macOS开采中,Swift包如今变得越来越紧急。Apple曾经发奋推进桥接那些漏洞,而且修理那些障碍开采者的题目,比方障碍开采者将他们的库和依赖由其余诸如Carthage[1]或CocoaPods[]依赖经管对象迁徙到Swift包依赖经管对象的题目,比方没有本领增加建设环节的题目。这对任何依赖一些代码生成的库来讲都是毁坏者,譬如,协定和Swift生成。

了解二进制在Swift中的演化

为了充足了解Apple的Swift团队在二进制宗旨和他们引入的一些新API方面选取的一些环节,咱们需求了解它们从何而来。在后续的部份中,咱们将调研Apple架构的演化,以及为甚么二进制目宗旨API在昔日几年中渐渐孕育的,非常是自Apple发表了本身的硅芯片以后。

胖二进制和Frameworks框架

假若你曾一定管教二进制依赖,也许你曾创立一个属于你本身的可实行文献,你将会对胖二进制这个术语觉得相熟。这些被增添(或增大)的可实行文献,是包括了为多个不同架构原生建设的切片。这准许库的通盘者散发一个运转在通盘预期的宗旨架构上的独自的二进制。

当源码不能被泄漏或当管教非常硕大的代码货仓时,预编译库成为可实行文献非常成心义,由于预编译源码以及以二进制文献散发他们,将省俭建设程序在他们的运用上的建设光阴。

Pods[3]是一个非常好的例子,当开采者发掘他们本身没需求建设那些非常少变动的依赖。这是一个很共同的题目,它唆使了诸如cocoapods-binary[4]之类的项目,该项目预编译了pod依赖项以淘汰客户端的建设光阴。

Frameworks框架

嵌入静态二进制文献或者对运用程序来讲曾经充沛了,但假若需求某些资本(如assets或头文献),则需求将这些资本与包括通盘切片的胖二进制文献系缚在一同,孕育所谓的frameworks文献。

这即是诸如GoogleCast[5]之类的预编译库在过渡到行使xcframework停止散发以前所做的事件——下一节将详细引见这类过渡的出处。

到如今为止,一概都很好。假若咱们要为散发预编译一个库,那末胖二进制文献听起来很抱负,对吧?而且,假若咱们需求系缚一些其余资本,咱们也许只行使一个frameworks。一个二进制来统制他们通盘!

XCFrameworks框架

好吧,不完尽是。胖二进制文献有一个大题目,那即是你不能有两个架构雷同但下令/指令不同的切片。这曾经很好,由于配置和模仿器的架构老是不同的,然而跟着AppleSilicon盘算机(M1)的推出,模仿器和配置同享雷同的架构(arm64),但具备不同的加载器下令。这与面向他日的二进制宗旨相联结,恰是Apple引入XCFrameworks[6]的出处。

你也许在BogoGiertler撰写的这篇出色文章中详细相识为iOS配置建设的arm64切片和为M1mac的iOS模仿器建设的arm64切片之间的差别。

XCFrameworks[7]如今准许将多个二进制文献系缚在一同,治理了M1Mac引入的配置和模仿器争执架构题目,由于咱们如今可认为每个用例供给包括关系怀片的二进制文献。究竟上,假若咱们需求,咱们也许走得更远,比方,在统一个xcframework中系缚一个包括iOS目宗旨UIKit接口的二进制文献和一个包括macOS的AppKit接口的二进制文献,而后让Xcode基于希望的宗旨架构决计行使哪一个。

在Swift包中,那先也许以binaryTarget[8]被包括出项宗旨,也许在包中被引入肆意其余宗旨。这雷同的职掌一样实用于frameworks。

下令行对象关系

由于Swift5.6版本中引入了用于Swift保证理器的可增添建设对象[9],是以也许在建设历程中的不同光阴实行下令。

这是iOS社区永远以来始终激烈请求的事件,比方格式化源代码、代码生成乃至搜集公制代码库的目标。Swift5.6中通盘这些所谓的插件[10]终究都需求挪用可实行文献来实行特定职责。这是二进制文献再次在Swift包中介入的处所。

在大大都状况下,关于咱们iOS开采人员来讲,这些对象未来自同时支撑macOS的不同架构切片——AppleSilicon的arm64架洽商IntelMac的x86_64架构。开采者对象如,SwiftLint[11]或SwiftGen[1]恰是这类案例。在这类状况下,也许行使包括可实行文献(内陆或长途)的.zip文献的路途创立新的二进制宗旨。

留心可实行文献一定在.zip文献的根目录下,不然找不到。

ArtifactBundles

到如今为止,下令行对象所采取的法子仅实用于macOS架构。但咱们不能遗忘,Linux机械也支撑Swift包。这象征着假若要同时支撑M1macs(arm64)和Linuxarm64机械,上头的胖二进制法子将不起效用——请记着,二进制不能包括具备雷同架构的多个切片。在这个阶段或者有人会想,咱们也许不光行使xcframeworks吗?不,由于它们在Linux职掌系统上不受支撑!

Apple曾经思索到这一点,除了引入可增添建设对象[13]以外,ArtifactBundles[14]和对二进制目宗旨其余鼎新也做为Swift5.6的一部份发表。

工件包(ArtifactBundles)是包括工件的目录。这些工件需求包括支撑架构的通盘不同二进制文献。二进制文献和支撑的架构的路途是行使清单文献(info.json)指定的,该文献位于ArtifactBundle目录的根目录中。你也许将此清单文献视为一个舆图或指南,以辅助Swift断定哪些可实行文献可用于哪类架构以及也许在何处找到它们。

以SwiftLint为例

SwiftLint[15]在周全社区中被宽广用做Swift代码的静态代码剖析对象。由于良多人都非常希望让这个插件在他们的SwiftPM项目中运转,我觉得这将是一个很好的例子来展现咱们何如将散发的可实行文献从他们的发表页面变为一个与macOS架洽商Linuxarm64兼容的工件包。

让咱们从下载两个可实行文献(macOS[16]和Linux[17])起头。

至此,bundle的组织就也许创立好了。为此,创立一个名为swiftlint.artifactbundle的目录并在其根目录增加一个空的info.json:

mkdirswiftlint.artifactbundletouchswiftlint.artifactbundle/info.json

如今也许行使schemaVersion填充清单文献,这或者会在他日版本的工件包和具备两个变体的工件中产生改变,这将很快界说:

{"schemaVersion":"1.0","artifacts":{"swiftlint":{"version":"0.47.0",#TheversionofSwiftLintbeingused"type":"executable","variants":[]},}}

需求做的末了一件事是将二进制文献增加到包中,而后将它们做为变体增加到info.json文献中。让咱们首先创立目录并将二进制文献放入个中(macOS的一个在swiftlint-macos/swiftlint,Linux的一个在swiftlint-linux/swiftlint)。

增加这些以后,也许在清单文献中变量:

{"schemaVersion":"1.0","artifacts":{"swiftlint":{"version":"0.47.0",#TheversionofSwiftLintbeingused"type":"executable","variants":[{"path":"swiftlint-macos/swiftlint","supportedTriples":["x86_64-apple-macosx","arm64-apple-macosx"]},{"path":"swiftlint-linux/swiftlint","supportedTriples":["x86_64-unknown-linux-gnu"]},]},}}

为此,需求为每个变量指定二进制文献的相对路途(从工件包目录的根目录)和支撑的三元组。假若您不相熟宗旨三元组[18],它们是一种筛选建设二进制文献的架构的法子。请留心,这不是主机(建设可实行文献的机械)的体制组织,而是宗旨机械(该当运转所述可实行文献的机械)。

这些三元组具备下列格式:----并非通盘字段都是定然的,假若个中一个字段未知而且要行使默许值,则也许省略或取代为unknown关键字。

可实行文献的架构切片也许经过运转file找到,这将打印系缚的任何切片的供给商、系统和架构。在这类状况下,为这两个下令运转它会显示:

swiftlint-macos/swiftlint

swiftlint:Mach-Ouniversalbinarywitharchitectures:[x86_64:Mach-O64-bitexecutablex86_64][arm64]swiftlint(forarchitecturex86_64):Mach-O64-bitexecutablex86_64swiftlint(forarchitecturearm64):Mach-O64-bitexecutablearm64

swiftlint-linux/swiftlint

-fileswiftlintswiftlint:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked,interpreter/lib64/ld-linux-x86-64.so.,forGNU/Linux3..0,withdebug_info,notstripped

这带来了上头显示的macOS支撑的两个三元组(x86_64-apple-macosx、arm64-apple-macosx)和Linux支撑的一个三元组(x86_64-unknown-linux-gnu)。

与XCFrameworks近似,工件包也也许经过行使binaryTarget包括在Swift包中。

论断

简而言之,咱们也许归纳0年如安在Swift包中行使二进制文献的最好实际,下列所示:

假若你需求为你的iOS/macOS项目增加预编译库或可实行文献,您该当行使XCFramework,并为每个用例(iOS配置、macOS配置和iOS模仿器)包括独自的二进制文献。假若你需求创立一个插件并运转一个可实行文献,你该当将其嵌入为一个工件包,个中包括实用于不同支撑架构的二进制文献。参考材料[1]

Carthage:


转载请注明:http://www.aierlanlan.com/rzdk/945.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了