Flutter 正在迁移到 Swift Package Manager ,未来会弃用 CocoaPods 吗?

news2024/9/20 10:26:10

什么是 Swift Package Manager ?其实 Swift Package Manager (SwiftPM) 出现已经挺长一段时间了,我记得第一次听说 SwiftPM 的时候,应该还是在 2016 年,那时候 Swift 3 刚发布,不过正式出场应该还是在 2018 年的 Apple 的 WWDC 上。

但是其实这么多年过去了,在社区接触上,其实感觉 SwiftPM 的铺开程度还是比较局限,我觉得这也和 Swift 本身的推广效果有关系, 在 stackoverflow 2024 的数据报告里可以看到, Swift 目前的地位还是略显尴尬

那为什么在已经有成熟 CocoaPods 的情况下,Apple 还要多搞一个 Swift Package Manager ?其实我理解核心还是推广 Swift ,毕竟用 Swift 写 SwiftPM 来管理 Swift Package ,一听就很合理

就像 Android,在有 Groovy/Gradle 的情况下,开始推广用 Kotlin 的 kts 来写构建脚本 ,Kotlin First ,很合理。

当然,Swift Package 本身能更好的做一些拓展和封装,发布也更方便,并且和 Xcode 集成更舒适,作为「迟来」的亲儿子,肯定还是具有一些优势。

SwiftPM 作为 Swift 工具链中的一部分,同时也包含在 Xcode 中,所以使用 Swift 比起 CocoaPods ,不需要额外的第三方环境 。

Swift Package 不使用 .xcodeproj.xcworkspace ,而是依赖其文件夹结构,并使用 Package.swift 进行配置,结构也更简单,例如:

  • // swift-tools-version:5.3 :必须存在的版本信息

  • name: 库名称

  • products: 库编译后对象,生成可执行文件或者 Library

  • dependencies: 依赖的库,依赖库的 URL 和版本等,还可以依赖本地库如 .package(path:)

  • targets: 包的基本构建目标,target 可以定义模块或测试模块,另外 target 可以依赖于该包中的其他 target 和 Package 依赖的 Library,也可以多 target 。

// swift-tools-version:5.3
import PackageDescription


let package = Package(
    name: "MyLibrary",
    platforms: [
        .macOS(.v10_14), .iOS(.v13), .tvOS(.v13)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary", "SomeRemoteBinaryPackage", "SomeLocalBinaryPackage"])
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
    ],
    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: "MyLibrary",
            exclude: ["instructions.md"],
            resources: [
                .process("text.txt"),
                .process("example.png"),
                .copy("settings.plist")
            ]
        ),
        .binaryTarget(
            name: "SomeRemoteBinaryPackage",
            url: "https://url/to/some/remote/binary/package.zip",
            checksum: "The checksum of the XCFramework inside the ZIP archive."
        ),
        .binaryTarget(
            name: "SomeLocalBinaryPackage",
            path: "path/to/some.xcframework"
        )
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]),
    ]
)

是不是结构也很简单?

其实采用 SwiftPM 还有其他好处,那就是可视化支持,例如在 add Package 的时候,可以看到官方支持的一些 Packages 的情况和依赖方式。

另外一些第三方包,例如 firebase ,可以把库的 https 的 git 链接放到搜索框,就可以在 Xcode 看到和添加对应的第三方依赖情况,至于你问我为什么用这么抽象的方式?因为我也不知道图 2 的方式为什么会无法正常被添加。

那 SwiftPM 有什么缺点吗?其实还是有的,除了社区 Package 对比 CocoaPods 少太多之外,目前就是单个 target 不能将 Swift 和 C 系列语言混合使用,也就是 target 可以包含 Swift、Objective-C/C++ 或 C/C++ 代码,但单个 target 不能将 Swift 与 C 系列语言混合使用

是的,其实在 Swift Package Manager 里可以单独使用 OC,所以你旧的 OC Package 也可以迁移到 SwiftPM ,只要选择符合规格就行,例如需要 header 的 publicHeadersPath 指定,不配置时,默认是目录下的 include 路径。

所以如果存在混编,SwiftPM 肯定会是多 target 依赖,这时候如果你的库想要支持 CocoaPods 和 SwiftPM 双平台发布,如果是存在那么你可以需要对整个项目的结果和引用方式做一些调整,甚至添加一些 swiftSettings: [.define("IS_SwiftPM")] 这样的宏配置,然后在代码里通过 #if IS_SwiftPM 的方式去对如 import 等操作做区分。

其实我个人也不喜欢混编,因为这样可能会带来一些很奇葩的场景,例如:

  • Library B 使用 OC 写的,依赖了 Swift 写的 Library A
  • 然后 Library C 用 Swift 写的,又依赖了 OC 写的 Library B
  • 在 CocoaPods 场景下,混编都折腾出不少问题,例如曾经的《Flutter iOS OC 混编 Swift 遭遇动态库和静态库问题填坑》

