Framework制作 Cocoapods私有庫(kù)

Framework制作教程
  1. 詳細(xì)步驟圖
  2. 創(chuàng)建源碼項(xiàng)目
  3. 創(chuàng)建對(duì)外發(fā)布的Framework項(xiàng)目
一、詳細(xì)步驟圖
FM制作流程.png
二、創(chuàng)建源碼項(xiàng)目

以MAWebKit為例, 源碼項(xiàng)目統(tǒng)一都是放到GitLab源碼Group下。

1. 創(chuàng)建Framework項(xiàng)目

Xcode -> File -> New -> Project 選擇Cocoa Touch Framework模板,新建項(xiàng)目MAWebKit,勾選Include Unit Tests 為寫單元測(cè)試和Sonar掃描做準(zhǔn)備。
點(diǎn)擊下一步選擇合適的目錄保存。


image.png
2. 新生成的項(xiàng)目結(jié)構(gòu)如圖
image.png
3. 多個(gè)組件配置

如果一個(gè)組件庫(kù)包含多個(gè)組件,類似Cocoapods的subspec。那需要新建其他組件的Framework。 例如:MAWebKitCore、MAWebKitNFC、MAWebKitGPS、MAWebKitFace

  • Project中選中項(xiàng)目文件,展示出Target列表,最下方選擇 + 新建Target。


    image.png
  • 選擇Cocoa Touch Framework,填寫必要項(xiàng),該處可以不勾選UnitTests,點(diǎn)擊完成創(chuàng)建。


    image.png
  • 按照上述兩步驟依次創(chuàng)建MAWebKitNFC、MAWebKitGPS、MAWebKitFace。創(chuàng)建完成后整體項(xiàng) 目結(jié)構(gòu)如圖。


    image.png
4. 配置項(xiàng)目
  • 配置所有Target的Deployment Target 為9.0
  • 配置所有Target的版本號(hào)Version和Build
  • 反選所有Target的Automatically Manage Signing(自動(dòng)管理簽名)
  • 配置所有Target的Build Settings,Defines Module 改為 No (不生成module文件)

按照目前這種結(jié)構(gòu)產(chǎn)生的文件目錄,在項(xiàng)目目錄下比較亂,可以把所有info.plist文件所在文件夾整 理到同一個(gè)文件夾Supports下,步驟如下:

  • 項(xiàng)目中新建Group,命名為Supports
  • 將所有info.plist所在文件夾的Group直接在Xcode中拖到Supports的Group下。
  • 配置Build Settings中的info.plist File的值為: Supports/MAWebKit/info.plist (MAWebKit是 Target名字),由于info.plist文件的物理位置發(fā)生改變,原來(lái)的配置無(wú)法找到,所以需要重新進(jìn)行配置


    image.png

    image.png

    image.png

    image.png
5. 配置Framework之間的依賴關(guān)系

Framework之間的依賴關(guān)系分為兩種:
項(xiàng)目?jī)?nèi)的Framework依賴 和 跨項(xiàng)目的Framework依賴 。

(1) 項(xiàng)目?jī)?nèi)的Framework依賴: 直接配置
例如:MAWebKitNFC依賴于MAWebKitCore、 MAWebKitGPS依賴于MAWebKitCore

  • 選中MAWebKitNFC的Target,點(diǎn)擊General標(biāo)簽,
  • Frameworks and Libraries 中選擇加號(hào),選擇 MAWebKitCore ,同時(shí)選
    擇 Do Not Embed 。
  • 注意點(diǎn):如果MAWebKitCore中有Category,則需要在MAWebKitNFC的Build Settings中配置 other linker flag 增加 -ObjC 選項(xiàng)。
image.png

(2) 跨項(xiàng)目的Framework依賴:cocoapods管理
例如:MAWebKitGPS依賴?芽的 MAGPSKit ,MAWebKitPhoto依賴第三方
庫(kù) TZImagePickerController ,這樣我們就通過(guò)cocoapods來(lái)進(jìn)行管理

  • 打開終端Terminal,cd到項(xiàng)目所在目錄
  • 運(yùn)行命令: pod init , 這樣會(huì)針對(duì)所有的Target生成一個(gè)Pofile文件
