脚本查询库地址

根据Podfile、Podfile.lock罗列库地址

920 发布: 2026/1/1 10:24 本文总阅读量

注意

  • 脚本、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