iOS项目环境搭建和依赖管理

一个项目总是会依赖一些库, 有些是第三方的, 有些可能是项目自身为了复用拆出去的.
现有主流的iOS依赖有多种形式, 比如CocoaPods, Carthage和swift package.

本文是一些环境搭建和使用项目依赖相关的笔记.

全局环境准备

基本上iOS开发都要准备的环境, 这些设置是全局的, 在每个机器上设置一次就行. (本文为mac环境).

homebrew: (已有可跳过)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

rbenv

rbenv是一个管理ruby版本的工具, 如果同一个机器上有多个代码库, 可以用它来灵活切换ruby在不同项目中的版本.

具体可以看一下项目介绍: https://github.com/rbenv/rbenv

setup ruby (这里选一个全局的版本号, 可根据具体情况更改):

brew install rbenv ruby-build
rbenv install 3.1.3
echo "export PATH=\"/opt/homebrew/bin/rbenv:\$PATH\"" >> ~/.zshrc
echo "eval \"\$(/opt/homebrew/bin/rbenv init -)\"" >> ~/.zshrc
source ~/.zshrc
rbenv global 3.1.3

验证安装成功:

ruby -v
//得到刚刚指定的版本
which ruby
//得到目录: $HOME/.rbenv/shims/ruby

Bundler和CocoaPods