image.png
  • 修改平臺(tái)的版本號(hào)。
  • 給target添加私有庫(kù)或第三方庫(kù)依賴的配置。
  • 刪除不需要配置依賴的target項(xiàng)。
  • 開啟 use_frameworks! 配置,為了打包的時(shí)候不將依賴的第三方庫(kù)打到Framework中。
  • 在終端中運(yùn)行命令: pod install ,生成workspace文件、導(dǎo)入依賴的第三方庫(kù)。
6. 源碼目錄結(jié)構(gòu)規(guī)劃

為了方便統(tǒng)一管理主framework和各個(gè)subspec的framework源碼,將所有源碼按照以下步驟,進(jìn)行集中 管理。

  • 創(chuàng)建源碼總目錄文件夾 MAWebKit ,用于存儲(chǔ)資源文件和源碼文件 為了方便源碼調(diào)試,才設(shè)計(jì)這樣的目錄結(jié)構(gòu)(參考了源碼cocoapods私有庫(kù)目錄結(jié)構(gòu))

  • 創(chuàng)建資源文件存儲(chǔ)文件夾( Assets ),并創(chuàng)建bundle資源文件( MAWebKit.bundle ),如:MAWebKit/Assets/MAWebKit.bundle


    image.png
  • 創(chuàng)建源碼存儲(chǔ)文件夾( Classes ),并在其下依次創(chuàng)建各個(gè)target的源碼文件夾,如:
    MAWebKit/Classes/MAWebKit , MAWebKit/Classes/MAWebKitCore , MAWebKit/Classes/MAWebKitGPS

  • 在各個(gè)target文件夾下依次創(chuàng)建公有文件夾( Public )和私有文件夾( Private ),如:MAWebKit/Classes/MAWebKit/Public , MAWebKit/Classes/MAWebKit/Private


    image.png
  • 將Supports下的各個(gè)target的頭文件,依次移動(dòng)到各自的Public目錄下

  • 打開framework工程,依次刪除Supports目錄下相關(guān)頭文件的引用

  • 右鍵點(diǎn)擊 Add Files To ”MAWebKit“ ,添加Assets到工程中

  • 右鍵點(diǎn)擊 Add Files To ”MAWebKit“ ,添加Classes到工程中

  • 依次編輯各個(gè)target的Public中的頭文件為對(duì)應(yīng)的framework,且選擇可?范圍為public

  • 依次編輯各個(gè)target的Public中的總頭文件(如 MAWebKitCore.h ), 添加版本號(hào)備注信息, 方便集成方快速知道當(dāng)前所用組件的版本號(hào)


    image.png

    image.png

    image.png

    image.png
7. 編寫Framework源碼

選中Public或者Private目錄,右鍵,新建類文件,例如UIView+MAPrivate.h、 UIView+MAPrivate.m。選擇對(duì)應(yīng)的Framework(MAWebKitCore)的target。

image.png
  • 配置對(duì)外暴露的.h文件
    選中.h文件,直接在最右側(cè)的屬性欄中選擇可?范圍(Private/Project/Public)。
    在Build Phases的Headers中直接拖拽進(jìn)行配置。
    將所有設(shè)置為Public可?范圍的.h文件引入到和Framework同名的.h文件中,統(tǒng)一使用尖括號(hào) <>的方式引入。
    以MAWebKitCore的Framework為例:
#import <MAWebKitCore/MAWebViewController.h>
// ... ...
  • 源碼編寫規(guī)則
    源碼中引入其他類的規(guī)范
    引入統(tǒng)一target內(nèi)的類文件直接 #import "類名.h" 即可。
    引入依賴的target或者第三方庫(kù)的,使用 #import <第三方庫(kù)(Framework)名/全量的頭文件名.h>
    源碼的編寫要符合sonar掃描的標(biāo)準(zhǔn)規(guī)則
    所有能處理的警告信息都要處理掉
    對(duì)外暴露的使用方法盡可能的簡(jiǎn)單
    盡量沒(méi)有初始化操作
