美文网首页
利用Python修改源文件,切换服务器地址

利用Python修改源文件,切换服务器地址

作者: 三十一_iOS | 来源:发表于2018-06-15 10:27 被阅读22次

利用Python修改源文件,切换服务器地址

博客文章地址

之前写过一个打包工具 自动化的一些实践

使用了一段时间后,觉得有两个问题:

  1. 无法切换服务器地址
  2. 每次 Swift 版本更新,需要重新编译

所以觉得抛弃 Swift ,重写写一个版本的工具。

1. 用户输入打包的服务器地址以及本次 APP 更新的内容

没什么好讲的,直接看代码

import sys
from termcolor import colored

address = ""
updateDescription = ""
updateInfoFile = "updateInfoFile/XXXXX.txt"

def inputServer():
    print(colored("输入服务器地址,服务器地址如下:","blue"))
    print(colored("""
    "测试内网138": "http://XXX:8082",
    "测试外网119": "http://XXX:8082",
    "测试Https138": "https://XXX",
    "验收环境": "http://XXX:8000",
    "Https验收环境": "https://XXX:8083",
    "生产环境": "http://XXX:8000",
    "生产https环境": "https://XXX",
        ""","yellow"))
    address = input()
    servers = ["测试内网138","测试外网119","测试Https138","验收环境","Https验收环境","生产环境","生产https环境"]
    if address not in servers:
        print(colored("请输入正确的服务器地址","red"))
        inputServer()
    else:
        print(colored("输入的地址为 %s"%(address),"green"))
        return address



def inputUpdateInfo(server):
    print("请输入本次更新内容")

    updateInfo = file_write()
    print(updateInfo)
    if updateInfo:
        updateDescription = "XXX (%s)\n下载地址:https://www.pgyer.com/XXXX\n更新:\n%s"%(server,updateInfo)
        print(colored("本次更新内容为 %s"%(updateDescription),"green"))
        return updateDescription
    else:
        print(colored("请输入更新内容","red"))
        inputUpdateInfo(server)



def file_write():
    f = open(updateInfoFile, 'w')
    print('请输入内容【单独输入\':q\'保存退出】:')
    while True:
        file_content = input()
        if file_content != ':q':
            f.write('%s\n' % file_content)
        else:
            break
    f.close()

    f = open(updateInfoFile, 'r')
    updateInfo=f.read()
    f.close()
    return updateInfo

值得说的一点是:
输入 App 更新内容的时候,为了看起来清晰明了需要换行,但是 Pythoninput 函数,一旦输入回车,输入过程就结束了,输入 \n 换行符,不知道什么原因,也没有正确的显示出来。
最后只能以写文件的方式来解决这个问题。参看链接:python将回车作为输入内容

2. 切换服务器地址

在第一步中确定了打包地址,以及更新内容以后,接下来就是根据用户的输入,修改项目工程的源文件,切换服务器地址。

我们公司的服务器地址存在一个配置文件中,形式类似于:

//测试内网138
//NSString * const BaseAddress  = @"http://XXX:8082";
//测试外网119
//NSString * const BaseAddress  = @"http://XXXX:8082";
//测试Https138
//NSString * const BaseAddress  = @"https://XXXX.cn";
//验收环境
NSString * const BaseAddress  = @"http://XXX:8000";
//Https验收环境
//NSString * const BaseAddress  = @"https://XXX:8083";
//生产环境
//NSString * const BaseAddress  = @"http://XXX:8000";
//生产https环境
//NSString * const BaseAddress  = @"https://XXX";

我们要做的就是找到要打包的服务器地址哪一行,然后让它处于生效的状态。

  1. 查找到包含 BaseAddress 的行
  2. 判断这行是否注释,如果没有注释,将其注释
  3. 判断打包服务器环境是那个,找出服务器环境对应的那行,去除前面注释

用的了一点点正则:

  • re.match(".*BaseAddress.*", line) 是匹配 包含 BaseAddress 的行
  • re.match("^//", line) 是匹配开头为 // 的行
  • re.match(".*%s.*"%(serverAdd), line) 是匹配 包含 生效服务器地址 serverAdd 的行

其他的就没什么好说的,直接看代码吧。

def formatServerContent(file):
    fr = open(file,'r',encoding="utf-8")
    lines = fr.readlines()
    for line in lines:
        # 匹配 行中 带有 BaseAddress 的行
        if re.match(".*BaseAddress.*", line) != None:
            # 匹配开头 是否为 //
            if re.match("^//", line) is None:
                # 如果开头 不为 // ,为头添加 //
                index =lines.index(line)
                lines[index] = "//" + line

    #写文件
    fw = open(file,'w+')
    fw.writelines(lines)


def modify_to_target_server(file,server):
    # 先复原文件
    formatServerContent(file)

    serverAdd = switch_to_server(server)

    fr = open(file,'r',encoding="utf-8")
    lines = fr.readlines()
    for line in lines:
        # 匹配 行中 带有 要打包服务器地址 的行
        if re.match(".*%s.*"%(serverAdd), line) != None:
            # 匹配开头 是否为 //
            if re.match("^//", line) != None:
                # 如果开头 为 // ,为头除去 //
                index =lines.index(line)
                lines[index] = line[2:]

    #写文件
    fw = open(file,'w+')
    fw.writelines(lines)

def switch_to_server(argument):
    switcher = {
        "测试内网138": "http://XXX:8082",
        "测试外网119": "http://XXX:8082",
        "测试Https138": "https://XXX",
        "验收环境": "http://XXX:8000",
        "Https验收环境": "https://XXX:8083",
        "生产环境": "http://XXX:8000",
        "生产https环境": "https://XXX",
    }
    return switcher.get(argument, "nothing")