但是现实历史场景下,混编又是很常见的需求,所以目前也存在 swiftlang#5919 在讨论的 support for targets with mixed language sources ,只是还没落地就是:

例如 React Native ,因为不支持混编的原因,在 SwiftPM 的推进上很慢,另外也有人给 CocoaPods 提了 PR#743,希望通过在 CocoaPods 增加 SwiftPM_dependency 的做法来让 CocoaPods 支持 SwiftPM ,不过目前 SwiftPM 貌似还不支持运行预处理命令,所以没办法对纯 C++ 包进行一些预处理。

甚至对于 RN 没支持 SwiftPM 这件事情下,也有一些人颇有微词,但是其实迁移到 SwiftPM 本身的成本确实不低,特别是对于 RN 本身来说。

在知道了 Swift Package Manager 的一些简单情况后,而回到本文主题上,既然迁移成本那么高,为什么 Flutter 还要迁移到 SwiftPM

Flutter 其实很早就在将自己的 Package 下的插件迁移到 Swift 上,而目前也在开始推进 SwiftPM 的迁移,这对于 Flutter 来说,好处就是:

  • Flutter 的 Plugin 可以更贴近 Swift 生态

  • 简化 Flutter 安装环境,Xcode 本身就是包含 SwiftPM,如果 Flutter 的项目使用 SwiftPM,则完全无需安装 Ruby 和 CocoaPods 等环境(从 Flutter Team 提到的这里预期, Flutter 未来计划弃用 CocoaPods 的可能性很大)

而从目前的官方 Package 上看,#146922 上需要迁移支持的 Package 大部分都已经迁移完毕,剩下的主要文档和脚本部分的支持。

从 Flutter 官方的角度,它肯定希望 Flutter CLI 可以在升级后自动将项目迁移到 SwiftPM 支持,而目前关于 SwiftPM 相关部分尝试,还需要在 main 分支下进行预览。

目前看来, SwiftPM 对于项目工程的修改,很大程度是比较不可逆,所以如果 Flutter CLI 无法一键升级的情况下,自己手动调整也挺麻烦的 ,更多可见:https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-app-developers

不过官方的迁移速度不是重点,重点还是 pub 上将近 10,000 多个 iOS 和 macOS 插件,他们是否能顺序迁移到 SwiftPM ,才是这次迁移里的核心重点。

要之前,Apple 今年开春的 Privacy Manifest 问题就已经把社区插件搞了一遍,而 SwiftPM 对比 Privacy Manifest 得难度只会更高。

那为什么说 Flutter 最终会会选择弃用 CocoaPods,前面介绍过,兼容两者可能带来一些昂贵的额外维护成本,并且相比较于 CocoaPods,Flutter Team 目前更看好 Swift 和 SwiftPM 。

所以基本可以看到,目前 Flutter 的整体都在往 SwiftPM 迁移,但是维护两套依赖管理方案肯定不是明智之举,具体原因我们前面也聊过,所以从我个人角度看,按照 Flutter 的尿性,只要 SwiftPM 正式落地,弃用 CocoaPods 的通知也就不远了

不过也不用担心,从目前看来,SwiftPM 的落地还有挺长一段时间要走,例如 Add to App 场景的支持就是一个问题,因为 SwiftPM 没有像 CocoaPods 那样将包转换为 xcframework 的方法,同时 SwiftPM 需要知道在哪里找到框架,不然它就无法正常解析。

所以如果你还没使用或者迁移到 SwiftPM, 可以考虑先了解或者尝试下,整体体验式其实 SwiftPM 确实比如 CocoaPods 优秀,并且更轻巧简便,所以我个人还是希望 SwiftPM 可以在 Flutter 上早日落地,毕竟讨厌 OC 和 CocoaPods 不是很正常吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信

文章目录 前言 背景介绍 SCI通信 Transmitter Receiver SCI中断 分析和应用 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 背景介绍 近期使用TI C2000 DSP做的一个嵌入式系统开发项目中,在使用它的SCI&…

缓存异常:缓存雪崩、击穿、穿透

缓存异常:缓存雪崩、击穿、穿透 缓存雪崩 定义 大量的应用请求无法在 Redis 缓存中进行处理,会将这些请求发送到数据库,导致数据库的压力激增,是发生在大量数据同时失效的场景下 原因 1. 缓存中有大量数据同时过期&#xff0…

常见中间件漏洞复现之【Apache】!

CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者…

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢&#xff1f;机…

实操: 如何在AirBox上跑Stable Diffusion 3

以下文章来源于Radxa &#xff0c;作者瑞莎 Stable Diffusion 3 Medium 是一种多模态扩散变换器 (MMDiT) 文本到图像模型&#xff0c;在图像质量、排版、复杂提示理解和资源效率方面具有显著提升的性能。 目前瑞莎团队使用 Stable Diffusion 3 Medium 开源模型&#xff0c;通过…

领域驱动设计实战:使用Wow框架重构银行转账系统

