按当前 Xcode 或命令行工具目录查找并执行编译、模拟器和公证工具。
xcrun 根据 xcode-select 的当前 developer 目录定位工具,并可按 --sdk 选择 SDK。xcrun --find clang 只打印路径,xcrun clang ... 直接执行;--show-sdk-path、--show-sdk-version 常用于构建脚本确认 SDK。它本身不修改 PATH,脚本里应显式用 xcrun 或 $(xcrun --find 工具),不要假设工具一定在 /usr/bin。
CLT 和完整 Xcode 提供的能力不同:CLT 有 clang、swiftc、make 和 macOS SDK;simctl、xcodebuild、iOS SDK、notarytool 通常需要完整 Xcode。xcrun --sdk iphoneos 找不到 SDK 时,先在 Xcode 的设置里安装对应平台,而不是反复切 xcode-select。
xcrun 有查找缓存,切换 Xcode 后如果仍解析到旧工具,用 xcrun -k 清缓存或 -n 跳过缓存。环境变量 DEVELOPER_DIR 优先于全局 xcode-select,CI 中常用它做单次构建的 Xcode 选择,但也容易在排障时被忽略,先 echo $DEVELOPER_DIR。
# 查找当前生效的 clang 路径
% xcrun --find clang
# 查看 macOS SDK 路径和版本,构建脚本常依赖
% xcrun --sdk macosx --show-sdk-path
% xcrun --sdk macosx --show-sdk-version
# 查看 iOS SDK 版本(需要完整 Xcode 和对应平台)
% xcrun --sdk iphoneos --show-sdk-version
# 列出可用模拟器并启动一个
% xcrun simctl list devices available
% xcrun simctl boot "iPhone 15"
# 对已启动模拟器截图
% xcrun simctl io booted screenshot /tmp/sim.png
# 公证:提交并用 stapler 装订票据
% xcrun notarytool submit App.zip --keychain-profile AC_PASSWORD --wait
% xcrun stapler staple App.app
# 切换 Xcode 后清缓存,避免仍解析到旧工具
% xcrun -k --find swift
unable to find utility simctl, not a developer tool or in PATH:当前目录只有 CLT,模拟器工具需要完整 Xcode;用 xcode-select -p 确认并切换。SDK cannot be located:对应平台没装或 Xcode 未完成首次启动;在 Xcode 设置中安装平台,必要时 sudo xcodebuild -runFirstLaunch。xcrun -k;也可能是 DEVELOPER_DIR 仍指向旧 Xcode。DEVELOPER_DIR 指向被删除的 Xcode 会让所有 xcrun 调用失败;unset DEVELOPER_DIR 或改成有效路径。xcrun 只负责定位,不会把工具目录加进 PATH;在脚本里直接写 xcrun swift,不要依赖 which swift 的结果。xcrun altool 已废弃,公证改用 xcrun notarytool;旧脚本迁移时要重新保存钥匙串凭据。notarytool 要求钥匙串 profile,先 xcrun notarytool store-credentials 创建;不要在命令行明文传密码。xcrun simctl list devices available 和 runtime 是否安装,设备名不存在时不会自动回退。xcode-select — 决定 xcrun 使用哪个 developer 目录xcodebuild — 完整 Xcode 的构建入口codesign — 给产物签名,配合公证brew — 安装构建依赖和工具链合上页面,先回答,再展开对照。
xcrun --find clang 和 which clang 有什么区别?xcrun simctl 会失败?xcrun --find 按当前 developer 目录和 SDK 解析工具路径,which 只看 PATH;两者可能指向不同版本。xcrun -k 清缓存,再检查 xcode-select -p 和 DEVELOPER_DIR 是否仍指向旧 Xcode。
小程序版
微信扫码,随时查命令