3. 打包并上传到蒲公英

# -*- coding: utf-8 -*-
import os
import sys
import time
import user_Input_Info as input_info
import change_file_content as change_server
# 项目根目录
project_path = "project_path"
# 服务器地址配置文件
serverFilePath = project_path + "XXX.m"
#工程名称
projectName = "XXXX"+".xcodeproj"
#scheme
scheme = "XXXX"
# 打包后ipa存储目录
targerIPA_parth = "XXXXX"

#时间戳
timeStr = time.strftime('%Y-%m-%d_%H-%M-%S',time.localtime(time.time()))
#activePath
activePath = targerIPA_parth  + timeStr +"/" +timeStr+".xcarchive"
#蒲公英Key
PGY_key="XXXXX"
#蒲公英APIKey
PGY_APIkey="XXXXXX"
DOWNLOAD_BASE_URL = "http://www.pgyer.com"
PGYER_UPLOAD_URL  = "http://www.pgyer.com/apiv1/app/upload"



# 清理项目 创建build目录
def clean_project_mkdir_build():
    print("******clean******")

    os.system('cd %s;xcodebuild clean -project "%s" -scheme %s -configuration release  | xcpretty' % (project_path,projectName,scheme)) # clean 项目

def build_project():
    print("build xcarchive start")
    print("activePath %s"%(activePath))

    os.system('xcodebuild -list | xcpretty')
    os.system('cd %s;xcodebuild archive -project "%s" -scheme %s -configuration release -sdk iphoneos11.1  IPHONEOS_DEPLOYMENT_TARGET=9.0 -archivePath %s -quiet | xcpretty;  ' % (project_path,projectName,scheme,activePath))
    print("build xcarchive end")

# 打包ipa 并且保存在桌面
def build_ipa():
    print("build IPA start")
    os.chdir(targerIPA_parth)
    os.system('xcodebuild -exportArchive -archivePath %s -exportPath %s/%s -exportOptionsPlist %sIPA.plist -quiet | xcpretty'%(activePath,targerIPA_parth,timeStr,targerIPA_parth))
    print("build IPA end")


def updateSVN():
    print("更新SVN数据")
    os.chdir(project_path)

    print("更新SVN数据 %s"%(os.getcwd()))
    os.system('svn update ')
    time.sleep(1)

    print("更新SVN完成")

def updateIPAToPGY(updateDescription):
    print("开始上传蒲公英")

    os.system ('curl -F \"updateDescription=%s\" -F \"file=@%s%s/copm_cust.ipa\" -F \"uKey=%s\" -F \"_api_key=%s\" https://qiniu-storage.pgyer.com/apiv1/app/upload'%(updateDescription,targerIPA_parth,timeStr,PGY_key,PGY_APIkey))
    print("上传蒲公英完成")

def creatQQMessage(updateDescription):
    file_object = open('xxxx/QQ.txt', 'w')
    file_object.write(updateDescription)
    file_object.close()
    os.system("open /XXXX/QQ.txt")
    os.system("open /XXXX/QRCode.rtfd")


def main():
    #更新SVN
    updateSVN()

    # 用户输入要打包的服务器地址
    address = input_info.inputServer()
    # 用户输入本次更新的信息
    updateDescription = input_info.inputUpdateInfo(address1)
    print(str(updateDescription))
    # 修改源文件
    change_server.modify_to_target_server(serverFilePath,address)

    # 清理并创建build目录
    clean_project_mkdir_build()
    # 编译项目文件并 执行编译目录
    build_project()
    # 打包ipa 并制定到桌面
    build_ipa()
    #上传到蒲公英
    updateIPAToPGY(updateDescription)
    # 生成更新下载信息
    creatQQMessage(updateDescription)

# 执行
main()

我把这个简陋的工具上传到了YunisTool

相关文章

  • 利用Python修改源文件,切换服务器地址

    利用Python修改源文件,切换服务器地址 博客文章地址 之前写过一个打包工具 自动化的一些实践 使用了一段时间后...

  • 公众号程序切换服务器

    账号切换 1,修改代码里所有原服务器地址的地方,修改成新服务器域名;2,在公众平台设置;左侧导航栏选择:“设置”-...

  • 使用xcconfig文件定义多种环境变量

    有的项目每次切换Debug、Release时,手动修改某个环境变量,比如服务器地址,SDK的key,id...之类...

  • 跨域

    跨域-问题出现切换请求基地址到本地服务器 直接修改 env.development.js 中的配置即可例: 如果你...

  • IOS 一键打包发布脚本

    自动化打包脚本 项目下载地址 主要功能: 自动修改项目配置文件(服务器地址切换) 一键打包上传到app-store...

  • git 提交

    初次提交 之后修改 添加远程仓库地址 切换远程地址并提交 查看当前远程地址 添加所有改动的 拉取 本地切换分支 查...

  • ubuntu的软件源更换

    更换方式 备份系统本身源文件 修改源文件内容,将新的源地址写入该文件中 保存文件,并刷新配置 国内的源地址 上海交...

  • 测试中使用代理连接到预发环境

    通常对于测试地址和正式地址切换都是应用内部通过修改代码来互相切换环境,比如说向这样:public boolean ...

  • Vue-clis3 前端开发多配置切换

    多配置切换的好处是,前端开发人员可以配置自己开发服务器连接地址,并能轻松的切换成后端开发的服务器地址,进行联调,还...

  • 亚马逊语音设计规范(2/3)

    源文件下载地址 源文件下载地址

网友评论

      本文标题:利用Python修改源文件,切换服务器地址

      本文链接:https://www.haomeiwen.com/subject/uxupeftx.html