当前位置: 首页 > news >正文

基于Python3编写的Golang程序多平台交叉编译自动化脚本

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, n=None):self.darwin = darwinself.go = "go"self.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_64"self.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(path=self.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(src=self.tmp, dst=dst)# 复制成功后,删除临时文件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 + ".exe"self.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(arch=a)# 对其他操作系统,默认使用X86_64架构else:self.arch(arch="X86_64")# 主程序入口
if __name__ == "__main__":# 获取当前目录cwd = os.getcwd()# 解析命令传参parser = argparse.ArgumentParser()parser.add_argument("-f", "--file", help="源代码文件名", type=str, default="ssl.go")parser.add_argument("-n", "--name", help="项目名称", type=str, default="ssl")# 是否启用Linux平台, 默认启用parser.add_argument("-l", "--linux", help="是否启用Linux平台", action='store_true', default=True)parser.add_argument("--no-linux", help="禁用Linux平台", action='store_false', dest='linux')# 是否启用Darwin平台, 默认启用parser.add_argument("-d", "--darwin", help="是否启用Darwin平台", action='store_true', default=True)parser.add_argument("--no-darwin", help="禁用Darwin平台", action='store_false', dest='darwin')# 是否启用Windows平台, 默认启用parser.add_argument("-w", "--windows", help="是否启用Windows平台", action='store_true', default=True)parser.add_argument("--no-windows", help="禁用Windows平台", action='store_false', dest='windows')# 是否启用arm64平台, 默认启用parser.add_argument("-a", "--arm64", help="是否启用arm64平台", action='store_true', default=True)parser.add_argument("--no-arm64", help="禁用arm64平台", action='store_false', dest='arm64')# 是否启用arm32平台, 默认启用parser.add_argument("-r32", "--arm32", help="是否启用arm32平台", action='store_true', default=True)parser.add_argument("--no-arm32", help="禁用arm32平台", action='store_false', dest='arm32')# 是否启用mips64平台, 默认启用parser.add_argument("-m", "--mips64", help="是否启用mips64平台", action='store_true', default=True)parser.add_argument("--no-mips64", help="禁用mips64平台", action='store_false', dest='mips64')# 是否启用amd64/x86平台, 默认启用parser.add_argument("-x", "--x86", help="是否启用amd64/x86平台", action='store_true', default=True)parser.add_argument("--no-x86", help="禁用amd64/x86平台", action='store_false', dest='x86')# 设置保存目录,默认: ./clientclient_ = os.path.join(cwd, 'client')parser.add_argument("-o", "--output", help=f"保存目录->默认: {client_}", type=str, default=client_)# 显示版本号parser.add_argument("-v", "--version", action='version', 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(f"Linux: {args.linux}")print(f"Darwin: {args.darwin}")print(f"Windows: {args.windows}")print(f"ARM64: {args.arm64}")print(f"ARM32: {args.arm32}")print(f"MIPS64: {args.mips64}")print(f"X86: {args.x86}")# 创建GoBuild实例,传入文件名、项目名称及各平台编译选项up = GoBuild(f=file, n=name)# 设置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(save=args.output)

效果

在这里插入图片描述

相关文章:

基于Python3编写的Golang程序多平台交叉编译自动化脚本

