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

[Android开发学iOS系列] iOS项目环境搭建和依赖管理的更多相关文章

  1. Android开发-eclipse+phonegap(Cordova)环境搭建

    搭建步骤: 一.安装java [官网下载].eclipse+ADT+Android SDK [点我下载x86(android-22)] | [adt-bundle-windows-x86_64-201 ...

  2. [Android开发学iOS系列] 工具篇: Xcode使用和快捷键

    [Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...

  3. [Android开发学iOS系列] iOS写UI的几种方式

    [Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...

  4. [Android开发学iOS系列] Auto Layout

    [Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...

  5. appium ios真机自动化环境搭建&运行(送源码)

    appium ios真机自动化环境搭建&运行(送源码) 原创: f i n  测试开发社区  6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...

  6. appium ios真机自动化环境搭建&运行(送源码)

    appium ios真机自动化环境搭建&运行(送源码) 原创: f i n  测试开发社区  6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...

  7. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  8. react 开发 PC 端项目(一)项目环境搭建 及 处理 IE8 兼容问题

    步骤一:项目环境搭建 首先,你不应该使用 React v15 或更高版本.使用仍然支持 IE8 的 React v0.14 即可. 技术选型: 1.react@0.14 2.bootstrap3 3. ...

  9. 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...

  10. 第一周博客之二---OA项目环境搭建及开发包部署

    OA项目环境搭建 一个项目想要能够在开发人员打包好项目包之后进行测试,就必须进行项目测试环境的搭建,要根据开发工程师的开发环境采用不同的测试环境,以下只是浅谈下Java项目OA(办公自动化平台)的环境 ...

随机推荐

  1. win32 - service的创建

    参考这篇教程:Simple Windows Service in C++ 安装service需要在管理员权限下运行cmd,并输入下面的命令行 C:\>sc create "My Sam ...

  2. Unity学习笔记--数据持久化XML文件(1)

    XML相关 Xml是可拓展标记语言,一种文件格式.我们使用xml来完成对数据持久化的存储.等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储. xml文 ...

  3. 硬件开发笔记(十二):RK3568底板电路电源模块和RTC模块原理图分析

    前言   做硬件做系统做驱动,很难从核心板做起,所以我们先依赖核心板,分析底板周围的电路,然后使用AD绘制原理图和设计PCB,打样我司测试底板,完成硬件测试,再继续系统适配,驱动移植,从而一步一步完善 ...

  4. Mapbox实战项目(1)-栅格图片图层实现地图方位展示

    需求背景 需要实现地图上展示一个类似于罗盘的标记,随着地图的缩放.切换.旋转等,能够在地图的中央指示出地图的方位. 系统自带的方位控件太小,在特殊业务场景下不够醒目. 技术选型 Mapbox 实现分析 ...

  5. Java interface 接口的使用 implements 实现----

    1 package com.bytezreo.interfacetest; 2 3 /** 4 * 5 * @Description interface 接口的使用 implements 实现---- ...

  6. C++ 函数模板案列 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 //排序规则从大到小 排序算法为选择排序 //分别用char 数组 和 int 数组进行测试

    1 //函数模板案列 2 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 3 //排序规则从大到小 排序算法为选择排序 4 //分别用char 数组 和 int 数组进行测试 5 6 7 ...

  7. Linux 网络编程从入门到进阶 学习指南

    前言 大家好,我是小康.在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作.进程管理和线程同步等,接下来,我们将视野扩展到网络世界.在这个新篇章里,我们要让应用跳出单机限制, ...

  8. Redis 常见数据类型(对象类型)和应用案列

    前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到. 在技术领域,我们经常听到「键值存储」 这个词.但在 R ...

  9. golang官方包管理vendor模式无法引用非go文件

    主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 背景&问题 golang作为高级计算机语言之一,在云原生以及web网站 ...

  10. coast 海岸 单词记忆方法

    coast 海岸 单词记忆方法 coa 扣 想象一个碗扣下去 st站 碗的边和地面的接触面 就是海岸的边 coast 逼近的地方-海岸 coast (n.) - "margin of the ...