惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
IT之家
IT之家
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cisco Talos Blog
Cisco Talos Blog
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
J
Java Code Geeks
博客园_首页
Scott Helme
Scott Helme
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
V
Visual Studio Blog
Cloudbric
Cloudbric
Jina AI
Jina AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
The Last Watchdog
The Last Watchdog
SecWiki News
SecWiki News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
W
WeLiveSecurity
K
Kaspersky official blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hacker News: Ask HN
Hacker News: Ask HN
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
量子位
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 三生石上(FineUI控件)
Recent Commits to openclaw:main
Recent Commits to openclaw:main

一个工匠

AI 发展临界点 - 快上车 流式响应(Chat):HTTP 响应体字节流的读取与解析 iPhone 截屏高效翻译 Flash Open Terminal iPhone 侧载安装 Xcode Symbolic Debug AI 指北 投资风险收益评估 Mac 快速修改系统快捷键 Git Record passkey How to pay apple frameworks DNS 的 CNAME 是如何工作的 WebRTC 的一些解释 SSE 指南 1.1.1.1、WARP 和 MASQUE 移动端换端方案与场景还原 设备发现 分辨率 - 像素密度 - HiDPI Mac 字体 ESP32 trump - 川普 币圈 - 虚拟货币 【旅游】富士山 【旅游】sakura(樱花) 【旅游】千岛湖 我的 2023 【Swift】中文词语纠错 计算机字符编码与内存编码 - Unicode、UTF8、String 从汇编角度理解 “函数调用栈” 和 “有栈协程” 在 Xcode 中更好的使用 Swift 通过 Swift Package 制作二进制库 Arc 浏览器 - 意外的惊喜 【Swift 三方源码 1】SwiftShell 高效的命令行工具 Swift 脚本开发环境搭建 rime - 小鹤双拼 【旅游】沿海旅游 (威海、青岛) 好记性远远不如烂笔头 高级语言小记 又一年高考 Vision 未来已来 致敬耗子哥 Socket 与 ICMP 对互联网隐私的一些想法 网络代理是如何工作的 (致敬 Surge) 又十年 - 至三十而立 双拼 - 少有的高回报效率技能 Vim 技巧 我的 2022 三年疫情五味杂陈 - 下 老梗 - 浏览器按回车后发生了什么 三年疫情五味杂陈 生活推荐清单 Shell 和进程 有计划的努力 内卷 不确定性 数学可以保障逻辑自洽 这些年我的软件清单 决定做一些改变 函数调用栈之彻底理解 锁 - 共享数据安全指↑ 江苏女有感 碎碎念 - 2022 碎碎念 - 2021 打算记录一些碎碎念 多重性格就是逆天改命 从 Core Foundation 看更大世界 TCP 数据传输过程分析 iOS main 文件中的 @autoreleasepool 的真实用途 多线程的难点在哪里 Objective-C 和 Runtime 早起打卡计划 ing 打比方 IM 和 Socket 的关系及 Heart 的必要性 如果我的人生突然只剩下 8 小时... 胡说八道之雪粉 Array 和 LinkedList 的深刻认知 Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用 逃离信用卡和花呗 Swift_let_var_struct_class 网聚人的力量 - 网易 绿皮火车 喝酒十之八九会误事 HKong 胡说八道之云服务 互联网网络传输协议理解坑点 CPU 的制作 我心里一直有一个念想 网络基础协议 为什么 32 位操作系统只能用 4G 内存空间 努力和天赋 洗牙 RAC-Api-Summer iOS 内存原理 Block 闭包简查记录 《白夜行》 谈谈事件驱动 老博新开 祭首
Mac - Command Line Tools
海驴 · 2024-11-11 · via 一个工匠