Bundler(https://bundler.io/)和CocoaPods(https://cocoapods.org/)都是dependency manager.

它们管理的依赖种类不同.

Bundler用来下Ruby gems, 即Gemfile中的依赖.

CocoaPods用来下pod, 即Podfile中写的pods依赖.

但cocoapods本身是一个ruby gem, 所以它被bundler管理.

(可以想象bundler是大经理, cocoapods是小领导, 此处可以画一个树形图表示, 如果我记得的话.) (但是我突然决定不画了, 因为懒.)

iOS世界中还有一个著名的ruby gem是fastlane, 本文并不涉及就不展开讲了.

我们先把这两个工具安装到电脑上:

gem install bundler
gem install cocoapods
pod setup

Optional

你可能还需要的格式化工具:

brew install swiftformat

已有项目的配置

我们拿到一个新项目后往往需要拉它的依赖.

如果你的项目中有Gemfile文件

bundle install

之后发现还有Podfile文件:

bundle exec pod install

这些命令是每个项目都需要执行的, 当项目依赖变更时需要重新执行这些:

bundle install
bundle exec pod install

M1电脑可能需要配置:

bundle config build.ffi --enable-system-libffi
bundle config set --local path 'vendor/bundle'
// 这个命令运行完之后当前目录下会多出一个`.bundle/`文件夹.

命令行中的工作就基本做完了, 剩下打开xcode, 如果还有swift package xcode会帮你解析的.

CocoaPod

这里以CocoaPod为例讲一下如何添加使用一个CocoaPod库, 以及相关的文件.

安装cocoapods这一步我们在之前setup环境的时候已经跑过了:

gem install cocoapods
pod setup

每一个机器只要跑一次就行, 可以跳过.

CocoaPods有一个公开的specifications repo:

https://github.com/CocoaPods/Specs

这是一个中心化的代码仓库, 比较流行的库都放在上面.

官网是: https://cocoapods.org/

在这里可以搜索任何你想要的cocoapods库.

使用一个公开的库

让我们拿一个比较流行的库试试: https://github.com/Alamofire/Alamofire

首先在项目的根目录run:

pod init

会创建一个Podfile. (如果项目中已经存在了会报错.)

这个文件名是固定不变的.

用xcode打开这个文件:

open -a Xcode Podfile

里面的内容是这样: (这里UsePublicCocoaPods是我的项目名)

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'UsePublicCocoaPods' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for UsePublicCocoaPods
end

我们在这里加上一行, 用上Alamofire的最新版本:

target 'UsePublicCocoaPods' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for UsePublicCocoaPods
pod 'Alamofire', '5.6.4'
end

然后:

bundle exec pod install

(这里如果遇到问题, 记得在项目目录中跑bundle config set --local path 'vendor/bundle').

安装完成之后会产生一些diff.

  • 项目下多了Pods文件夹. (应该被ignore)
  • 多了Podfile.lock文件. (不应该被ignore)
  • UsePublicCocoaPods/UsePublicCocoaPods.xcworkspace/UsePublicCocoaPods/UsePublicCocoaPods.xcodeproj/project.pbxproj 都有改变.

这里需要检查一下.gitignore的配置.

然后就可以在代码里import Alamofire并使用它的代码了.

Dependency management tools

iOS中有多种依赖管理工具类型:

  • CocoaPods
  • Carthage
  • Swift package manager

CocoaPods

CocoaPods
比较老的依赖类型, 但是很多项目仍然在用.

Carthage

Carthage
build出来的是字节码, 一般也叫framework.

Swift package manager

swift-package-manager
比较新的依赖管理类型, 一般在Xcode的UI界面里操作.
本文就不介绍了.

项目结构和其他Trouble Shooting

Files and folders

Xcode是一个神奇的IDE, 它的文件夹叫”Group”.
在其中的文件分为”物理上存在”和”引用上存在”两种情况.

  • 删除文件的时候会问你只是删了引用(仅在Xcode里看不见)还是要进一步删了这个文件(物理上也删除).
  • 添加文件的时候仅仅拷贝到文件目录里是不够的, 需要”Add Files”, 打开目录添加一下, 才能在Xcode里也可见.

Project文件

ProjectName.xcodeproj/project.pbxproj
Project文件挺烦人的, 每新增/重命名一个文件它都会有diff.

有一些脚本工具可以帮忙将文件排序: https://github.com/WebKit/webkit/blob/main/Tools/Scripts/sort-Xcode-project-file

这样产生diff之后运行一下(可以添加到git hook里), 文件会有序一些, 多人合作的时候不容易产生冲突.

真机调试

真机调试需要有证书, 并不是随便抓个机器连上线就能安装应用.
当设备的OS版本较高但Xcode版本较低时, 可能需要添加一些DeviceSupport文件:

比如:

将所缺版本拷贝到这个目录: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

重启xcode再试.

References

posted @ 2024-04-03 13:55 圣骑士wind 阅读(274) 评论(0) 推荐(0) 编辑
摘要: Kotlin协程中的异常处理讨论 阅读全文
posted @ 2023-06-08 08:43 圣骑士wind 阅读(556) 评论(0) 推荐(0) 编辑
摘要: Kotlin coroutine的取消. 阅读全文
posted @ 2023-06-08 00:00 圣骑士wind 阅读(571) 评论(0) 推荐(0) 编辑
摘要: ChatGPT初体验. 阅读全文
posted @ 2023-02-14 07:09 圣骑士wind 阅读(1626) 评论(0) 推荐(1) 编辑
摘要: 今年从Android转做iOS了(也可能会转走), 由此有一些转技术栈相关的想法. 阅读全文
posted @ 2022-12-05 01:22 圣骑士wind 阅读(324) 评论(1) 推荐(0) 编辑
摘要: iOS UIKit TableView的基本使用. 阅读全文
posted @ 2022-11-22 00:07 圣骑士wind 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 把storyboard删了需要几步? 阅读全文
posted @ 2022-11-06 18:23 圣骑士wind 阅读(230) 评论(0) 推荐(0) 编辑
摘要: iOS AutoLayout基础入门. 阅读全文
posted @ 2022-11-02 23:24 圣骑士wind 阅读(800) 评论(0) 推荐(0) 编辑
摘要: 快速了解iOS UIKit. 阅读全文
posted @ 2022-10-13 00:18 圣骑士wind 阅读(891) 评论(0) 推荐(0) 编辑
摘要: 简单介绍一下iOS UIKit中重要的一个组件: ViewController. 阅读全文
posted @ 2022-10-11 23:38 圣骑士wind 阅读(599) 评论(0) 推荐(1) 编辑
摘要: iOS中写UI的几种方式, 大体分类. 阅读全文
posted @ 2022-10-11 00:01 圣骑士wind 阅读(1029) 评论(0) 推荐(0) 编辑
摘要: Xcode常用功能和快捷键. 阅读全文
posted @ 2022-08-23 23:48 圣骑士wind 阅读(874) 评论(1) 推荐(0) 编辑
摘要: 这篇文章是想着帮助Android开发快速学习Swift编程语言用的. (因为这个文章的作者立场就是这样.) 我不想写一个非常长, 非常详尽的文章, 只是想写一个快速的版本能让你快速上手工作. 阅读全文
posted @ 2022-07-19 01:27 圣骑士wind 阅读(1637) 评论(0) 推荐(0) 编辑
摘要: android中多栈导航的几种实现, 技术选型参考. 阅读全文
posted @ 2022-06-25 01:12 圣骑士wind 阅读(756) 评论(0) 推荐(0) 编辑
摘要: DNS各种类型的解析 阅读全文
posted @ 2022-02-15 08:53 圣骑士wind 阅读(1210) 评论(0) 推荐(0) 编辑
摘要: Android Compose WIndow Insets的处理, 包括内容显示和输入框软键盘的布局. 阅读全文
posted @ 2022-01-29 01:35 圣骑士wind 阅读(3892) 评论(0) 推荐(0) 编辑
摘要: 应用中的页面跳转是一个常规任务, Google官方提供的解决方案是Android Jetpack的Navigation component. 本文概括介绍一下基本使用的关键点(详细的how to guide看官方就好了), 结合源码梳理一下基本的navigation component的设计, 帮助大家更好地理解和使用这个库. 阅读全文
posted @ 2022-01-02 18:21 圣骑士wind 阅读(1140) 评论(0) 推荐(0) 编辑
摘要: ViewModel的创建很关键, 关系到它的生命周期. 手动创建比较麻烦, 很多样板代码. 本文总结了几种常见的创建方式, 希望读者看完后能有更清晰的理解, 每种方式都是怎么回事, 那些方便的工具替我们做了什么. 阅读全文
posted @ 2021-12-23 01:10 圣骑士wind 阅读(3118) 评论(0) 推荐(1) 编辑
摘要: 本文包含的内容: Flow是什么, 基本概念和用法. Flow的不同类型, StateFlow和SharedFlow比较. Flow在Android中的使用 安全收集. 操作符stateIn, shareIn的用法和区别. 阅读全文
posted @ 2021-08-30 00:12 圣骑士wind 阅读(1322) 评论(0) 推荐(0) 编辑
摘要: Jetpack Compose和View的互操作性. 阅读全文
posted @ 2021-06-27 16:16 圣骑士wind 阅读(4768) 评论(1) 推荐(1) 编辑
摘要: Hello Google I/O 2021. 阅读全文
posted @ 2021-05-30 02:21 圣骑士wind 阅读(636) 评论(0) 推荐(0) 编辑
摘要: Jetpack Compose 7月就要发正式版了! Android UI未来的新写法, 赶紧了解一下. 早学一步, 早卷起来. 阅读全文
posted @ 2021-05-21 01:49 圣骑士wind 阅读(1712) 评论(0) 推荐(0) 编辑
摘要: 要用GraphQL, Android端如何实现, 目前最流行的库就是apollo-android. 阅读全文
posted @ 2021-02-23 23:31 圣骑士wind 阅读(1357) 评论(0) 推荐(0) 编辑
摘要: GraphQL是什么, 以及它的优缺点. 阅读全文
posted @ 2021-02-23 00:49 圣骑士wind 阅读(559) 评论(0) 推荐(1) 编辑
摘要: 目前最流行的微服务架构非`Springboot+Kubernetes+Istio`莫属, 然而随着越来越多的微服务被拆分出来, 不但Deploy过程boilerplate的配置越来越多, 且繁琐易错, 维护成本也逐渐增高, 那么是时候采用k8s提供的扩展自定义资源的方法, 将重复的template抽到后面, 从而简化Deploy配置的数量与复杂度. CustomResourceDefinition 阅读全文
posted @ 2020-12-15 18:21 圣骑士wind 阅读(2117) 评论(0) 推荐(1) 编辑
摘要: 这是一本被前辈称赞, 另一个马丁的知名著作, 被赋予学习如何写出漂亮代码的教皇级手册, 最近(再)浏览, 有诸多感受. 总结一下就是如果你是新手, 可能看优秀的open source学习更好; 如果你是老手, 可能他说的东西要么你会觉得太啰嗦, 要么你会觉得例子太细节, 太教条, 无法举一反三. 不 阅读全文
posted @ 2020-10-27 12:33 圣骑士wind 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 阅读重构的摘要 阅读全文
posted @ 2020-09-01 17:19 圣骑士wind 阅读(774) 评论(0) 推荐(0) 编辑
摘要: Android Weekly笔记, Issue #428. 阅读全文
posted @ 2020-08-31 00:59 圣骑士wind 阅读(468) 评论(0) 推荐(0) 编辑
摘要: Thinking in Java 总结 阅读全文
posted @ 2020-06-24 08:46 圣骑士wind 阅读(785) 评论(0) 推荐(0) 编辑
摘要: Dart语言一些语法特点和编程规范. 本文适合: 日常使用Kotlin, 突然想写个Flutter程序的Android程序员. 阅读全文
posted @ 2020-06-15 00:39 圣骑士wind 阅读(403) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示