物流网站免费模板,医药招商网站大全,个人信息页面设计漂亮的网站,网线制作实验总结import argparse
import os
import shutil
import sys
from shutil import copy2from loguru import loggerclass GoBuild:一个用于构建跨平台执行文件的类。初始化函数#xff0c;设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…import argparse
import os
import shutil
import sys
from shutil import copy2from loguru import loggerclass GoBuild:一个用于构建跨平台执行文件的类。初始化函数设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的主文件(例如: main.go):param n: 生成的执行文件主名称(例如: install)def __init__(self, f, nNone):self.darwin darwinself.go goself.name nself.arch_list []self.os_list []self.amd64 Falseself.mips64 Falseself.arm64 Falseself.arm32 Falseself.linux Falseself.windows Falseself.file fself.basename self.archs X86_64self.os_type self.exe self.tmp self.logger loggerdef init(self):初始化函数根据不同的架构和操作系统生成相应的架构和操作系统列表并设置可执行文件的基础名称。# 检查并添加架构到架构列表if self.arm64:self.arch_list.append(arm64)if self.mips64:self.arch_list.append(mips64le)if self.amd64:self.arch_list.append(amd64)if self.arm32:self.arch_list.append(arm)# 检查并添加操作系统到操作系统列表if self.linux:self.os_list.append(linux)if self.windows:self.os_list.append(windows)if self.darwin:self.os_list.append(darwin)# 设置可执行文件的基础名称if self.name is None:self.basename str(os.path.basename(self.file)).replace(.go, )else:self.basename self.namedef delete(self):开始删除生成的临时文件:return: None# 构造临时文件的完整路径tmp os.path.join(os.getcwd(), self.tmp)try:# 尝试删除临时文件os.remove(pathself.tmp)# 删除成功后记录日志self.logger.debug(f删除成功: {tmp})except Exception as e:# 删除失败后记录错误日志self.logger.error(f删除出错 - [{tmp} ] : {str(e)})def copy(self):复制执行文件到目标目录并根据当前环境调整文件路径。此方法首先构建目标文件路径然后尝试从临时文件路径复制文件到目标路径如果临时文件存在的话。如果复制成功它将调用delete方法删除临时文件。如果临时文件不存在它将记录一个警告消息。# 构建目标文件路径dst os.path.join(client, self.exe)# 将目标路径与当前工作目录结合dst os.path.join(os.getcwd(), dst)# 替换路径中的amd64为X86_64以适配不同架构dst str(dst).replace(amd64, X86_64)# 记录复制操作的开始self.logger.debug(f开始复制: {dst})# 检查临时文件是否存在if os.path.isfile(self.tmp):try:# 尝试复制文件到目标路径copy2(srcself.tmp, dstdst)# 复制成功后删除临时文件self.delete()except Exception as e:# 如果复制过程中发生异常记录错误信息self.logger.error(f复制失败: {str(e)})else:# 如果临时文件不存在记录警告信息self.logger.warning(f文件不存在: {self.tmp})def build(self):构建指定的Go文件根据操作系统类型和架构进行编译并处理构建结果。1. 根据架构类型转换变量self.archs确保其符合预期的架构命名规范。2. 记录构建系统的操作系统类型和架构用于调试和追踪。3. 根据操作系统和架构生成可执行文件名self.exe并调整Windows系统下的文件扩展名。4. 构建Go文件如果构建成功则调用self.copy()方法处理构建结果否则记录错误并退出程序。# 根据架构类型转换变量self.archs确保其符合预期的架构命名规范if self.archs amd64:self.archs X86_64# 记录构建系统的操作系统类型和架构用于调试和追踪self.logger.debug(f构建系统: {self.os_type}, )self.logger.debug(f构建架构: {self.archs})# 根据操作系统和架构生成可执行文件名self.exe并调整Windows系统下的文件扩展名self.exe self.basename _ self.os_type - self.archsself.tmp str(os.path.basename(self.file)).replace(.go, )if self.os_type windows:self.exe self.exe .exeself.tmp self.tmp .exe# 构建Go文件c f{self.go} build {self.file}if os.system(c) 0:# 如果构建成功则记录信息并调用self.copy()方法处理构建结果self.logger.info(f构建成功,正在生成: {self.exe})self.copy()else:# 如果构建失败则记录错误并退出程序self.logger.error(f构建失败: {self.exe})print(c)sys.exit(2)def ost(self, o):设置操作系统类型该方法主要用于设置GOOS环境变量以模拟不同的操作系统环境这对于后续的编译过程特别重要因为GOOS环境变量决定了编译输出的目标操作系统。参数:o (str): 要模拟的操作系统类型例如linux、windows等。返回:无# 设置GOOS环境变量以模拟指定的操作系统os.environ[GOOS] o# 更新实例的os_type属性以存储当前设置的操作系统类型self.os_type odef arch(self, arch):设置架构并触发构建过程该方法接收一个架构名称根据特定规则转换后设置环境变量GOARCH并将该架构名称保存以供后续使用。最后调用build方法进行构建。参数:arch (str): 构架名称可能需要转换以适配特定的命名约定。返回:无# 根据输入的架构名称进行条件判断以确定是否需要转换架构名称if arch X86_64:arch amd64# 设置环境变量GOARCH为转换后的架构名称以便在后续的构建过程中使用os.environ[GOARCH] arch# 保存当前架构名称到实例变量以便在类的其他方法中访问self.archs arch# 调用实例的build方法触发针对指定架构的构建过程self.build()def start(self, save):启动初始化和操作系统处理流程在这个方法中首先进行初始化操作然后根据save参数检查目录是否存在如果不存在则创建目录随后遍历操作系统列表对每个操作系统进行处理对于Linux操作系统进一步遍历其架构列表并进行处理对于其他操作系统则默认使用X86_64架构进行处理参数:save (str): 保存路径字符串用于检查是否存在以及创建目录# 初始化操作self.init()# 检查save是否为目录如果不是则创建client目录if not os.path.isdir(save):os.mkdir(./client)# 遍历操作系统列表对每个操作系统调用ost方法for i in self.os_list:self.ost(i)# 对Linux操作系统记录架构列表并遍历每个架构if i linux:self.logger.debug(f架构列表: {self.arch_list})for a in self.arch_list:self.arch(archa)# 对其他操作系统默认使用X86_64架构else:self.arch(archX86_64)# 主程序入口
if __name__ __main__:# 获取当前目录cwd os.getcwd()# 解析命令传参parser argparse.ArgumentParser()parser.add_argument(-f, --file, help源代码文件名, typestr, defaultssl.go)parser.add_argument(-n, --name, help项目名称, typestr, defaultssl)# 是否启用Linux平台, 默认启用parser.add_argument(-l, --linux, help是否启用Linux平台, actionstore_true, defaultTrue)parser.add_argument(--no-linux, help禁用Linux平台, actionstore_false, destlinux)# 是否启用Darwin平台, 默认启用parser.add_argument(-d, --darwin, help是否启用Darwin平台, actionstore_true, defaultTrue)parser.add_argument(--no-darwin, help禁用Darwin平台, actionstore_false, destdarwin)# 是否启用Windows平台, 默认启用parser.add_argument(-w, --windows, help是否启用Windows平台, actionstore_true, defaultTrue)parser.add_argument(--no-windows, help禁用Windows平台, actionstore_false, destwindows)# 是否启用arm64平台, 默认启用parser.add_argument(-a, --arm64, help是否启用arm64平台, actionstore_true, defaultTrue)parser.add_argument(--no-arm64, help禁用arm64平台, actionstore_false, destarm64)# 是否启用arm32平台, 默认启用parser.add_argument(-r32, --arm32, help是否启用arm32平台, actionstore_true, defaultTrue)parser.add_argument(--no-arm32, help禁用arm32平台, actionstore_false, destarm32)# 是否启用mips64平台, 默认启用parser.add_argument(-m, --mips64, help是否启用mips64平台, actionstore_true, defaultTrue)parser.add_argument(--no-mips64, help禁用mips64平台, actionstore_false, destmips64)# 是否启用amd64/x86平台, 默认启用parser.add_argument(-x, --x86, help是否启用amd64/x86平台, actionstore_true, defaultTrue)parser.add_argument(--no-x86, help禁用amd64/x86平台, actionstore_false, destx86)# 设置保存目录默认: ./clientclient_ os.path.join(cwd, client)parser.add_argument(-o, --output, helpf保存目录-默认: {client_}, typestr, defaultclient_)# 显示版本号parser.add_argument(-v, --version, actionversion, version%(prog)s 1.0)# 解析命令行参数args parser.parse_args()# 提取命令行参数中的文件名file args.file# 提取命令行参数中的项目名称name args.name# 提取命令行参数中的MIPS64平台编译选项mips64 args.mips64# 提取命令行参数中的Linux平台编译选项linux args.linux# 提取命令行参数中的Darwin平台编译选项darwin args.darwin# 提取命令行参数中的ARM64平台编译选项arm64 args.arm64# 提取命令行参数中的X86平台编译选项x86 args.x86# 提取命令行参数中的ARM32平台编译选项arm32 args.arm32# 提取命令行参数中的Windows平台编译选项windows args.windows# 打印所有命令行参数print(args)# 打印提取的文件名print(f文件名: {file})# 打印提取的项目名称# 打印启用的平台print(fLinux: {args.linux})print(fDarwin: {args.darwin})print(fWindows: {args.windows})print(fARM64: {args.arm64})print(fARM32: {args.arm32})print(fMIPS64: {args.mips64})print(fX86: {args.x86})# 创建GoBuild实例传入文件名、项目名称及各平台编译选项up GoBuild(ffile, nname)# 设置ARM32架构的编译选项up.arm32 arm32# 设置Windows系统的编译选项up.windows windows# 设置ARM64架构的编译选项up.arm64 arm64# 设置MIPS64架构的编译选项up.mips64 mips64# 设置X86架构的编译选项up.x86 x86# 设置Linux系统的编译选项up.linux linux# 设置Darwin系统的编译选项up.darwin darwin# 启动编译过程up.start(saveargs.output)
效果