乐园科技 發表於 2024-4-3 13:55:00

[Android开发学iOS系列] iOS项目环境搭建和依赖管理

<h1 id="ios项目环境搭建和依赖管理">iOS项目环境搭建和依赖管理</h1>
<p>一个项目总是会依赖一些库, 有些是第三方的, 有些可能是项目自身为了复用拆出去的.<br>
现有主流的iOS依赖有多种形式, 比如CocoaPods, Carthage和swift package.</p>
<p>本文是一些环境搭建和使用项目依赖相关的笔记.</p>
<h2 id="全局环境准备">全局环境准备</h2>
<p>基本上iOS开发都要准备的环境, 这些设置是全局的, 在每个机器上设置一次就行. (本文为mac环境).</p>
<p>homebrew: (已有可跳过)</p>
<pre><code class="language-bash">/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
</code></pre>
<h3 id="rbenv">rbenv</h3>
<p>rbenv是一个管理ruby版本的工具, 如果同一个机器上有多个代码库, 可以用它来灵活切换ruby在不同项目中的版本.</p>
<p>具体可以看一下项目介绍: https://github.com/rbenv/rbenv</p>
<p>setup ruby (这里选一个全局的版本号, 可根据具体情况更改):</p>
<pre><code class="language-bash">brew install rbenv ruby-build

rbenv install 3.1.3

echo "export PATH=\"/opt/homebrew/bin/rbenv:\$PATH\"" &gt;&gt; ~/.zshrc
echo "eval \"\$(/opt/homebrew/bin/rbenv init -)\"" &gt;&gt; ~/.zshrc

