(我转载我自己的 : ) )
为什么要做这个脚本
最近这几天在外面出差,因为之前工作的SVN是内网环境的,所以在外面(成都)无法通过SVN合并代码。
没办法,只能手动合并了。我们通过在本地电脑上,将修改的代码打包,然后通过微信发给其他同事。
But,问题来了,Java的代码需要放到对应的包下面的,如果通过微信发送过去,那么做合并的时候就要知道每一个Java文件的包路径。这样太麻烦了,SO,我就用Python来解决这个问题。
优秀的Coder,善于用计算机偷懒!
程序流程 (Python风格的流程哦)
- 读取配置文件 (因为要给其他同事用,所以修改配置文件必修改代码要方便)
- 遍历源代码路径下的所有Java文件:
- 获取当前遍历的Java文件的完整路径
- 获取当前遍历的Java文件在目标路径下的路径(通过包名哦)
- 用源文件替换目标文件
配置信息
我们采用JSON格式保存数据,这样做虽然书写起来麻烦,但是读取方便(因为可以直接使用JSON包读取)
记得把注释(#号开头的部分)去掉
{
"target": {
"path": "E:\\Code\\Path" # 目标文件路径,即被覆盖的位置,旧的代码的路径
},
"source": {
"path": ".\\source" # 源文件路径,即新的代码的路径
}
}
代码
代码最好在Windows下使用,而且要Python3.x的环境,且不需要第三方包库
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, json
# 获取配置信息函数
def getConfig():
with open('main.conf', 'r', encoding='gbk') as f:
return json.load(f)
# 读取配置信息
CONFIG = getConfig()
# 获取目标路径函数
def getTargetPath(sfile):
# 这里的encoding指定GBK是因为我们的Java代码的字符编码是GBK
with open(sfile, 'r', encoding='gbk') as f:
# 读取文件内容
lines = f.readlines()
# 遍历每一行内容
for line in lines:
# 去除两端的空白符并将字母转换为小写
line = line.strip().lower()
# 除了以'package'开头的内容,其他的全部跳过
# 因为Java中package后面的是该类的包名,所以读取包名即可知道这篇代码的目标路径
if line.startswith('package'):
# 截取包名部分,并去除两端的空白符
packageName = line[7:-1].strip()
# 拼接出完整的目标路径
return os.path.join(
# 读取配置信息中的目标文件的根路径
CONFIG['target']['path'],
# 包名转换为路径
packageName.replace('.', os.sep),
# 截取文件名
os.path.split(sfile)[-1]
)
# 程序主入口
def main():
# 遍历全部的源文件
for path in os.listdir(CONFIG['source']['path']):
# 如果是Java文件,则执行替换的流程
if os.path.splitext(path)[-1] == '.java':
# 获取当前遍历的Java文件的完整路径
source = os.path.join(CONFIG['source']['path'], path)
# 获取当前遍历的Java文件的目标路径
target = getTargetPath(source)
# 替换文件
os.replace(source, target)
# 执行主函数
main()
# 不打包的话,可以解开下面的注释
# 这样,当报出异常时,就不会闪退了
# if __name__ == '__main__':
# os.system('pause')
将代码打包成EXE
这里是通过PyInstaller 3.4打包的,其他版本不清楚是否适用,下面是打包的命令:
pyinstaller -F MergeCode.py -n MergeCode --icon="icon.ico"
命令解释:
-F 指定代码的主入口,这里就只有一个Python源代码文件,所以直接指定这个代码文件即可
-n 指定打包后的EXE程序的名称
–icon 指定图标的路径