自从我开始主要用 Cursor 进行 iOS 开发后,我就很少操作 Xcode 的图形界面,而是更多地用命令行工具 xcodebuild。
如何在iOS开发中使用Cursor最近AI很火,大家都在讨论AI是否可以改善你的开发工作流程。dimillian.medium.com如果你还不熟悉这个命令行,它用于在不打开 Xcode 应用程序的情况下构建 Xcode 项目。如果你在持续集成中运行项目,或使用了 Fastlane,你肯定间接或直接用过它。
当你试图在 Xcode 之外构建项目时,比如使用外部编辑器并通过 xcodebuild 命令来构建项目时,这种情况更加普遍。
使用xcodebuild命令构建项目
xcodebuild ARCHS=arm64 VALID_ARCHS=arm64 ONLY_ACTIVE_ARCH=NO -方案 IceCubesApp -配置 Debug -工作区 /Users/dimillian/Documents/Dev/Other/IceCubesApp/IceCubesApp.xcodeproj/project.xcworkspace -目标 '平台=iOS模拟器,id=E99971ED-7594-459D-A77E-DF735E47F5B2' -结果包路径 '/Users/dimillian/Library/Application Support/Cursor/User/workspaceStorage/ceb1a744769b70b7bfd7b78ac51e31d4/sweetpad.sweetpad/bundle/IceCubesApp' -允许配置文件更新 build
打开 -a 模拟器
xcrun simctl 安装 E99971ED-7594-459D-A77E-DF735E47F5B2 '/Users/dimillian/Library/Developer/Xcode/DerivedData/IceCubesApp-dckoljloxttnqcekprljivqttvuw/Build/Products/Debug-iphonesimulator/Ice Cubes.app'
xcrun simctl 启动 --console-pty --终止运行中的进程 E99971ED-7594-459D-A77E-DF735E47F5B2 com.thomasricouard.IceCubesApp --console-pty(控制台伪终端)
然后用 xcrun 运行它。
除非你使用了像Bazel这样的自定义构建工具链,否则你就得依赖Xcode的GUI或xcodebuild来构建你的项目。
如果你和我一样觉得 xcodebuild 很慢,别担心。你不是唯一一个。目前 xcodebuild 存在一个问题,它在构建项目时会进行内联网络请求以检查配置,即使是增量构建也不例外。
Xcode 项目增量构建时间长 | Apple 开发者论坛当我使用 xcodebuild 命令编译我的 Xcode 项目时,发现增量构建时间非常长。例如……forums.developer.apple.com
紧随Resolving Package Graph
之后的步骤是GatherProvisioningInputs
步骤,而这里xcodebuild
所花费的时间似乎会随着你项目中目标数量的增多而增加。
有一种解决办法,如在 xcodebuild 的 vim 扩展的 GitHub 上的问题中提到的。
使用xcodebuild
进行缓慢增量构建 · 问题 #201 · wojciech-kulik/xcodebuild.nvim最近我发现,在 xcodebuild 命令中加上 CODE_SIGNING_ALLOWED=NO
可以大大加快增量构建……github.com
你可以在 /etc/hosts
文件中加入一条规则,阻止 developerservices2.apple.com
,从而防止 xcodebuild 向家上报。
sudo bash -c "echo '127.0.0.1 developerservices2.apple.com' >>/etc/hosts" (将此命令用于将特定域名添加到本地hosts文件中。)
然后在构建完成之后恢复访问
sudo sed -i '' '/developerservices2\.apple\.com/d' /etc/hosts
# 删除 /etc/hosts 文件中与 developerservices2.apple.com 相关的行
注意,虽然 developerservices2.apple.com
被阻止,Xcode 将无法访问你的配置概要文件,并且 GUI 会移除你的开发者账户。记得最终还是从你的 /etc/hosts
文件中移除那条阻止 developerservices2.apple.com
的记录,否则 Xcode 将无法访问配置概要文件,并且 GUI 会移除你的开发者账户。
这个 bug 自从 Xcode 16.0 的第一个测试版以来一直存在,在 Xcode 16.1 RC 中依然存在。希望 Apple 能尽快修复这个 bug……
脚本:
#!/bin/bash
# 阻止域名的函数
block_domain() {
echo "127.0.0.1 http://developerservices2.apple.com" | sudo tee -a /etc/hosts > /dev/null
echo "域名已成功封锁"
}
# 解除阻止域名的函数
unblock_domain() {
sudo sed -i '' '/developerservices2\.apple\.com/d' /etc/hosts
echo "域名已成功解封"
}
# 检查是否提供了 xcodebuild 参数
if [ $# -eq 0 ]; then
echo "请提供 xcodebuild 参数"
exit 1
fi
# 阻止域名
block_domain
# 运行带有所有参数的 xcodebuild
"$@"
# 捕获 xcodebuild 的退出状态码
BUILD_RESULT=$?
# 解除阻止域名
unblock_domain
# 以相同的退出状态码退出
exit $BUILD_RESULT
基本上,这是一个用于 xcodebuild 的包装器,在构建过程中会阻止/恢复对 Apple 域名的访问。
怎么用:
./xcodebuild-wrapper.sh xcodebuild [常用的 xcodebuild 参数]
不过,它确实是这么设计的
好吧,Xcode 就是这么设计的。基本上,xcodebuild 是一次性使用的命令;构建完成后服务器就会被关闭。而 Xcode 应用程序的工作方式则有所不同。它并没有直接使用 xcodebuild,而是通过一系列(私有)API 来维持构建服务的活跃状态,因此从 Xcode 的 GUI 进行增量构建会更快一些。点击构建和运行按钮总是比再运行一次 xcodebuild 命令更快。
根据 tuist.io 的缓存页面 此处,他们围绕 xcodebuild 进行了优化,但除非 Apple 向我们提供他们在 Xcode 中使用的工具,否则我们能做的就有限了。
我在开玩笑说,也许解决方案是开发一个插件,当你想运行应用程序时,这个插件会自动点击Xcode中的构建和运行按钮。也许……
共同学习,写下你的评论
评论加载中...
作者其他优质文章