8. 打包Framework操作

編寫打包Framework腳本(最后有參考),命名為make-framework(可以其他名稱),可以直接將 make-framework下載下來(lái)打包使用。

  • 為了方便以后的打包,建議將 make-framework配置到系統(tǒng)的環(huán)境變量PATH中去,這樣可以直接執(zhí)行 make-framework xxxx 命令來(lái)進(jìn)行打包操作。

  • make-framework腳本使用方法


    image.png
  • 由于打包腳本要求必須有workspace文件,所以如果項(xiàng)目中沒(méi)有workspace文件需要?jiǎng)?chuàng)建一個(gè)。
    Xcode -> File -> New -> Workspace 新建workspace,保存目錄xcodeproj放在同一目錄下 即可。
    打開新建的workspace,右鍵添加文件到workspace,選擇對(duì)應(yīng)的xcodeproj即可。

  • 如果一個(gè)項(xiàng)目中有很多個(gè)Framework(類似我們舉例的MAWebKit),如果每個(gè)Framework都手動(dòng) 打包,這樣會(huì)很麻煩,也很容易出錯(cuò),這樣我們可以寫一個(gè)批量打包腳本。

# 批量打包腳本示例 
maia-framework -w MAWebKit -s MAWebKit -p 
maia-framework -w MAWebKit -s MAWebKitCore -p 
maia-framework -w MAWebKit -s MAWebKitPhoto -p 
maia-framework -w MAWebKit -s MAWebKitAudio -p 
maia-framework -w MAWebKit -s MAWebKitNFC -p 
maia-framework -w MAWebKit -s MAWebKitCodeScan -p 
maia-framework -w MAWebKit -s MAWebKitGPS -p 
maia-framework -w MAWebKit -s MAWebKitFace -o
9. 創(chuàng)建podspec文件

有時(shí)候?yàn)榱朔奖愣ㄎ粏?wèn)題,需要通過(guò)源碼的方式進(jìn)行調(diào)試,這就需要?jiǎng)?chuàng)建源碼podspec。 我們可以通過(guò)命令行來(lái)創(chuàng)建cocoapods的配置podspec文件。

  • 打開終端Terminal,進(jìn)入項(xiàng)目目錄
  • 運(yùn)行命令: pod spec create 庫(kù)名(MAWebKit) ,這樣會(huì)生成一個(gè)MAWebKit.podspec文件。
  • 配置源碼podspec文件,根據(jù)自己組件的具體情況,指定默認(rèn)subspec,比如:組件MAWebKit,默認(rèn)依賴核心組件MAWebKitCore,那么就指定默認(rèn)subspec為Core 條碼掃描MACodeScan,默認(rèn)不依賴任何subspec,因?yàn)樗膬蓚€(gè)subspec是互斥的
三、創(chuàng)建對(duì)外發(fā)布的Framework項(xiàng)目
  1. 創(chuàng)建腳本maia-project(最后有參考),只要運(yùn)行命令,按 照步驟一步一步的操作下去,會(huì)自動(dòng)創(chuàng)建Assets、Frameworks、庫(kù)名.podspec文件,同時(shí)會(huì)進(jìn)行g(shù)it的 關(guān)聯(lián)操作。
  • Assets:放置資源文件的位置
  • Frameworks:放置所有framework的位置
  • 庫(kù)名.podspec:cocoapods的配置文件
腳本參考

mark-framework

#!/bin/sh

