前言

Hi Coder,我是 CoderStar!

在新的一年里,祝小伙伴们工作顺利,升职加薪。

在咱们日常开发中,或多或少都会用到 Xcode 内置的一些CLI工具,但是大部分小伙伴可能只是会用到一些具体的命令,今天我们就一起来聊一聊 Xcode 内置的常见Command Lines Tool

介绍的可能不全,大家可以去文中出现的路径下查看更多的工具。

Command Line Tool本质是一个命令行工具包,内部有很多有用的工具,如Apple LLVM compilerMake等等。并且并不是只有开发 Apple 应用程序才需要用到这些工具包,当我们使用Homebrew在安装一些python库或者js库时,都会提示需要Command Line Tool

下文会对Command Line Tool直接缩写成 CLI,XXX 一般情况是指对应路径地址。

我们在开发者官网 Command Line Tool 对其单独下载,当然每个版本的 Xcode 安装包内也会包含这套工具包。

其实下列有一部分工具属于 LLVM 序列,比如dwarfdumpar,启动本质其实为llvm-dwarfdumpllvm-ar,都属于 LLVM 工具链中的一部分。

前置工具

在我来介绍这套工具包其他工具之前,我先来介绍两个工具,我称它们为前置工具,因为有了这两个工具,我们才能更好的使用其他的工具。

xcode-select

这个工具可以帮助我们下载及安装 CLI,比手动下载更便捷。并且还能解决另外问题,就是如果我们装有多个 Xcode,我们在使用 CLI 相关工具时,系统就会不知道该去使用哪个版本或者哪个位置的 CLI,使用这个工具可以帮助我们设置及切换当前默认使用的 CLI。

介绍该工具常见的命令:

  • xcode-select --install: 安装 CLI,会安装到/Library/Developer/CommandLineTools/
  • xcode-select -p: 显示当前指定的工具包所在 Xcode 路径
  • xcode-select -s <path>: 切换默认工具包所在 Xcode 路径
  • xcode-select -r: 重置工具包所在 Xcode 路径

xcode-select提供了一个环境变量,让你能临时使用其他环境来执行xcode commandenv DEVELOPER_DIR="/Applications/Xcode-beta.app" /usr/bin/xcodebuild

xcode-select 选择路径不是直接选择的 CLI 路径,而是选择所在 Xcode 的路径,继而使用该 Xcode 对应的 CLI,默认情况会选择到该 Xcode 包内包含的 CLI,但是如果我们通过 Xcode Preferences 调整过该 Xcode 对应的 CLI,就会使用调整后的 CLI。

这个工具应该是 Mac 自带的工具,位于/usr/bin/xcode-select,并不是跟随 CLI 工具包一块下载下来的。

xcrun

回想我们过去在使用一些 CLI 命令的时候,会直接在终端上执行xcodebuild ...这样的方式,没有指定具体的 CLI 路径,并且我们执行which xcodebuild得到的结果是/usr/bin/xcodebuild。那这个命令是怎么执行到我们通过xcode-select设置的默认 CLI 路径下呢?那就得提到我们马上要介绍的这个工具了 -- xcrun

我们就以xcodebuild举例,我们通过which xcodebuild得到的结果是/usr/bin/xcodebuild,也就是说我们在执行xcodebuild的时候实际上在执行usr/bin/xcodebuild,那再让我们看看/usr/bin/xcodebuild 下的指令是怎么配合xcode-select找到 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild的?

我们先通过otool -tV /usr/bin/xcodebuild查看其textsection,得到:

(__TEXT,__text) section
_main:
0000000100003f63    pushq   %rbp
0000000100003f64    movq    %rsp, %rbp
0000000100003f67    pushq   %r14
0000000100003f69    pushq   %rbx
0000000100003f6a    movq    %rsi, %r14
0000000100003f6d    movl    %edi, %ebx
0000000100003f6f    callq   0x100003f88                     ## symbol stub for: __NSGetProgname
0000000100003f74    movq    (%rax), %rdi
0000000100003f77    leal    -0x1(%rbx), %esi
0000000100003f7a    leaq    0x8(%r14), %rdx
0000000100003f7e    movl    $0x1, %ecx
0000000100003f83    callq   0x100003f8e                     ## symbol stub for: _xcselect_invoke_xcrun
复制代码

我们可以发现该命令调用_xcselect_invoke_xcrun函数。

然后我们通过nm /usr/bin/xcodebuild查看其name list

                 U __NSGetProgname
0000000100008018 d __dyld_private
0000000100000000 T __mh_execute_header
0000000100003f63 t _main
0000000100008010 s _shim_markerU _xcselect_invoke_xcrunU dyld_stub_binder
复制代码

通过_xcselect_invoke_xcrun前面的U标识我们可以知道该函数是一个外部符号,是另外一个动态库去处理的。

