返回顶部
x

xcode-build-analyzerXcode构建分析器

Analyze Xcode build logs — timing, warnings, errors, slow compiles, and build history from DerivedData.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.2.0
安全检测
已通过
424
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

xcode-build-analyzer

Xcode 构建分析器

通过读取 macOS 上的 DerivedData 构建日志,分析 Xcode 构建性能、警告、错误和历史记录。

系统要求

  • - 仅限 macOS — 从 ~/Library/Developer/Xcode/DerivedData/ 读取
  • Xcode 必须已安装,并且至少构建过一个项目
  • plutilgunzipsqlite3(macOS 上均已预装)
  • 根据执行查询的进程,可能需要授予完全磁盘访问权限

关键路径

DERIVED_DATA=~/Library/Developer/Xcode/DerivedData

每个项目都有一个名为 <项目名称>-<哈希值> 的文件夹,包含:

  • - info.plist — 项目工作区路径和最后访问日期
  • Logs/Build/LogStoreManifest.plist — 所有构建的结构化索引(时间、状态、警告、错误)
  • Logs/Build/*.xcactivitylog — gzip 压缩的 SLF 构建日志,包含每个步骤的时间信息和完整的编译器输出

重要提示: 所有查询均为只读操作。切勿修改 DerivedData 的内容。

列出 DerivedData 中的所有项目

bash
for dir in ~/Library/Developer/Xcode/DerivedData/-; do
[ -d $dir ] || continue
NAME=$(basename $dir | sed s/-[a-z]*$//)
WORKSPACE=$(plutil -extract WorkspacePath raw $dir/info.plist 2>/dev/null || echo unknown)
LAST_ACCESS=$(plutil -extract LastAccessedDate raw $dir/info.plist 2>/dev/null || echo unknown)
echo $NAME | $WORKSPACE | 最后访问: $LAST_ACCESS
done

项目的构建历史

解析 LogStoreManifest.plist 以获取结构化的构建数据。这是最可靠的数据来源——它包含每次构建的时间、错误/警告计数和方案信息,无需解压日志。

bash

将 PROJECT_DIR 替换为项目的 DerivedData 文件夹


查找方法:ls ~/Library/Developer/Xcode/DerivedData/ | grep -i 项目名称


PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
MANIFEST=$PROJECT_DIR/Logs/Build/LogStoreManifest.plist

plutil -convert json -o - $MANIFEST 2>/dev/null | python3 -c
import json, sys
from datetime import datetime, timezone, timedelta

data = json.load(sys.stdin)
EPOCH = datetime(2001, 1, 1, tzinfo=timezone.utc)
builds = []

for uid, log in data.get(logs, {}).items():
start = log.get(timeStartedRecording, 0)
stop = log.get(timeStoppedRecording, 0)
duration = stop - start
obs = log.get(primaryObservable, {})
dt = EPOCH + timedelta(seconds=start)
builds.append({
date: dt.strftime(%Y-%m-%d %H:%M),
duration: f{duration:.1f}s,
scheme: log.get(schemeIdentifier-schemeName, ?),
status: obs.get(highLevelStatus, ?),
errors: obs.get(totalNumberOfErrors, 0),
warnings: obs.get(totalNumberOfWarnings, 0),
analyzer: obs.get(totalNumberOfAnalyzerIssues, 0),
file: log.get(fileName, ),
})

builds.sort(key=lambda b: b[date], reverse=True)
for b in builds:
status = {S: OK, W: 警告, E: 错误}.get(b[status], b[status])
print(f\{b[date]} {b[duration]:>8s} {status:<10s} {b[errors]}E {b[warnings]}W {b[analyzer]}A [{b[scheme]}]\)

将 项目名称 替换为实际项目名称(不区分大小写的 grep 匹配即可)。

状态码: S = 成功,W = 成功但有警告,E = 失败且有错误

最新构建摘要(所有项目)

bash
for dir in ~/Library/Developer/Xcode/DerivedData/-; do
[ -d $dir ] || continue
MANIFEST=$dir/Logs/Build/LogStoreManifest.plist
[ -f $MANIFEST ] || continue
NAME=$(basename $dir | sed s/-[a-z]*$//)

plutil -convert json -o - $MANIFEST 2>/dev/null | python3 -c
import json, sys
from datetime import datetime, timezone, timedelta

data = json.load(sys.stdin)
EPOCH = datetime(2001, 1, 1, tzinfo=timezone.utc)
name = $NAME
latest = None

for uid, log in data.get(logs, {}).items():
start = log.get(timeStartedRecording, 0)
if latest is None or start > latest[0]:
latest = (start, log)

if latest:
start, log = latest
stop = log.get(timeStoppedRecording, 0)
obs = log.get(primaryObservable, {})
dt = EPOCH + timedelta(seconds=start)
duration = stop - start
status = {S: OK, W: 警告, E: 错误}.get(obs.get(highLevelStatus, ?), ?)
print(f\{name:<30s} {dt.strftime(%Y-%m-%d %H:%M)} {duration:>6.1f}s {status:<5s} {obs.get(totalNumberOfErrors,0)}E {obs.get(totalNumberOfWarnings,0)}W\)
2>/dev/null
done

从构建日志中提取警告和错误

bash

查找项目最新的 xcactivitylog


PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
LATESTLOG=$(ls -t $PROJECTDIR/Logs/Build/*.xcactivitylog 2>/dev/null | head -1)

提取警告

gunzip -c $LATEST_LOG 2>/dev/null | strings | grep -E \.swift:[0-9]+:[0-9]+: warning: | sort -u

提取错误

gunzip -c $LATEST_LOG 2>/dev/null | strings | grep -E \.swift:[0-9]+:[0-9]+: error: | sort -u

警告摘要(按类型分组)

bash
PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
LATESTLOG=$(ls -t $PROJECTDIR/Logs/Build/*.xcactivitylog 2>/dev/null | head -1)

gunzip -c $LATEST_LOG 2>/dev/null | strings \
| grep -oE warning: .* \
| sed s/\[.//; s/[^]//g \
| sort | uniq -c | sort -rn | head -20

构建步骤耗时分析(查找慢速步骤)

xcactivitylog 包含每个任务的 TaskMetrics JSON 数据,其中包含以微秒为单位的挂钟时间。

bash
PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
LATESTLOG=$(ls -t $PROJECTDIR/Logs/Build/*.xcactivitylog 2>/dev/null | head -1)

gunzip -c $LATEST_LOG 2>/dev/null | strings \
| grep -o {wcDuration:[^}]*} \
| python3 -c
import json, sys

tasks = []
for line in sys.stdin:
try:
m = json.loads(line.strip())
tasks.append(m)
except: pass

tasks.sort(key=lambda t: t.get(wcDuration, 0), reverse=True)
print(f任务总数: {len(tasks)})
print(f最慢的10个任务(挂钟时间,微秒):)
for i, t in enumerate(tasks[:10]):
wc = t[wcDuration]
rss = t.get(max

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 xcode-build-analyzer-1776187880 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 xcode-build-analyzer-1776187880 技能

通过命令行安装

skillhub install xcode-build-analyzer-1776187880

下载

⬇ 下载 xcode-build-analyzer v1.2.0(免费)

文件大小: 4.85 KB | 发布时间: 2026-4-15 11:09

v1.2.0 最新 2026-4-15 11:09
Add git worktree detection: CLI builds from worktrees now show branch name and worktree path alongside build product timestamps.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部