Mac 系统上,默认没有提供 git、xcodebuild 这些开发者命令。所以当一些终端命令 (brew 等) 被触发后,macos 系统会弹窗提醒用户进行【开发者工具】的安装,即【Command Lines Tools】(下面简称 tools)。
如果安装了不同版本的 xcode,则每个版本都会携带各自 xcode 版本的【tools】。
上面提到的系统弹窗,是不需要安装 xcode 也可以安装【tools】。但这个 tools 版本会比较低,内部的命令数量也会少于 xcode 携带的。即:最新版本的 xcode,携带的 tools 也是最新的。
这里就可以发现有多个 tools 目录了,如下:

  1. 非 xcode 携带:/Library/Developer/CommandLineTools
  2. xcode:/Applications/Xcode.app/Contents/Developer
  3. xcode beta: /Applications/Xcode-16.2.0-Beta.2.app/Contents/Developer

在终端执行 gitxcodebuild 的时候,一定会使用某一个 tools 中的命令,可具体使用哪一个呢?

xcode-select

通过 xcode-select 可以方便的切换 main tools,默认也只有 main tools 会生效。可以通过 man xcode-select 查看简介。

1
2
3
xcode-select --install // 安装非 xcode 版本的 tools
xcode-select --switch <path> // 切换不同的 tools 作为 main tools
xcode-select -p // 打印当前 main tools path

当 tools 被指定为 xcode-xx-beta.app/xx/Develop 目录的时候:
在终端中执行 git 命令,最终就会使用:/Applications/Xcode-16.2.0-Beta.2.app/Contents/Developer/usr/bin/git
xcode-select 默认只有 1 个 tools 被激活,是操作系统级别的全局有效。
如果在 a tools 激活的同时,希望使用 b tools 该怎么办呢?在多版本 xcode 共存的时候,可能需要使用不同的 tools 命令进行开发。
这个时候在当前的命令行环境中设置DEVELOPER_DIR 就可以临时切换 tools 目录:

1
2
3
4
5
6
7
8
// 1
> xcrun --find git
/Applications/Xcode-16.2.0-Beta.2.app/Contents/Developer/usr/bin/git
// 2
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
// 3
> xcrun --find git
/Applications/Xcode.app/Contents/Developer/usr/bin/git

xcrun

当在终端中执行 git 命令的时候,使用的是 tools 中的 git,这里需要探究一下。

1
2
3
4
5
6
// 1
> where git
/usr/bin/git
// 2
> xcrun --find git
/Applications/Xcode.app/Contents/Developer/usr/bin/git

通过 where 发现,/usr/bin 目录下是存在 git 二进制可执行文件的。为什么说执行的是 tools 中的 git 可执行文件呢?
这就要说到 xcode-select 维护多个 tools 的意义了。
/usr/bin 是 path 路径,可以直接找到命令。但是像 git 这些命令依托不同的 tools 环境提供,总不能在切换 main tools 的时候,把这些命令 copy 到 /usr/bin 中。所以对于 /usr/bin 中的 git、xcodebuild 等命令,在具体执行的时候都执行的是 main tools 中的可执行文件。
实现这个能力的,就是 【xcrun】。

xcrun 的目标只有一个,就是根据 xcode-select 设定的 mail tools 目录,在其下面寻找命令。可以通过 man xcrun 查看详细:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Options:
-h, --help show this help message and exit
--version show the xcrun version
-v, --verbose show verbose logging output
--sdk <sdk name> find the tool for the given SDK name
--toolchain <name> find the tool for the given toolchain
-l, --log show commands to be executed (with --run)
-f, --find only find and print the tool path
-r, --run find and execute the tool (the default behavior)
-n, --no-cache do not use the lookup cache
-k, --kill-cache invalidate all existing cache entries
--show-sdk-path show selected SDK install path
--show-sdk-version show selected SDK version
--show-sdk-build-version show selected SDK build version
--show-sdk-platform-path show selected SDK platform path
--show-sdk-platform-version show selected SDK platform version

上面示例中的 xcrun --find git 就是用来找 git 二进制可执行文件路径的。
当 git 在 tools 中的路径找到后,原先执行的 /usr/bin/git 命令,也就通过这个新的执行文件来实现了。