Python脚本实现podfile创建和运行

综述

将近一年没有写python,本次重拾的原因很简单。Xcode发布8.x版本后,所有的第三方插件全部被禁用。特别是cocoapods已经无法通过直接输入库名,版本号和iOS verion来自动安装。

通过python创建一个脚本,将命令行封装进去,实现在termi上只需输入库名,版本号iOS version,即可自行执行cocoapods安装,完成后自行打开。

因为是重拾,本次的注释和说明会较为入门级,较为详细,作为参考。

顺带提一下纯粹输入命令实现Podfile安装

  • 手动创建Podfile
platform:ios, '7.0'
pod 'AFNetworking'
  • 终端中 cd到工程目录,执行下面这段命令
pod install --verbose --no-repo-update

实现思路

  • IDE 采用 PyCharm新建工程
  • termi中拖曳/输入Xcode工程路径,并判断路径是否有效
  • 查询当前目录下是否已经有Podfile
    • 不存在,重新创建
    • 已存在,询问是覆盖重写,还是继续添加库
  • 输入的库信息用逗号隔开,例如 AFNetworking,2.1.0,缺省版本号的话,版本号用0替代:AFNetworking,0
  • 输入的信息转化为dict类型,用python自带的os库创建/修改 Podfile,完成后用os.system()命令执行内容
Python脚本实现podfile创建和运行_第1张图片
流程图

Python库中的 os

用到的几个命令简介

os.chdir(path) #定位到某个目录下,相当于cd path
os.system(cmd) #相当于在终端下执行终端命令,cmd即为终端命令
os.path.exists(path): #判断path这个文件/文件夹是否存在,返回一个BOOL类型
os.listdir(path) # 返回当前目录下所有文件文件名的列表

本次用到的基础知识相关

  • 字符串操作,如拖曳进去的路径末尾一般会带空格,去掉空格方法:
    string = string.strip()
  • 如果函数的传入参数有字典,这个参数必须是 **param且参数必须放在最后一个,否则会报错。如fun(a,b,**dic)

效果

效果图

源码共享

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

# system(command) -> exit_status
# Execute the command (a string) in a subshell.

def PodFileContents(podfilePath, isOverride, **libInfo):
    info = ''
    for libName in libInfo.keys():
        if libInfo[libName] == '0':  # 用户输入时,0代表缺省属性,即不指定库的版本号
            podInfo = "pod '%s'\n" % (libName)
        elif libInfo[libName] == 'no':  # 用户输入q时,表示什么都不用
            podInfo = ' '
        else:
            podInfo = "pod '%s', '~> %s'\n" % (libName, libInfo[libName])

        info += podInfo

    # 如果是覆盖重写Podfile,必须要加上platform,否则只要在末尾继续添加库信息即可
    # 根据给定的路径创建一个podFile
    if isOverride == 'o':
        # 获取iOS版本信息
        iosVersion = raw_input('Please enter iOS version: \n')
        iosVersion.strip()
        # 将传入的iOS版本,库名,库版本添加为字符串,作为podfile内容
        content = "platform:ios, '%s'\n" % iosVersion
        content += info
        filehandle = open(podfilePath, "w")
        filehandle.write(content)
        filehandle.close()
    else:
        filehandle = open(podfilePath, "a")
        filehandle.write(info)
        filehandle.close()


