综述
将近一年没有写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库中的 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()