source ~/.zshrc
rbenv global 3.1.3
</code></pre>
<p>验证安装成功:</p>
<pre><code class="language-bash">ruby -v
//得到刚刚指定的版本
which ruby
//得到目录: $HOME/.rbenv/shims/ruby
</code></pre>
<h3 id="bundler和cocoapods">Bundler和CocoaPods</h3>
<p>Bundler(https://bundler.io/)和CocoaPods(https://cocoapods.org/)都是dependency manager.</p>
<p>它们管理的依赖种类不同.</p>
<p>Bundler用来下Ruby gems, 即<code>Gemfile</code>中的依赖.</p>
<p>CocoaPods用来下pod, 即<code>Podfile</code>中写的pods依赖.</p>
<p>但cocoapods本身是一个ruby gem, 所以它被bundler管理.</p>
<p>(可以想象bundler是大经理, cocoapods是小领导, 此处可以画一个树形图表示, 如果我记得的话.) (但是我突然决定不画了, 因为懒.)</p>
<p>iOS世界中还有一个著名的ruby gem是fastlane, 本文并不涉及就不展开讲了.</p>
<p>我们先把这两个工具安装到电脑上:</p>
<pre><code class="language-bash">gem install bundler
gem install cocoapods
pod setup
</code></pre>
<h3 id="optional">Optional</h3>
<p>你可能还需要的格式化工具:</p>
<pre><code class="language-bash">brew install swiftformat
</code></pre>
<h2 id="已有项目的配置">已有项目的配置</h2>
<p>我们拿到一个新项目后往往需要拉它的依赖.</p>
<p>如果你的项目中有<code>Gemfile</code>文件</p>
<pre><code class="language-bash">bundle install
</code></pre>
<p>之后发现还有Podfile文件:</p>
<pre><code class="language-bash">bundle exec pod install
</code></pre>
<p>这些命令是每个项目都需要执行的, 当项目依赖变更时需要重新执行这些:</p>
<pre><code class="language-bash">bundle install
</code></pre>
<pre><code class="language-bash">bundle exec pod install
</code></pre>
<p>M1电脑可能需要配置:</p>
<pre><code class="language-bash">bundle config build.ffi --enable-system-libffi
bundle config set --local path 'vendor/bundle'
// 这个命令运行完之后当前目录下会多出一个`.bundle/`文件夹.
</code></pre>
<p>命令行中的工作就基本做完了, 剩下打开xcode, 如果还有swift package xcode会帮你解析的.</p>
<h2 id="cocoapod">CocoaPod</h2>
<p>这里以CocoaPod为例讲一下如何添加使用一个CocoaPod库, 以及相关的文件.</p>
<p>安装cocoapods这一步我们在之前setup环境的时候已经跑过了:</p>
<pre><code class="language-bash">gem install cocoapods
pod setup
</code></pre>
<p>每一个机器只要跑一次就行, 可以跳过.</p>
<p>CocoaPods有一个公开的specifications repo:</p>
<p>https://github.com/CocoaPods/Specs</p>
<p>这是一个中心化的代码仓库, 比较流行的库都放在上面.</p>
<p>官网是: https://cocoapods.org/</p>
<p>在这里可以搜索任何你想要的cocoapods库.</p>
<h3 id="使用一个公开的库">使用一个公开的库</h3>
<p>让我们拿一个比较流行的库试试: https://github.com/Alamofire/Alamofire</p>
<p>首先在项目的根目录run:</p>
<pre><code class="language-bash">pod init
</code></pre>
<p>会创建一个<code>Podfile</code>. (如果项目中已经存在了会报错.)</p>
<p>这个文件名是固定不变的.</p>
<p>用xcode打开这个文件:</p>
<pre><code class="language-bash">open -a Xcode Podfile
</code></pre>
<p>里面的内容是这样: (这里<code>UsePublicCocoaPods</code>是我的项目名)</p>
<pre><code class="language-bash"># 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
</code></pre>
<p>我们在这里加上一行, 用上Alamofire的最新版本:</p>
<pre><code class="language-bash">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
</code></pre>
<p>然后:</p>
<pre><code class="language-bash">bundle exec pod install
</code></pre>
<p>(这里如果遇到问题, 记得在项目目录中跑<code>bundle config set --local path 'vendor/bundle'</code>).</p>
<p>安装完成之后会产生一些diff.</p>
<ul>
<li>项目下多了Pods文件夹. (应该被ignore)</li>
<li>多了<code>Podfile.lock</code>文件. (不应该被ignore)</li>
<li><code>UsePublicCocoaPods/UsePublicCocoaPods.xcworkspace/</code>和<code>UsePublicCocoaPods/UsePublicCocoaPods.xcodeproj/project.pbxproj</code> 都有改变.</li>
</ul>
<p>这里需要检查一下<code>.gitignore</code>的配置.</p>
<ul>
<li>这个网站可以搜搜不同的项目通常的配置: https://www.toptal.com/developers/gitignore/, 比如: https://www.toptal.com/developers/gitignore/api/swift,cocoapods,xcode</li>
<li>这里也有一个: https://github.com/github/gitignore/blob/main/Swift.gitignore</li>
</ul>
<p>然后就可以在代码里<code>import Alamofire</code>并使用它的代码了.</p>
<h2 id="dependency-management-tools">Dependency management tools</h2>
<p>iOS中有多种依赖管理工具类型:</p>
<ul>
<li>CocoaPods</li>
<li>Carthage</li>
<li>Swift package manager</li>
</ul>
<h3 id="cocoapods">CocoaPods</h3>
<p>CocoaPods<br>
比较老的依赖类型, 但是很多项目仍然在用.</p>
<h3 id="carthage">Carthage</h3>
<p>Carthage<br>
build出来的是字节码, 一般也叫framework.</p>
<h3 id="swift-package-manager">Swift package manager</h3>
<p>swift-package-manager<br>
比较新的依赖管理类型, 一般在Xcode的UI界面里操作.<br>
本文就不介绍了.</p>
<h2 id="项目结构和其他trouble-shooting">项目结构和其他Trouble Shooting</h2>
<h3 id="files-and-folders">Files and folders</h3>
<p>Xcode是一个神奇的IDE, 它的文件夹叫”Group”.<br>
在其中的文件分为”物理上存在”和”引用上存在”两种情况.</p>
<ul>
<li>删除文件的时候会问你只是删了引用(仅在Xcode里看不见)还是要进一步删了这个文件(物理上也删除).</li>
<li>添加文件的时候仅仅拷贝到文件目录里是不够的, 需要”Add Files”, 打开目录添加一下, 才能在Xcode里也可见.</li>
</ul>
<h3 id="project文件">Project文件</h3>
<p><code>ProjectName.xcodeproj/project.pbxproj</code><br>
Project文件挺烦人的, 每新增/重命名一个文件它都会有diff.</p>
<p>有一些脚本工具可以帮忙将文件排序: https://github.com/WebKit/webkit/blob/main/Tools/Scripts/sort-Xcode-project-file</p>
<p>这样产生diff之后运行一下(可以添加到git hook里), 文件会有序一些, 多人合作的时候不容易产生冲突.</p>
<h3 id="真机调试">真机调试</h3>
<p>真机调试需要有证书, 并不是随便抓个机器连上线就能安装应用.<br>
当设备的OS版本较高但Xcode版本较低时, 可能需要添加一些DeviceSupport文件:</p>
<p>比如:</p>
<ul>
<li>https://github.com/filsv/iOSDeviceSupport</li>
<li>https://github.com/iGhibli/iOS-DeviceSupport</li>
</ul>
<p>将所缺版本拷贝到这个目录: <code>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/</code></p>
<p>重启xcode再试.</p>
<h2 id="references">References</h2>
<ul>
<li>Swift Package Manager vs CocoaPods vs Carthage for All Platforms</li>
<li>The Podfile</li>
<li>Create useful .gitignore files for your project</li>
</ul>


</div>
<div id="MySignature" role="contentinfo">
    作者: 圣骑士Wind<br>
出处: 博客园: 圣骑士Wind<br>
Github: https://github.com/mengdd<br>

微信公众号: 圣骑士Wind<br>
<img src="https://images.cnblogs.com/cnblogs_com/mengdd/869539/o_200422055937qrcode_for_gh_0e2ed690dcda_258.jpg" alt="微信公众号: 圣骑士Wind"><br><br>
来源:https://www.cnblogs.com/mengdd/p/18112556/iOS-environment-setup-and-dependencies
頁: [1]
查看完整版本: [Android开发学iOS系列] iOS项目环境搭建和依赖管理