function usage() {
  echo "************************************************"
    echo "-s scheme的名稱,必填"
  echo "-w workspace名稱,可選項(xiàng),默認(rèn)從項(xiàng)目中檢測(cè)xcworkspace文件"
    echo "-f 打包最終生成的framework的名字,可選參數(shù),如果沒(méi)有默認(rèn)使用scheme的內(nèi)容"
  echo "-o 打包成功后是否自動(dòng)打開framework所在的文件夾,默認(rèn)不打開"
  echo "-p 是否需要運(yùn)行pod install,默認(rèn)否"
  echo "-d 是否以Debug的配置進(jìn)行打包,默認(rèn)使用Release"
    echo "例: maia-framework -w MAWebKit -s MAWebKit -f MAWebKit -o -p -d"
    echo "************************************************"
  exit 1;
}

######################
# Options
######################

CONFIGURATION=Release
WORKSPACE_NAME=
SCHEME_NAME=
FRAMEWORK_NAME=
REVEAL_ARCHIVE_IN_FINDER=false
POD_INSTALL=false

######################
# Read Params
######################
while getopts "w:s:f:opd" arg
do
  case $arg in
    w )
      WORKSPACE_NAME=$OPTARG
      ;;
    s )
      SCHEME_NAME=$OPTARG
      ;;
    f )
      FRAMEWORK_NAME=$OPTARG
      ;;
    o )
      REVEAL_ARCHIVE_IN_FINDER=true
      ;;
    p )
      POD_INSTALL=true
      ;;
    d )
      CONFIGURATION=Debug
      ;;
    ? )
      usage
      ;;
  esac
done

if [[ ${SCHEME_NAME} == "" ]]; then
  echo "scheme必填, 使用-s來(lái)指定scheme。"
  usage
fi

if [[ ${FRAMEWORK_NAME} == "" ]]; then
  FRAMEWORK_NAME=${SCHEME_NAME}
fi

function printParams() {
  echo "****************************"
  echo "workspace: ${WORKSPACE_NAME}"
  echo "scheme: ${SCHEME_NAME}"
  echo "FRAMEWORK: ${FRAMEWORK_NAME}"
  echo "Pod install: ${POD_INSTALL}"
  echo "Reveal In Finder: ${REVEAL_ARCHIVE_IN_FINDER}"
  echo "****************************"
}
printParams

ma_default_workspace=""
function check_default_workspace() {
  echo "\n------ xcode workspace checking ..."
  workspace_files=$(ls | grep .xcworkspace$ | wc -l)

  if [ ${workspace_files} == 1 ] ; then

    ma_default_workspace="`ls | grep .xcworkspace$ | sed -e 's/.xcworkspace//g'`"
    echo "檢測(cè)到workspace【 ${ma_default_workspace} 】"
  else
    echo "沒(méi)有找到xcode的workspace或者項(xiàng)目下有多個(gè)workspace文件,請(qǐng)自行檢查。"
    exit 1
  fi
}

check_default_workspace
if [[ ${WORKSPACE_NAME} == "" ]]; then
  WORKSPACE_NAME="${ma_default_workspace}"
fi

if [[ ${POD_INSTALL} = true ]]; then
  if [[ -f "Podfile" ]]; then
    echo "--- Removing Pods cache"
    rm -rf Podfile.lock
    rm -rf Pods

    pod install
  else
    echo "沒(méi)有找到Podfile文件"
    exit 1
  fi
fi

######################
# Directories
######################
FRAMEWORK_TARGET_PATH="${HOME}/Documents/MaiaFrameworks/${FRAMEWORK_NAME}"
SIMULATOR_BUILD_DIR="${FRAMEWORK_TARGET_PATH}/${CONFIGURATION}-iphonesimulator"
DEVICE_BUILD_DIR="${FRAMEWORK_TARGET_PATH}/${CONFIGURATION}-iphoneos"
SIMULATOR_LIBRARY_PATH="${SIMULATOR_BUILD_DIR}/${FRAMEWORK_NAME}.framework"
DEVICE_LIBRARY_PATH="${DEVICE_BUILD_DIR}/${FRAMEWORK_NAME}.framework"
UNIVERSAL_LIBRARY_DIR="${FRAMEWORK_TARGET_PATH}/${CONFIGURATION}-iphoneuniversal"
UNIVERSAL_LIBRARY_PATH="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"