import argparse import os import shutil import sys from shutil import copy2from loguru import loggerclass GoBuild:"""一个用于构建跨平台执行文件的类。初始化函数,设置构建的主文件、生成的执行文件名称以及目标平台。:param f: 需要构建的…...

远程桌面连接

电脑A:使用机 电脑B:被控制的另一个 方法1: 在电脑B上操作 ①winr输入cmd进入命令行窗口,输入ipconfig查询本机地址 ②我的电脑/此电脑 右键点击“属性” ③选择屏幕右边“远程桌面” ④打开“启用远程桌面” ⑤打开设置&am…...

网络地址转换NAT

NAT(Network Address Translation) 方法于1994年提出。需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球地址IPG。 所有使用本地地址的主机在和外界通信时都要在NAT路由器上将其本地地址转换成外部全球…...

什么是CRM管理软件?CRM的基本概念、功能、选择标准、应用场景

什么是CRM管理软件? 嘿,大家好!今天咱们聊聊一个在现代企业管理中非常重要的工具——CRM管理软件。CRM是Customer Relationship Management(客户关系管理)的缩写,简单来说,它就是一个帮助企业和…...

Python编程常用的19个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…...

【Unity基础】AudioSource 常用方法总结

在 Unity 中,AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play():开始播放音频,如果是从暂停的地方继续播放,可以直接调用。Pause():暂停当前播放的…...

CSS系列(25)-- 滚动优化详解

前端技术探索系列:CSS 滚动优化详解 📜 致读者:探索流畅滚动的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS 滚动优化,学习如何创建流畅、高性能的滚动体验。 平滑滚动 🚀 基础设置 /* …...

CST天线设计的六大核心特点:为天线分析提供完整解决方案!

CST Studio Suite 为天线设计提供了从最初的概念评估到最终的合规性测试所需的所有功能,确保天线设计在各种环境下实现稳定通信。这一套工具覆盖了所有重要的设计阶段,帮助设计师顺利完成从概念到成品的全过程。 下面我们来看一看CST电磁仿真中天线设计…...

Ubuntu下C语言操作kafka示例

目录 安装kafka: 安装librdkafka consumer Producer 测试运行 安装kafka: Ubuntu下Kafka安装及使用_ubuntu安装kafka-CSDN博客 安装librdkafka github地址:GitHub - confluentinc/librdkafka: The Apache Kafka C/C library $ apt in…...

怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法

怎么将pdf中的某一个提取出来?传统上,我们可能通过手动截取屏幕或使用PDF阅读器的复制功能来提取信息,但这种方法往往不够精确,且无法保留原文档的排版和格式。此外,很多时候我们需要提取的内容可能涉及多个页面、多个…...

HTTP接口报错详解与解决 200,500,403,408,404

前言: 仅做学习记录,侵删 背景 当后端编写接口时,经常需要对接口使用ApiFox或者PostMan进行测试,此时就会出现各种各样的报错,一般都会包括报错编码:200,400,401等。这个状态码一般是服务器所返回的包含…...

监控IP频繁登录服务器脚本

该脚本的作用是监控IP登录失败次数,如果某个IP的登录失败次数超过设定的最大次数,则阻止该IP的进一步登录尝试。通过iptables防火墙阻止连接,当一个IP尝试登录次数超过5次时,iptables会阻止来自该IP的所有连接 #!/bin/bashfuncti…...

分布式链路追踪-03-Jaeger、Zipkin、skywalking 中的 span 是如何设计的?

开源项目 auto-log 自动日志输出 Jaeger、Zipkin 中的 spanId 是如何生成的? 在 Jaeger 和 Zipkin 这两个分布式跟踪系统中,Span ID 是通过不同的方法生成的。 下面分别介绍它们的生成方式: Jaeger 中的 Span ID 生成: 在 Ja…...

【达梦数据库】获取对象DDL

目录 背景获取表的DDL其他 背景 在排查问题时总会遇到获取对象DDL的问题,因此做以下总结。 获取表的DDL 设置disql工具中显示LONG类型数据的最大长度,避免截断: SET LONG 9999获取DDL SELECT DBMS_METADATA.GET_DDL(TABLE,表名,模式名) …...

InnoDB和MyISAM引擎优缺点和区别

nnoDB和MyISAM是MySQL数据库中常用的两种存储引擎。它们各自具有不同的特性和优势,适用于不同的应用场景。 一、InnoDB引擎: 1、它有如下特性: 1)、支持事务(ACID) 2)、支持外键约束(FOREIGN KEY const…...

文件上传知识点汇总

归纳总结一下文件上传(其实是懒得写wp) 基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客 和dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st 做一篇自己的总结 目录 一、什么…...

计算机网络技术基础:5.数据通信系统

一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映,可以是客观事实的形态、大小、结构、性能等描述,也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理:不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如,氮元素是植物叶绿素的重要组成部分,植物缺氮时,叶绿素含量下降,其在可见光波段&a…...

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为,深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题,并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导,助力考生科学合理地填报高考志愿,避免陷入各…...

Android基于Path的addRoundRect,Canvas剪切clipPath简洁的圆角矩形实现,Kotlin(1)

Android基于Path的addRoundRect&#xff0c;Canvas剪切clipPath简洁的圆角矩形实现&#xff0c;Kotlin&#xff08;1&#xff09; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…...

webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式

一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段&#xff0c;每个阶段都有其特定的任务&#xff0c;协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像&#xff1a; 顶点处理&#xff08;Vertex Processing&#xff09;阶段&#xff1…...

区块链详解

1. 概述 1.1 什么是区块链&#xff1f; 区块链是一种分布式数据库技术&#xff0c;它以链式数据结构的形式存储数据&#xff0c;每个数据块与前一个数据块相关联&#xff0c;形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据&#xff0c;这些数据…...

【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH

目录 AND&#xff1a;当所有条件都为真时返回 TRUE&#xff0c;否则返回 FALSE OR&#xff1a;当任一条件为真时返回 TRUE&#xff0c;否则返回 FALSE XOR&#xff1a;当奇数个条件为真时返回 TRUE&#xff0c;否则返回 FALSE NOT &#xff1a;反转逻辑值 IF&#xff1a;根…...

ubuntu下gdb调试ROS

参考&#xff1a; 使用VsCode进行ROS程序调试_ros vscode 调试-CSDN博客 https://blog.csdn.net/weixin_45031801/article/details/134399664?spm1001.2014.3001.5506 一、调试准备 1.1 CMakeLists改动 注释文件中的 set(CMAKE_BUILD_TYPE "Release") #构建类…...

Docke_常用命令详解

这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说&#xff1a;Docker通过提供轻量级、隔离且可移植的容器化环境&#xff0c;使得应用在不同平台上保持一致性、易于部署和管理&#xff0c;具体如下 环境一致性&#xff1a; Docker容器使得…...

使用vue2.0或vue3.0创建自定义组件

Vue2.0创建自定义组件 在 Vue 2.0 中创建自定义组件是一个相对简单的过程。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义组件。 步骤 1: 创建 Vue 组件文件 首先&#xff0c;你需要创建一个新的 Vue 文件&#xff08;.vue 文件&#xff09;。假设我们要创建一…...

Elasticsearch-DSL高级查询操作

一、禁用元数据和过滤数据 1、禁用元数据_source GET product/_search {"_source": false, "query": {"match_all": {}} }查询结果不显示元数据 禁用之前: {"took" : 0,"timed_out" : false,"_shards" : {&quo…...

【Linux】重启系统后开不开机(内核模块丢失问题)

问题 重启后开不开机报错如下&#xff1a; FAILED failed to start load kernel moduiles 可以看到提示module dm_mod not found 缺少了dm_mod 在内核module目录中 reboot重启可以看到这个现象&#xff1a; 可以看到重启启动磁盘&#xff0c;加载不到root 原因 dm_mod模块…...

对golang的io型进程进行off-cpu分析

背景&#xff1a; 对于不能占满所有cpu核数的进程&#xff0c;进行on-cpu的分析是没有意义的&#xff0c;因为可能程序大部分时间都处在阻塞状态。 实验例子程序&#xff1a; 以centos8和golang1.23.3为例&#xff0c;测试下面的程序&#xff1a; pprof_netio.go package m…...

Springboot中使用Retrofit

Retrofit官网 https://square.github.io/retrofit/ 配置gradle implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation ("com.squareup.retrofit2:retrofit:2.11.0")implementation ("com.squareup.retrofit2:converter-gson:2.11.0…...