为了账号安全,请及时绑定邮箱和手机立即绑定

为什么用命令行构建Xcode项目比用Xcode界面慢多了?

标签:
iOS
确实存在一个设计漏洞,但这正是有意为之。

自从我开始主要用 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……

Rudrank 还编写了一个 脚本,我将在这里嵌入该脚本。


    脚本:  
    #!/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中的构建和运行按钮。也许……

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消