银行账户转账案例是一个经典的领域驱动设计&#xff08;DDD&#xff09;应用场景。 接下来我们通过一个简单的银行账户转账案例&#xff0c;来了解如何使用 Wow 进行领域驱动设计以及服务开发。 银行转账流程 准备转账&#xff08;Prepare&#xff09;&#xff1a; 用户发起…

24/8/6算法笔记 不同核函数

import numpy as np from sklearn import datasets from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt 加载数据 X,ydatasets.load_wine(return_X_y True) d…

python中的turtle库(适用于计算机二级)

窗体函数 turtle.setup(width,height,startx,starty) width:窗口宽度 height:窗口高度 startx&#xff1a;窗口与屏幕左侧的距离 starty&#xff1a;窗口与屏幕顶部的距离 常用的引进turtle方法 # 引入turtle import turtle# 引入turtle库中的所有函数 from turtle import *# …

如何使用AI提问提示词(Prompt):让你的提问回答更有效

现在AI模型在日常工作和生活中的应用越来越广泛&#xff0c;无论是生成文本、回答问题&#xff0c;还是进行对话互动&#xff0c;提示词&#xff08;Prompt&#xff09;在与AI交互时起着至关重要的作用&#xff0c;一个好的提示词可以引导AI生成更加准确、有价值的内容。 那么…

【简历】宜春某二本学院:Java简历指导,秋招简历通过率低

简历说明 这是一个25届的二本宜春某学院的这个Java简历&#xff0c;今天看了两个简历&#xff0c;包括前面个985的&#xff0c;也是12306&#xff0c;这个12306已经烂大街&#xff0c;是个人都知道这个项目了&#xff0c;所以不要放在简历上&#xff0c;你不管大厂中厂还是小公…

力扣——11.盛最多水的容器

题目 暴力解 思路&#xff1a; 遍历每一个可能组成的容器&#xff0c;然后计算比较最大值。 代码&#xff1a; int maxArea(vector<int>& height) {int z1 0, z2 0;int len height.size();int val 0;for (z1; z1 < len - 1; z1) {for (z2 z1 1; z2 < l…

5分钟0基础快速上手亚马逊云科技AWS核心云开发/云架构知识 - 利用S3桶托管网页静态资源

简介&#xff1a; 小李哥从今天开始将开启全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家0基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构。 我将每天介绍一个基于亚马逊云…

Day-16 SpringBoot原理

SpingBoot原理 在前面十多天的课程当中&#xff0c;我们学习的都是web开发的技术使用&#xff0c;都是面向应用层面的&#xff0c;我们学会了怎么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇&#xff0c;主要偏向于底层原理。 我们今天的课程安…

AppBoot:像 Django 一样使用 FastAPI

App Boot 开发 AppBoot 的背景是我一直没能寻找到满意的 FastAPI 项目模板。相比之下&#xff0c;Django 的项目结构和开发方式一直深得我心&#xff0c;因此我决定创建一个类似 Django 的 FastAPI 项目模板。 AppBoot 完全采用异步模式&#xff0c;内置 SQLAlchemy 2.0&…

Debian | Vscode 安装与配置 C 环境

Debian | Vscode 安装与配置 C 环境 安装 vscode sudo apt update sudo apt install software-properties-common apt-transport-https curlcurl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -sudo add-apt-repository "deb [archamd64…

Golang | Leetcode Golang题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; import "math/rand" // 默认导入的 rand 不是这个库&#xff0c;需要显式指明type node struct {ch [2]*nodepriority intkey intdupCnt intsz int }func (o *node) cmp(b int) int {switch {case b < o.k…

独家探讨BIGO ads投放海外休闲游戏广告优势

在探讨BIGO投放海外休闲游戏广告的优势时&#xff0c;不得不提的是其全球化的战略布局与强大的技术支撑。BIGO作为深耕海外市场的先行者&#xff0c;已经构建了覆盖全球多个国家和地区的用户网络&#xff0c;这为休闲游戏广告的广泛传播提供了得天独厚的条件。通过精准定位不同…

ARM 汇编语言基础

目录 汇编指令代码框架 汇编指令语法格式 数据处理指令 数据搬移指令 mov 示例 立即数的本质 立即数的特点 立即数的使用 算术运算指令 指令格式 add 普通的加法指令 adc 带进位的加法指令 跳转指令 Load/Store指令 状态寄存器指令 基础概念 C 语言与汇编指令的关…

日志和守护进程

日志 //日志就是服务器在运行的时候要定期的把执行痕迹保留下来 #pragma once #include <iostream> #include <string> #include <cstdio> #include <cstring> #include <ctime> #include <cstdarg> #include <sys/types.h> #inclu…

XFS寻址模拟

XFS寻址 XFS 大部分时候都会用绝对地址&#xff0c;即包含AG信息和相对AG偏移量的信息&#xff0c;但有些时候会使用相对地址“相对AG的偏移量” [rootip-172-31-35-68 ~]# xfs_db -r /dev/nvme1n1 xfs_db> sb 0 xfs_db> p magicnum 0x58465342 blocksize 4096 dbloc…