function printDirs() {
  echo "----------------------------"
  echo "BUILD_DIR : ${FRAMEWORK_TARGET_PATH}"
  echo "SIMULATOR_LIBRARY_PATH : ${SIMULATOR_LIBRARY_PATH}"
  echo "DEVICE_LIBRARY_PATH : ${DEVICE_LIBRARY_PATH}"
  echo "UNIVERSAL_LIBRARY_DIR : ${UNIVERSAL_LIBRARY_DIR}"
  echo "FRAMEWORK : ${UNIVERSAL_LIBRARY_PATH}"
  echo "----------------------------"
}
printDirs

######################
# Create directory for universal
######################
rm -rf "${FRAMEWORK_TARGET_PATH}"

mkdir -p "${SIMULATOR_BUILD_DIR}"
mkdir -p "${DEVICE_BUILD_DIR}"
mkdir -p "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${UNIVERSAL_LIBRARY_PATH}"

######################
# Build Frameworks
######################
BUILD_SETTINGS="ONLY_ACTIVE_ARCH=NO CLANG_ENABLE_CODE_COVERAGE=NO MACH_O_TYPE=staticlib DEFINES_MODULE=NO"


######################
# Build Simulator Frameworks
######################

SIM_BUILD_SHELL_PREFIX="xcodebuild -workspace ${WORKSPACE_NAME}.xcworkspace -scheme ${SCHEME_NAME} -sdk iphonesimulator -configuration ${CONFIGURATION}"
SIM_BUILD_SHELL="${SIM_BUILD_SHELL_PREFIX} ${BUILD_SETTINGS} EXCLUDED_ARCHS=arm64 clean build"

echo "------ Build Simulator Framework ------"
echo "${SIM_BUILD_SHELL}"
${SIM_BUILD_SHELL} 2>&1

SIM_FRAMEWORK_TARGET_DIR=`${SIM_BUILD_SHELL_PREFIX} -showBuildSettings | grep "\<BUILT_PRODUCTS_DIR" | sed -e 's/BUILT_PRODUCTS_DIR = //g'`
echo "****** Simulator framework path:  ${SIM_FRAMEWORK_TARGET_DIR}"

SIM_COPY_SHELL="cp -r ${SIM_FRAMEWORK_TARGET_DIR}/${FRAMEWORK_NAME}.framework ${SIMULATOR_BUILD_DIR}"
echo "====== SIM COPY SHELL: ${SIM_COPY_SHELL}"
${SIM_COPY_SHELL}

######################
# Build Device Frameworks
######################
DEVICE_BUILD_SHELL_PREFIX="xcodebuild -workspace ${WORKSPACE_NAME}.xcworkspace -scheme ${SCHEME_NAME} -sdk iphoneos -configuration ${CONFIGURATION}"
DEVICE_BUILD_SHELL="${DEVICE_BUILD_SHELL_PREFIX} ${BUILD_SETTINGS} clean build"

echo "------ Build Device Framework ------"
echo "${DEVICE_BUILD_SHELL}"
${DEVICE_BUILD_SHELL} 2>&1

DEVICE_FRAMEWORK_TARGET_DIR=`${DEVICE_BUILD_SHELL_PREFIX} -showBuildSettings | grep "\<BUILT_PRODUCTS_DIR" | sed -e 's/BUILT_PRODUCTS_DIR = //g'`
echo "****** Device framework path:  ${DEVICE_FRAMEWORK_TARGET_DIR}"
DEVICE_COPY_SHELL="cp -r ${DEVICE_FRAMEWORK_TARGET_DIR}/${FRAMEWORK_NAME}.framework ${DEVICE_BUILD_DIR}"

echo "====== DEVICE COPY SHELL: ${DEVICE_COPY_SHELL}"
${DEVICE_COPY_SHELL}

######################
# Copy files Framework
######################
cp -r "${DEVICE_LIBRARY_PATH}/." "${UNIVERSAL_LIBRARY_PATH}"