def getUserInputLibInfo():
    # 获取第三方库名称,版本信息,若输入为q,则结束输入
    # print ('----Please enter lib name and version, using "," for seperatation.\nIf no version specified, enter "0" instead. '
    #         'Enter "q" to finish your input: ')
    print ('----输入库名和版本号,如"AFNetworking,2.1.0"\n若不指定版本号,则用0代替。如"AFNetworking,0"'
           '如果输入结束,按"q"然后回车以继续')
    libInfo = dict()
    userInputLibInfo = "start"  # 随便给一个非q的值作为初始值
    while userInputLibInfo != 'q':
        userInputLibInfo = raw_input()
        # 一进入就输入q,表示不做任何事
        if userInputLibInfo == 'q' and len(libInfo) == 0:
            libInfo = {'no': 'no'}
            return libInfo
        elif userInputLibInfo == 'q' and len(libInfo) > 0:
            continue

        try:  # 如果找不到分隔符,就抛出异常处理
            userInputLibInfo.index(',')
        except:
            print ('错误的输入, 请重试.若输入结束, 请输入"q"按回车: ')
            continue

        index = userInputLibInfo.index(',')
        libName = userInputLibInfo[0:index].strip()
        libVersion = userInputLibInfo[index + 1:].strip()
        libInfo[libName] = libVersion
        print ('库信息:{"%s,%s}",请继续添加,结束请按"q"并回车' % (libName, libVersion))

    print ('----完成输入, 库信息为 %s' % libInfo)
    return libInfo


def generatePodfile(filepath, projectpath, isoverride):
    # 获取用户输入的第三方库信息:库名+库版本号
    libInfo = getUserInputLibInfo()
    # 生成Podfile
    PodFileContents(filepath, isoverride, **libInfo)
    os.chdir(projectpath)
    print  ('====== podfile 日志 ======')
    os.system('pod install --verbose --no-repo-update')


# 判断给定路径的文件夹下是否包含某后缀名的文件,返回BOOL类型
def isAvailablePath(path, extension, isOpen):
    # 先判断给定路径的合法性
    path = path.strip()
    if os.path.exists(path):
        pathList = os.listdir(path)
        for fileName in pathList:
            if fileName.endswith(extension):
                filepath = path + '/%s' % fileName
                if isOpen == True:
                    os.system('open %s' % filepath)
                return True
        # 出循环,表示没有搜到这个文件
        return False
    else:
        return False


def main():
    # 获取工程文件夹路径
    projectPath = raw_input("请输入/拖曳进路径: ")  # Please drag in your project path:
    result = isAvailablePath(projectPath, 'xcodeproj', False)

    while result != True:
        projectPath = raw_input("无效路径,不包含Xcode工程,请重试 :")  # Please drag in your project path:
        result = isAvailablePath(projectPath, 'xcodeproj', False)

    projectPath = projectPath.strip()
    filePath = projectPath + '/Podfile'
    print (projectPath)
    # 增加需求,判断podfile是否存在,若存在,询问是 override 还是 append lib
    if os.path.exists(filePath):
        print ("----Podfile已存在, 重写还是添加一个新的库?\n"
               "输入 'o'(override) 来重写\n"
               "输入 'a'(append) 来添加")
        isOverride = raw_input()

        while (isOverride != 'o' and isOverride != 'a'):
            print("您输入的是 %s" % isOverride)
            isOverride = raw_input("无效的输入, 请重试: \n")

        generatePodfile(filePath, projectPath, isOverride)
    else:
        generatePodfile(filePath, projectPath, 'o')

    # 完成cocoapods,提醒用户是否打开当前目录下的
    isOpenXcodeWorkplace = raw_input("\n----Cocoapods 加载完毕, 你要打开 .xcworkspace 工程吗\n"
                                     "-Y\n"
                                     "-N\n")
    while (isOpenXcodeWorkplace != 'Y' and isOpenXcodeWorkplace != 'N'):
        print("您输入的是 = %s" % isOpenXcodeWorkplace)
        isOpenXcodeWorkplace = raw_input("无效的输入,请重试: \n")

    if isOpenXcodeWorkplace == 'Y':
        if isAvailablePath(projectPath, 'xcworkspace', True) == False:
            print ('打开失败,该文件不存在')
    elif isOpenXcodeWorkplace == 'N':
        print ('-end')


if __name__ == '__main__':
    main()

你可能感兴趣的:(Python脚本实现podfile创建和运行)