后面我们通过 Swift-Swiftc 可以知道更详细流程,这里只说结论:

libxcselect.dylib
												

Xcode 常见 CLI 工具相关推荐

  1. 肝!22款超好用的CLI工具

    作者 | switowski 策划 | 万佳 作者根据多年的终端使用经验,详细介绍了一些实用的 CLI 工具,希望它们能帮读者提高生产力. 前段时间,我写过一篇我最喜欢的 Mac 应用的文章.其实,我 ...

  2. 如何用node开发自己的cli工具

    如何用node开发自己的cli工具 灵感 写这个工具的灵感以及场景源于youtube的一次闲聊 github 地址 blog首发 使用场景 原本我们写博客展示shell,例如:安装运转docker,一 ...

  3. 手把手带你撸一个cli工具

    你有没有遇到过在没有vue-cli.create-react-app这样子的脚手架的时候一个文件一个文件的去拷贝老项目的配置文件.最近,笔者就在为组里的框架去做一套基本的cli工具.通过这边文章,笔者 ...

  4. 一文读懂:从 Python 打包到 CLI 工具

    最近项目组在写项目的 CLI 工具,已经接近尾声,想做成 pip 的安装包,所以才有了这篇文章. 1,文章介绍了如何生成 Python Egg ,上传 PyPI 及其 pip 的安装测试 2,在后面的 ...

  5. Node.js CLI 工具最佳实践

    为什么写这篇文章? 一个糟糕的 CLI 工具会让用户觉得难用,而构建一个成功的 CLI 需要密切关注很多细节,同时需要站在用户的角度,创造良好的用户体验.要做到这些特别不容易. 在这个指南中,我列出了 ...

  6. SDKMAN - 一个用于轻松管理多个软件开发工具包的CLI工具

    转载来源:https://www.ostechnix.com/sdkman-a-cli-tool-to-easily-manage-multiple-software-development-kits ...

  7. npm 更换插件版本_Node CLI 工具的插件方案探索

    本文作者:徐超颖 CLI 工具作为开发者们亲密无间的好伙伴,996 风雨无阻地陪伴着我们进行日常的开发工作.身为前端开发,你一定也亲自开发过一套属于你自己的 CLI 小工具!如果没有,本文也不会教~ ...

  8. Xcode常见的编译、运行等错误的解决

    Xcode常见的编译.运行等错误的解决 项目没找到Info.plist的错误 The solution for this particular instance of the error was &q ...

  9. aws linux 安装图形,linux – 用于安装AWS CLI工具的Bash脚本

    我正在编写一个自动安装和配置AWS CLI工具的bash脚本.我可以安装AWS CLI工具,但无法配置它. 我的脚本是这样的: #!/bin/bash wget https://s3.amazonaw ...

最新文章

  1. 【转】ActiveMQ消息传送机制以及ACK机制详解
  2. VMware克隆出来的网卡错误
  3. [恢]hdu 2117
  4. 在 WxHtmlWindow 中调用默认浏览器
  5. python的生成器
  6. 测试人员报BUG的正确姿势
  7. 显示控制器注释_欧姆龙可编程控制器CS1D-CPU产品型号说明及功能介绍
  8. for循环及break和continue的区别
  9. 摘录本的摘录内容_使用tSQLtSQL单元测试数据仓库摘录
  10. codeigniter mysql 存储过程_Codeigniter框架使用Mysql存储过程的例子
  11. 利用HTML制作简易新闻网站的静态网页
  12. SoundPool工具类
  13. bat生成exe总结
  14. java程序将asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv,mpeg,mpe,wmv9,rm,rmvb转MP4
  15. word批量调整图片大小--宏
  16. 安卓应用市场广告(CPD),aso cpd
  17. Unity3D-游戏场景优化之遮挡剔除(Occlusion Culling)的使用
  18. 字体转换网站——Font Squirrel(推荐阅读)
  19. 拿破仑最欣赏的数学家,师从拉格朗日,撕逼泊松,一生痴迷热学最后却死于热学...
  20. 编程python入门可以嘛_我为什么选择python——对于编程零基础的人为什么建议从Python入门...

热门文章

  1. 华南农业大学课设——数据结构课设、Java课设、操作系统课设
  2. 2021校招京东物流新锐之星校招笔试面试总结
  3. Ubuntu_DNS配置过程记录
  4. JavaScript网页生日快乐
  5. 领导永远器重这12种人,有你吗
  6. singer页面点击歌手singer是跳转到singer-detail的设置
  7. 2006年度十大视频搜索引擎全面评测
  8. C语言 在程序中打开网页,模拟鼠标点击、键盘输入
  9. 物联网发展的三大编程语言
  10. oracle的dba_ segment,Dba_segments详解