######################
# Make an universal binary
######################
lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${UNIVERSAL_LIBRARY_PATH}/${FRAMEWORK_NAME}" | echo

# For Swift framework, Swiftmodule needs to be copied in the universal framework
if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${UNIVERSAL_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi

if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
cp -f ${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${UNIVERSAL_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi

cp -r "${UNIVERSAL_LIBRARY_PATH}" "${FRAMEWORK_TARGET_PATH}"

######################
# Move Final Bundles
######################
FRAMEWORK_FINAL_PATH="${FRAMEWORK_TARGET_PATH}/${FRAMEWORK_NAME}.framework"
FRAMEWORK_BUNDLES="${FRAMEWORK_FINAL_PATH}/*.bundle"

mv ${FRAMEWORK_BUNDLES} "${FRAMEWORK_TARGET_PATH}"

######################
# Remove Bundles
######################
SIMULATOR_LIBRARY_BUNDLES="${SIMULATOR_LIBRARY_PATH}/*.bundle"
DEVICE_LIBRARY_BUNDLES="${DEVICE_LIBRARY_PATH}/*.bundle"
UNIVERSAL_LIBRARY_BUNDLES="${UNIVERSAL_LIBRARY_PATH}/*.bundle"

echo "---------- **** Remove Bundles **** ----------"
echo "Simulator Bundles: ${SIMULATOR_LIBRARY_BUNDLES}"
echo "Device Bundles: ${DEVICE_LIBRARY_BUNDLES}"
echo "Universal Bundles: ${UNIVERSAL_LIBRARY_BUNDLES}"

rm -rf ${SIMULATOR_LIBRARY_BUNDLES}
rm -rf ${DEVICE_LIBRARY_BUNDLES}
rm -rf ${UNIVERSAL_LIBRARY_BUNDLES}

FWK_PRIVATE_HEADERS_PATH="${FRAMEWORK_FINAL_PATH}/PrivateHeaders"
rm -rf ${FWK_PRIVATE_HEADERS_PATH}

echo -e "Framework is in \033[31m ${FRAMEWORK_TARGET_PATH} \033[0m"

if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then
open "${FRAMEWORK_TARGET_PATH}/"
fi

make-project

#!/bin/bash

function usage() {
    echo
    echo "Usage:"
    echo
    echo -e "     \033[31m $ maia-project PROJECT-NAME \033[0m"
    echo
    echo "      maia-project, 輸出標(biāo)準(zhǔn)的Maia-iOS私有庫(kù)項(xiàng)目工程,PROJECT-NAME為必須參數(shù)"
    echo
}

if [[ $# -gt 0 ]]; then
    projectName="$1"
    if [[ -d $projectName ]]; then
        echo -e "項(xiàng)目 [ \033[31m ${projectName} \033[0m ] 已存在。"
    else
        echo -e "待創(chuàng)建的項(xiàng)目為:\033[31m ${projectName} \033[0m"
        echo "創(chuàng)建項(xiàng)目 ${projectName} ..."
        mkdir $projectName

        cd $projectName

        echo "創(chuàng)建Frameworks文件夾 ..."
        mkdir Frameworks

        echo "創(chuàng)建Assets文件夾 ..."
        mkdir Assets
        touch Assets/.gitkeep

        read -p "請(qǐng)輸入組件庫(kù)的版本號(hào),直接回車默認(rèn)為1.0.0 : " app_version
        if [[ $app_version == "" ]]; then
            app_version="1.0.0"
        fi

        read -p "請(qǐng)輸入項(xiàng)目簡(jiǎn)介,直接回車默認(rèn)為項(xiàng)目簡(jiǎn)介 : " project_info
        if [[ $project_info == "" ]]; then
            project_info="項(xiàng)目簡(jiǎn)介"
        fi

        read -p "請(qǐng)輸入項(xiàng)目描述,直接回車默認(rèn)為項(xiàng)目描述 : " project_desc
        if [[ $project_desc == "" ]]; then
            project_desc="項(xiàng)目描述"
        fi

        read -p "請(qǐng)輸入最低支持的iOS系統(tǒng)版本,直接回車默認(rèn)為8.0 : " miniVersion
        if [[ $miniVersion == "" ]]; then
            miniVersion="8.0"
        fi

        read -p "請(qǐng)輸入作者姓名,直接回車默認(rèn)為黃于 : " author
        if [[ $author == "" ]]; then
            author="黃于"
        fi

        read -p "請(qǐng)輸入作者郵箱,直接回車默認(rèn)為huangyu20@longfor.com : " author_email
        if [[ $author_email == "" ]]; then
            author_email="huangyi20@longfor.com"
        fi

        echo ""
        echo "============================================================"
        echo ""
        echo "版本號(hào) : ${app_version}"
        echo "應(yīng)用描述 : ${project_info}"
        echo "應(yīng)用簡(jiǎn)介 : ${project_desc}"
        echo "最低支持的iOS系統(tǒng)版本 : ${miniVersion}"
        echo "作者 : ${author}"
        echo "作者郵箱 : ${author_email}"
        echo ""
        echo "============================================================"
        echo ""

        echo "生成Podspec文件 ..."
        podFile=$projectName.podspec

        echo "#" > $podFile
        echo "# Be sure to run \`pod lib lint ${podFile}\` to ensure this is a" >> $podFile
        echo "# valid spec before submitting." >> $podFile
        echo "#" >> $podFile
        echo "# Any lines starting with a # are optional, but their use is encouraged" >> $podFile
        echo "# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html" >> $podFile
        echo "#" >> $podFile
        echo "" >> $podFile
        echo "Pod::Spec.new do |s|" >> $podFile
        echo "" >> $podFile
        echo "  s.name         = '${projectName}'" >> $podFile
        echo "  s.version      = '${app_version}'" >> $podFile
        echo "  s.summary      = '${project_info}'" >> $podFile
        echo "  s.description  = <<-DESC" >> $podFile
        echo "                   ${project_desc}" >> $podFile
        echo "                   DESC" >> $podFile
        echo "" >> $podFile
        echo "  s.homepage = 'http://git.xxxxx.net/ios/${projectName}'" >> $podFile
        echo "  s.license  = { :type => 'Copyright', :text => 'Copyright 2018 - 2020 longfor.com. All rights reserved.\n' }" >> $podFile
        echo "  s.authors  = { '${author}' => '${author_email}' }" >> $podFile
        echo "" >> $podFile
        echo "  s.ios.deployment_target = '${miniVersion}'" >> $podFile
        echo ""  >> $podFile
        echo "  s.source = { :git => 'http://git.xxxxx.net/ios/${projectName}.git', :tag => s.version.to_s }" >> $podFile
        echo ""  >> $podFile
        echo "  # s.resource  = 'Assets/icon.png'" >> $podFile
        echo "  # s.resources = 'Assets/Resources/*.png'" >> $podFile
        echo "" >> $podFile
        echo "  s.vendored_frameworks = 'Frameworks/*.framework'" >> $podFile
        echo "  # s.frameworks = 'CoreLocation', 'Foundation', 'UIKit', 'SystemConfiguration', 'AdSupport', 'Security', 'CoreTelephony'" >> $podFile
        echo "" >> $podFile
        echo "  # s.library   = 'sqlite3.0'" >> $podFile
        echo "  # s.libraries = 'sqlite3.0','c++'" >> $podFile
        echo "" >> $podFile
        echo "  s.requires_arc = true" >> $podFile
        echo "" >> $podFile
        echo "  # s.xcconfig = { 'HEADER_SEARCH_PATHS' => '\$(SDKROOT)/usr/include/libxml2' }" >> $podFile
        echo "  # s.dependency 'JSONKit', '~> 1.4'" >> $podFile
        echo "" >> $podFile
        echo "end" >> $podFile

        echo "綁定Git ..."
        git init
        # 關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
        git remote add origin http://git.xxxxx.net/ios/$projectName.git
    fi
else
    usage
fi
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容