注意
- 脚本、Podfile、Podfile.lock要放到同一目录下
脚本
#!/bin/bash
# 强制设置UTF-8编码,解决乱码问题
export LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
# 最终生成的JSON文件名
JSON_FILE="pod_info.json"
# 函数:终极纯净提取Pod名(每个库名顶格单行显示,无前置空格、无冗余字符)
extract_pod_names() {
local podfile_path="$1"
# 步骤1:过滤有效Pod行(仅保留非注释行,且包含 pod 'xxx' 或 pod "xxx")
# 步骤2:彻底删除所有"pod"字符串(无论位置,确保无残留)
# 步骤3:提取单/双引号内的核心库名(排除逗号、斜杠、空格等冗余内容)
# 步骤4:处理子spec(如A/B/C只保留A)
# 步骤5:去重、过滤空行、过滤残留pod
# 步骤6:核心优化:剔除每个Pod名前的所有前置空格,实现顶格显示
grep -E '^[[:space:]]*[^#]*pod\s+['\''"]' "$podfile_path" | \
sed -E 's/pod//g' | \
sed -E 's/['\''"]([^'\''",\/[:space:]]+)[^'\''"]*['\''"].*/\1/g' | \
sed -E 's/\/.*//g' | \
sort -u | \
grep -v '^$' | \
grep -v '^[[:space:]]*$' | \
grep -v 'pod' | \
sed -E 's/^[[:space:]]+//g' # 剔除每行开头的所有前置空格,顶格显示
}
# 函数:查询单个Pod的GitHub地址和官网地址(解决卡住问题,快速非阻塞)
query_pod_info() {
local pod_name="$1"
local git_url="未找到"
local homepage="未找到"
# 跳过空的库名或pod关键字(双重保险)
if [ -z "$pod_name" ] || [ "$pod_name" = "pod" ]; then
echo "$git_url $homepage"
return 1
fi
# 核心优化:解决pod search卡住问题
# 1. 添加--simple参数:简化输出,大幅提升查询速度,避免阻塞
# 2. 严格限制输出行数:head -n 20,避免冗余内容处理
# 3. 彻底屏蔽所有无关报错和交互提示,后台执行不阻塞
local pod_search_info
pod_search_info=$(pod search "$pod_name" --simple 2>/dev/null | head -n 20)
if [ -n "$pod_search_info" ]; then
# 提取GitHub地址(匹配Source: 后面的内容,兼容顶格/缩进)
local source_line
source_line=$(echo "$pod_search_info" | grep -E '^[[:space:]]*- Source:[[:space:]]*' | head -n 1)
if [ -n "$source_line" ]; then
git_url=$(echo "$source_line" | sed -E 's/^[[:space:]]*- Source:[[:space:]]*//g')
fi
# 提取官网地址(匹配Homepage: 后面的内容,兼容顶格/缩进)
local homepage_line
homepage_line=$(echo "$pod_search_info" | grep -E '^[[:space:]]*- Homepage:[[:space:]]*' | head -n 1)
if [ -n "$homepage_line" ]; then
homepage=$(echo "$homepage_line" | sed -E 's/^[[:space:]]*- Homepage:[[:space:]]*//g')
fi
fi
# 备用方案:若pod search仍失败,尝试pod spec cat(双重保障,避免卡住)
if [ "$git_url" = "未找到" ] && [ "$homepage" = "未找到" ]; then
local pod_spec_info=$(pod spec cat "$pod_name" 2>/dev/null | head -n 50)
if [ -n "$pod_spec_info" ]; then
git_url=$(echo "$pod_spec_info" | grep -o '"git": "[^"]*' | sed 's/"git": "//' | head -n 1)
homepage=$(echo "$pod_spec_info" | grep -o '"homepage": "[^"]*' | sed 's/"homepage": "//' | head -n 1)
# 补全默认值
[ -z "$git_url" ] && git_url="未找到"
[ -z "$homepage" ] && homepage="未找到"
fi
fi
# 返回两个地址(用空格分隔,后续拆分)
echo "$git_url $homepage"
return 0
}
# 函数:生成标准JSON文件(带缩进,格式美观)
generate_json_file() {
local pod_names="$1"
# 统计Pod总数(按行统计,精准无误差)
local total_pod=$(echo "$pod_names" | wc -l | sed -E 's/^[[:space:]]*//g')
local current_count=0 # 当前查询计数器
# 1. 初始化JSON内容
local json_content="["
local first_item=1 # 标记第一个JSON元素
local pod_list=() # 存储Pod名列表,用于循环
# 将分行的Pod名存入数组(去空)
while read -r pod; do
if [ -n "$pod" ] && [ "$pod" != "pod" ]; then
pod_list+=("$pod")
fi
done <<< "$pod_names"
# 2. 循环遍历每个Pod,拼接JSON对象(非阻塞,进度流畅)
for pod in "${pod_list[@]}"; do
# 更新计数器,输出进度提示
current_count=$((current_count + 1))
echo "🔍 正在查询 [$current_count/$total_pod]:$pod"
# 查询GitHub和官网地址(快速返回,不阻塞)
pod_info=$(query_pod_info "$pod")
git_url=$(echo "$pod_info" | awk '{print $1;}')
# 处理官网地址包含空格的情况
homepage=$(echo "$pod_info" | awk '{for(i=2;i<=NF;i++) printf "%s ",$i; print ""}' | sed -E 's/ $//g')
# 拼接JSON对象
if [ $first_item -eq 1 ]; then
json_content="${json_content}"$'\n {'
first_item=0
else
json_content="${json_content},"$'\n {'
fi
json_content="${json_content}"$'\n "name": "'"$pod"'",'
json_content="${json_content}"$'\n "github": "'"$git_url"'",'
json_content="${json_content}"$'\n "site": "'"$homepage"'"'
json_content="${json_content}"$'\n }'
done
# 3. 补充JSON结尾
json_content="${json_content}"$'\n]'
# 4. 格式化JSON
if command -v jq &> /dev/null; then
echo "$json_content" | jq '.' > "$JSON_FILE"
else
echo "$json_content" > "$JSON_FILE"
fi
echo -e "\n✅ JSON文件已生成:$(pwd)/$JSON_FILE"
return 0
}
# 主程序入口
main() {
local podfile_path="Podfile"
# 1. 判断Podfile是否存在
if [ ! -f "$podfile_path" ]; then
echo "❌ 错误:当前目录未找到Podfile文件!"
exit 1
fi
# 2. 提取绝对纯净的Pod名(顶格单行,无前置空格)
echo "========== 开始提取Podfile中的三方库 =========="
local pod_names=$(extract_pod_names "$podfile_path")
if [ -z "$pod_names" ]; then
echo "ℹ️ 提示:未提取到有效三方库,请检查Podfile配置!"
exit 0
fi
local total_pod=$(echo "$pod_names" | wc -l | sed -E 's/^[[:space:]]*//g')
echo "✅ 提取完成,共找到 $total_pod 个纯净三方库:"
# 顶格单行打印Pod名,排版整洁
echo "$pod_names"
echo -e "\n========== 开始查询地址并生成JSON文件 ==========\n"
# 3. 生成JSON文件(快速非阻塞)
generate_json_file "$pod_names"
echo -e "\n========== 所有操作执行完成 =========="
}
# 执行主程序
main
日志
~/Desktop/play_pod/pod2 % chmod +x pod_query_url.sh
~/Desktop/play_pod/pod2 % ./pod_query_url.sh
========== 开始提取Podfile中的三方库 ==========
✅ 提取完成,共找到 29 个纯净三方库:
AFNetworking
AliPay
AWSS3
Bugly
CWStatusBarNotification
DZNEmptyDataSet
HPGrowingTextView
IQKeyboardManager
JKCategories
lottie-ios
Masonry
MBProgressHUD
MJRefresh
mob_sharesdk
OpenSSL-for-iOS
PayPalCheckout
Qiniu
SDCycleScrollView
SDWebImage
SharetraceSDK
Socket.IO-Client-Swift
SVGAPlayer
TXIMSDK_Plus_iOS
TXLiteAVSDK_Live
TXLiteAVSDK_Professional
TZImagePickerController
YYText
YYWebImage
ZFPlayer
========== 开始查询地址并生成JSON文件 ==========
🔍 正在查询 [1/29]:AFNetworking
🔍 正在查询 [2/29]:AliPay
🔍 正在查询 [3/29]:AWSS3
🔍 正在查询 [4/29]:Bugly
🔍 正在查询 [5/29]:CWStatusBarNotification
🔍 正在查询 [6/29]:DZNEmptyDataSet
🔍 正在查询 [7/29]:HPGrowingTextView
🔍 正在查询 [8/29]:IQKeyboardManager
🔍 正在查询 [9/29]:JKCategories
🔍 正在查询 [10/29]:lottie-ios
🔍 正在查询 [11/29]:Masonry
🔍 正在查询 [12/29]:MBProgressHUD
🔍 正在查询 [13/29]:MJRefresh
🔍 正在查询 [14/29]:mob_sharesdk
🔍 正在查询 [15/29]:OpenSSL-for-iOS
🔍 正在查询 [16/29]:PayPalCheckout
🔍 正在查询 [17/29]:Qiniu
🔍 正在查询 [18/29]:SDCycleScrollView
🔍 正在查询 [19/29]:SDWebImage
🔍 正在查询 [20/29]:SharetraceSDK
🔍 正在查询 [21/29]:Socket.IO-Client-Swift
🔍 正在查询 [22/29]:SVGAPlayer
🔍 正在查询 [23/29]:TXIMSDK_Plus_iOS
🔍 正在查询 [24/29]:TXLiteAVSDK_Live
🔍 正在查询 [25/29]:TXLiteAVSDK_Professional
🔍 正在查询 [26/29]:TZImagePickerController
🔍 正在查询 [27/29]:YYText
🔍 正在查询 [28/29]:YYWebImage
🔍 正在查询 [29/29]:ZFPlayer
✅ JSON文件已生成:/Users/yunbao02/Desktop/play_pod/pod2/pod_info.json
========== 所有操作执行完成 ==========
测试过程:个别找不到
#!/bin/bash
# 强制设置UTF-8编码,解决乱码问题
export LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
# 最终生成的JSON文件名
JSON_FILE="pod_info.json"
# 函数:终极纯净提取Pod名(彻底剔除pod关键字、引号、版本号、子spec、注释、空行)
extract_pod_names() {
local podfile_path="$1"
# 步骤1:过滤有效Pod行(仅保留非注释行,且包含 pod 'xxx' 或 pod "xxx")
# 步骤2:彻底删除所有"pod"字符串(无论位置,确保无残留)
# 步骤3:提取单/双引号内的核心库名(排除逗号、斜杠、空格等冗余内容)
# 步骤4:处理子spec(如A/B/C只保留A)
# 步骤5:去重、过滤空行、过滤纯特殊字符行、过滤残留pod
grep -E '^[[:space:]]*[^#]*pod\s+['\''"]' "$podfile_path" | \
sed -E 's/pod//g' | \
sed -E 's/['\''"]([^'\''",\/[:space:]]+)[^'\''"]*['\''"].*/\1/g' | \
sed -E 's/\/.*//g' | \
sort -u | \
grep -v '^$' | \
grep -v '^[[:space:]]*$' | \
grep -v 'pod'
}
# 函数:查询单个Pod的GitHub地址和官网地址(返回两个值:github地址 官网地址)
query_pod_info() {
local pod_name="$1"
local git_url=""
local homepage=""
# 跳过空的库名或pod关键字(双重保险)
if [ -z "$pod_name" ] || [ "$pod_name" = "pod" ]; then
echo "$git_url $homepage"
return 1
fi
# 用pod spec cat获取Pod完整信息(优先本地缓存,无网络也可查)
local pod_spec_info=$(pod spec cat "$pod_name" 2>/dev/null)
if [ -n "$pod_spec_info" ]; then
# 精准提取GitHub地址(只取第一个有效地址)
git_url=$(echo "$pod_spec_info" | grep -o '"git": "[^"]*' | sed 's/"git": "//' | head -n 1)
# 精准提取官网地址(只取第一个有效地址)
homepage=$(echo "$pod_spec_info" | grep -o '"homepage": "[^"]*' | sed 's/"homepage": "//' | head -n 1)
fi
# 若未提取到,赋值为"未找到"
[ -z "$git_url" ] && git_url="未找到"
[ -z "$homepage" ] && homepage="未找到"
# 返回两个地址(用空格分隔,后续拆分)
echo "$git_url $homepage"
return 0
}
# 函数:生成标准JSON文件(带缩进,格式美观)
generate_json_file() {
local pod_names="$1"
# 1. 初始化JSON内容(开头数组符号,后续拼接元素)
local json_content="["
local first_item=1 # 标记是否是第一个JSON元素,用于处理逗号
# 2. 循环遍历每个Pod,拼接JSON对象
for pod in $pod_names; do
# 跳过无效库名
if [ -z "$pod" ] || [ "$pod" = "pod" ]; then
continue
fi
# 查询GitHub和官网地址
pod_info=$(query_pod_info "$pod")
git_url=$(echo "$pod_info" | awk '{print $1;}')
# 处理官网地址包含空格的情况(awk取从第2列开始的所有内容)
homepage=$(echo "$pod_info" | awk '{for(i=2;i<=NF;i++) printf "%s ",$i; print ""}' | sed -E 's/ $//g')
# 拼接JSON对象(带缩进,符合审美)
if [ $first_item -eq 1 ]; then
# 第一个元素,前面不加逗号
json_content="${json_content}"$'\n {'
first_item=0
else
# 非第一个元素,前面加逗号
json_content="${json_content},"$'\n {'
fi
json_content="${json_content}"$'\n "name": "'"$pod"'",'
json_content="${json_content}"$'\n "github": "'"$git_url"'",'
json_content="${json_content}"$'\n "site": "'"$homepage"'"'
json_content="${json_content}"$'\n }'
done
# 3. 补充JSON结尾,完成数组拼接
json_content="${json_content}"$'\n]'
# 4. 格式化JSON(优先用jq工具,无jq则直接写入,保证格式基本美观)
if command -v jq &> /dev/null; then
# 用jq格式化,缩进2个空格,更美观
echo "$json_content" | jq '.' > "$JSON_FILE"
else
# 无jq,直接写入缩进后的内容,格式仍合规
echo "$json_content" > "$JSON_FILE"
fi
echo "JSON文件已生成:$(pwd)/$JSON_FILE"
return 0
}
# 主程序入口
main() {
local podfile_path="Podfile"
# 1. 判断Podfile是否存在
if [ ! -f "$podfile_path" ]; then
echo "错误:当前目录未找到Podfile文件!"
exit 1
fi
# 2. 提取绝对纯净的Pod名
echo "========== 正在提取Podfile中的三方库 =========="
local pod_names=$(extract_pod_names "$podfile_path")
if [ -z "$pod_names" ]; then
echo "提示:未提取到有效三方库,请检查Podfile配置!"
exit 0
fi
echo "提取到的纯净三方库:$pod_names"
echo -e "\n========== 开始查询地址并生成JSON文件 ==========\n"
# 3. 生成JSON文件
generate_json_file "$pod_names"
echo -e "\n========== 操作完成 =========="
}
# 执行主程序
main
测试过程:直接命令行输出
#!/bin/bash
# 强制设置UTF-8编码,解决乱码问题
export LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
# 函数:终极纯净提取Pod名(彻底剔除pod关键字、引号、版本号、子spec、注释、空行)
extract_pod_names() {
local podfile_path="$1"
# 步骤1:过滤有效Pod行(仅保留非注释行,且包含 pod 'xxx' 或 pod "xxx")
# 步骤2:彻底删除所有"pod"字符串(无论位置,确保无残留)
# 步骤3:提取单/双引号内的核心库名(排除逗号、斜杠、空格等冗余内容)
# 步骤4:处理子spec(如A/B/C只保留A)
# 步骤5:去重、过滤空行、过滤纯特殊字符行
# 步骤6:最终过滤掉可能残留的"pod"(双重保险)
grep -E '^[[:space:]]*[^#]*pod\s+['\''"]' "$podfile_path" | \
sed -E 's/pod//g' | \
sed -E 's/['\''"]([^'\''",\/[:space:]]+)[^'\''"]*['\''"].*/\1/g' | \
sed -E 's/\/.*//g' | \
sort -u | \
grep -v '^$' | \
grep -v '^[[:space:]]*$' | \
grep -v 'pod'
}
# 函数:查询单个Pod的GitHub地址和官方文档地址
query_pod_info() {
local pod_name="$1"
# 跳过空的库名(双重保险)
if [ -z "$pod_name" ] || [ "$pod_name" = "pod" ]; then
return 1
fi
# 用pod spec cat获取Pod完整信息(优先本地缓存,无网络也可查)
local pod_spec_info=$(pod spec cat "$pod_name" 2>/dev/null)
if [ -z "$pod_spec_info" ]; then
echo " GitHub地址:未找到(私有Pod/非公开Pod)"
echo " 官方文档:未找到(私有Pod/非公开Pod)"
return 1
fi
# 精准提取GitHub地址(只取第一个有效地址)
local git_url=$(echo "$pod_spec_info" | grep -o '"git": "[^"]*' | sed 's/"git": "//' | head -n 1)
# 精准提取官方文档地址(只取第一个有效地址)
local homepage=$(echo "$pod_spec_info" | grep -o '"homepage": "[^"]*' | sed 's/"homepage": "//' | head -n 1)
# 输出结果
if [ -z "$git_url" ]; then
echo " GitHub地址:未公开"
else
echo " GitHub地址:$git_url"
fi
if [ -z "$homepage" ]; then
echo " 官方文档:未公开"
else
echo " 官方文档:$homepage"
fi
return 0
}
# 主程序入口
main() {
local podfile_path="Podfile"
# 1. 判断Podfile是否存在
if [ ! -f "$podfile_path" ]; then
echo "错误:当前目录未找到Podfile文件!"
exit 1
fi
# 2. 提取绝对纯净的Pod名
echo "========== 正在提取Podfile中的三方库 =========="
local pod_names=$(extract_pod_names "$podfile_path")
if [ -z "$pod_names" ]; then
echo "提示:未提取到有效三方库,请检查Podfile配置!"
exit 0
fi
echo "提取到的纯净三方库:$pod_names"
echo -e "\n========== 开始查询GitHub/官方文档地址 ==========\n"
# 3. 循环查询每个纯净Pod的信息(跳过无效名称)
for pod in $pod_names; do
# 跳过pod关键字和空名称(最终保险)
if [ "$pod" = "pod" ] || [ -z "$pod" ]; then
continue
fi
echo "库名:$pod"
query_pod_info "$pod"
echo "--------------------------------------------------"
done
echo "========== 查询完成 =========="
}
# 执行主程序
main