苹果软件做ppt模板下载网站有哪些/故事式软文广告300字

苹果软件做ppt模板下载网站有哪些,故事式软文广告300字,ui界面设计实例100例,动态网页设计课程设计报告提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…

提示:

  • 所有体系课见专栏:Go 项目开发极速入门实战课;
  • 欢迎加入 云原生 AI 实战 星球,12+ 高质量体系课、20+ 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);
  • 本节课最终源码位于 fastgo 项目的 feature/s05 分支;
  • 更详细的课程版本见:Go 项目开发中级实战课:14 | 应用构建(3):如何给应用添加版本号打印功能?

在 Go 项目开发中,为了方便排障等,需要知道某个线上应用的具体版本。另外,在你开发命令行工具的时候,也需要支持 -v/--version之类的命令行参数。这时候,就需要给应用添加版本号打印功能。

本节课,就来看下,如何给应用添加版本号打印功能。

如何添加版本号?

在实际开发中,当完成一个应用特性开发后,会编译应用源码并发布到生产环境。为了定位问题或出于安全考虑(确认发布的是正确的版本),开发者通常需要了解当前应用的版本信息以及一些编译时的详细信息,例如编译时使用的 Go 版本、Git 目录是否干净,以及基于哪个 Git 提交 ID 进行的编译。在一个编译好的可执行程序中,通常可以通过类似。/appname -v 的方式来获取版本信息。

我们可以将这些信息写入版本号配置文件中,程序运行时从版本号配置文件中读取并显示。然而,在程序部署时,除了二进制文件外还需要额外的版本号配置文件,这种方式既不方便,又面临版本号配置文件被篡改的风险。另一种方式是将这些信息直接写入代码中,这样无需额外的版本号配置文件,但每次编译时都需要修改代码以更新版本号,这种实现方式同样不够优雅。

Go 官方提供了一种更优的方式:通过编译时指定 -ldflags -X importpath.name=value 参数,来为程序自动注入版本信息。

提示:在实际开发中,绝大多数情况是使用 Git 进行源码版本管理,因此 fastgo 的版本功能也基于 Git 实现。

给 fg-apisearver 组件添加版本号功能

可以通过以下步骤为 fg-apiserver 添加版本功能:

  1. 创建一个 version 包用于保存版本信息;
  2. 将版本信息注入到 version 包中;
  3. fg-apiserver 应用添加 --version 命令行选项。

创建一个 version 包

创建一个 pkg/version/version.go 文件,代码如下所示:

package versionimport ("encoding/json""fmt""runtime""github.com/gosuri/uitable"
)var (// semantic version, derived by build scripts (see// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md// for a detailed discussion of this field)//// TODO: This field is still called "gitVersion" for legacy// reasons. For prerelease versions, the build metadata on the// semantic version is a git hash, but the version itself is no// longer the direct output of "git describe", but a slight// translation to be semver compliant.// NOTE: The $Format strings are replaced during 'git archive' thanks to the// companion .gitattributes file containing 'export-subst' in this same// directory.  See also https://git-scm.com/docs/gitattributesgitVersion   = "v0.0.0-master+$Format:%H$"gitCommit    = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD)gitTreeState = ""            // state of git tree, either "clean" or "dirty"buildDate = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
)// Info contains versioning information.
type Info struct {GitVersion   string `json:"gitVersion"`GitCommit    string `json:"gitCommit"`GitTreeState string `json:"gitTreeState"`BuildDate    string `json:"buildDate"`GoVersion    string `json:"goVersion"`Compiler     string `json:"compiler"`Platform     string `json:"platform"`
}// String returns info as a human-friendly version string.
func (info Info) String() string {return info.GitVersion
}// ToJSON returns the JSON string of version information.
func (info Info) ToJSON() string {s, _ := json.Marshal(info)return string(s)
}// Text encodes the version information into UTF-8-encoded text and
// returns the result.
func (info Info) Text() string {table := uitable.New()table.RightAlign(0)table.MaxColWidth = 80table.Separator = " "table.AddRow("gitVersion:", info.GitVersion)table.AddRow("gitCommit:", info.GitCommit)table.AddRow("gitTreeState:", info.GitTreeState)table.AddRow("buildDate:", info.BuildDate)table.AddRow("goVersion:", info.GoVersion)table.AddRow("compiler:", info.Compiler)table.AddRow("platform:", info.Platform)return table.String()
}// Get returns the overall codebase version. It's for detecting
// what code a binary was built from.
func Get() Info {// These variables typically come from -ldflags settings and in// their absence fallback to the settings in pkg/version/base.goreturn Info{GitVersion:   gitVersion,GitCommit:    gitCommit,GitTreeState: gitTreeState,BuildDate:    buildDate,GoVersion:    runtime.Version(),Compiler:     runtime.Compiler,Platform:     fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),}
}

version 包用于记录版本号信息,而版本号功能几乎是所有 Go 应用都会用到的通用功能。因此,需要考虑将 version 包提供给其他外部应用程序使用。根据目录规范,应将 version 包放在 pkg/ 目录下,以便其他项目可以导入并使用 version 包。由于 version 包需要是面向第三方应用的包,因此需确保 version 包的功能稳定、完善,并能够独立对外提供预期的功能。

上述代码, 定义了一个 Info 结构体,用于统一保存版本信息。Info 结构体记录了较为详细的构建信息,包括 Git 版本号、Git 提交 ID、Git 仓库状态、应用构建时间、Go 版本、用到的编译器和构建平台。此外,Info 结构体还实现了以下方法,用于展示不同格式的版本信息:

  • Get 方法:返回详尽的代码库版本信息;
  • String 方法:以更友好、可读的格式展示构建信息;
  • ToJSON 方法:以 JSON 格式输出版本信息;
  • Text 方法:展示格式化的版本信息。

将版本信息注入到 version 包中

接下来,可以通过 -ldflags -X "importpath.name=value" 构建参数将版本信息注入到 version 包中。

由于需要解析当前 Git 仓库的状态、Commit ID、Tag 等信息,为了方便在编译时将版本号信息注入到 version 包中,这里我们将这些注入操作统一封装到 build.sh 脚本中。这样,在编译 fg-apiserver 组件时,只需要执行 build.sh 脚本即可。

build.sh 脚本内容如下:

#!/bin/bash# 获取脚本所在目录作为项目根目录
PROJ_ROOT_DIR=$(dirname "${BASH_SOURCE[0]}")# 定义构建产物的输出目录为项目根目录下的_output文件夹
OUTPUT_DIR=${PROJ_ROOT_DIR}/_output# 指定版本信息包的路径,后续会通过-ldflags参数将版本信息注入到这个包的变量中
VERSION_PACKAGE=github.com/onexstack/fastgo/pkg/version# 确定VERSION值:如果环境变量中没有设置VERSION,则使用git标签作为版本号
# git describe --tags --always --match='v*'命令会获取最近的v开头的标签,如果没有则使用当前commit的短哈希
if [[ -z "${VERSION}" ]];thenVERSION=$(git describe --tags --always --match='v*')
fi# 检查代码仓库状态:判断工作目录是否干净
# 默认状态设为"dirty"(有未提交更改)
GIT_TREE_STATE="dirty"
# 使用git status检查是否有未提交的更改
is_clean=$(git status --porcelain 2>/dev/null)
# 如果is_clean为空,说明没有未提交的更改,状态设为"clean"
if [[ -z ${is_clean} ]];thenGIT_TREE_STATE="clean"
fi# 获取当前git commit的完整哈希值
GIT_COMMIT=$(git rev-parse HEAD)# 构造链接器标志(ldflags)
# 通过-X选项向VERSION_PACKAGE包中注入以下变量的值:
# - gitVersion: 版本号
# - gitCommit: 构建时的commit哈希
# - gitTreeState: 代码仓库状态(clean或dirty)
# - buildDate: 构建日期和时间(UTC格式)
GO_LDFLAGS="-X ${VERSION_PACKAGE}.gitVersion=${VERSION} \-X ${VERSION_PACKAGE}.gitCommit=${GIT_COMMIT} \-X ${VERSION_PACKAGE}.gitTreeState=${GIT_TREE_STATE} \-X ${VERSION_PACKAGE}.buildDate=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"# 执行Go构建命令
# -v: 显示详细编译信息
# -ldflags: 传入上面定义的链接器标志
# -o: 指定输出文件路径和名称
# 最后参数是入口文件路径
go build -v -ldflags "${GO_LDFLAGS}" -o ${OUTPUT_DIR}/fg-apiserver -v cmd/fg-apiserver/main.go

脚本中已有详尽的注释,这里不再多做说明。

fg-apiserver 添加 --version 命令行选项

通过前面的步骤,在编译 fg-apiserver 之后,所需的版本信息已成功注入 version 包中。接下来,还需要在 fg-apiserver 主程序中调用 version 包打印版本信息。

编辑 cmd/fg-apiserver/app/server.go 文件,在 run 函数中添加以下代码:

package appimport (..."github.com/onexstack/fastgo/pkg/version"
)
...
// NewFastGOCommand 创建一个 *cobra.Command 对象,用于启动应用程序.
func NewFastGOCommand() *cobra.Command {...// 添加 --version 标志version.AddFlags(cmd.PersistentFlags())return cmd
}// run 是主运行逻辑,负责初始化日志、解析配置、校验选项并启动服务器。
func run(opts *options.ServerOptions) error {// 如果传入 --version,则打印版本信息并退出version.PrintAndExitIfRequested()...
}   

version.AddFlags(cmd.PersistentFlags()) 用来给 fg-apiserver 命令添加 -v/--version 命令行选项。

version.PrintAndExitIfRequested() 用来指定当 fg-apiserver 命令执行并传入 -v/--version 命令行选项时,应用会打印版本号信息并退出。

测试 fg-apiserver 版本号打印功能

开发完成后,执行以下命令来编译 fg-apiserver 组件源码,并打印版本号信息:

$ git tag -a v0.0.1 -m "release v0.0.1" # 给当前 Commit 打上标签
$ ./build.sh # 编译 fg-apiserver 源码
$ _output/fg-apiserver --version # 打印版本号信息
v0.0.1
$ _output/fg-apiserver --version=raw # 打印更详细的编译信息,包括版本号gitVersion: v0.0.1                                  gitCommit: b9d5b4425c8296b2c7642a35589ae83b6f7a8721
gitTreeState: clean                                   buildDate: 2025-03-03T04:52:53Z                    goVersion: go1.24.0                                compiler: gc                                      platform: linux/amd64

可以看到,fg-apiserver 程序根据 --version 的值输出了不同格式且内容详尽的版本信息。通过这些版本信息,可以精确定位当前应用所使用的代码及编译环境,为日后的故障排查奠定了坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述: picker 是微信小程序中的原生组件,通常用于选择单项或多项值,如时…

PMP 证书的含金量怎么样?

pmp含金量,这是一个很有争议的话题,我根据我以往的面试跟工作经历对 PMP 也有几点看法,想跟大家聊一聊。 一、如果真心想做项目管理,PMP 一定要去考一个 现在的早已不是凭经验做项目的时代了,各大企业都追求专业式的…

Python数据类型进阶——详解

—— 小 峰 编 程 目录 1.整型 1.1 定义 1.2 独有功能 1.3 公共功能 1.4 转换 1.5 其他 1.5.1 长整型 1.5.2 地板除(除法) 2. 布尔类型 2.1 定义 2.2 独有功能 2.3 公共功能 2.4 转换 2.5 其他 做条件自动转换 3.字符串类型 3.1 定义 3.2 独有功能…

docker python:latest镜像 允许ssh远程

跳转到家目录 cd创建pythonsshdockerfile mkdir pythonsshdockerfile跳转pythonsshdockerfile cd pythonsshdockerfile创建Dockerfile文件 vim Dockerfile将Dockerfile的指令复制到文件中 # 使用 python:latest 作为基础镜像 # 如果我的镜像列表中没有python:latest镜像&…

c++的基础排序算法

一、快速排序 1. 选择基准值(Pivot) 作用 :从数组中选择一个元素作为基准(Pivot),用于划分数组。常见选择方式 : 固定选择最后一个元素(如示例代码)。随机选择&#xf…

jmeter分布式原理及实例

一、执行原理 二、相关注意事项 关闭防火墙所有上网控制机、代理机、服务器都在同一个网络上所有机器的jmeter和java版本必须一致关闭RMI.SSL开关 三、配置和执行 配置: 修改bin/jmeter.properties文件: 代理机: 修改服务端口&#xff1…

LinuX---Shell脚本创建和执行

概述: 它是一个命令行解释器,接收应用程序/用户命令,然后调用操作系统内核。 Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。 Linux提供的Shell解析器有 atguiguubuntu:~$ cat /etc/shells # /etc/shells: valid …

FPGA中级项目1——IP核(ROM 与 RAM)

FPGA中级项目1——IP核(ROM 与 RAM) IP核简介 在 FPGA(现场可编程门阵列)设计中,IP 核(Intellectual Property Core,知识产权核)是预先设计好的、可重用的电路模块,用于实…

第九节:哈希表(初阶)

1. 哈希表的核心概念 哈希表(Hash Table)是一种通过哈希函数将键(Key)映射到存储桶(Bucket)的数据结构,核心目标是实现快速查找、插入和删除操作。其核心特点如下: ​哈希函数&…

缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?

缓存使用场景、一致性及常见问题解析 一、缓存的核心使用场景 1. 高频读、低频写场景 典型场景:商品详情页、新闻资讯、用户基本信息。特点:数据更新频率低,但访问量极高。策略: Cache-Aside(旁路缓存)&a…

谷歌 Gemini 2.0 Flash实测:1条指令自动出图+配故事!

今天看到很多人夸Gemini 2.0 Flash的能力很强。 强大的P图能力,改背景、换衣服、调整姿态、表情控制等等 其中最让人眼前一亮的是图文功能。 它不仅是理解图文,而是能根据文字描述创作出一整个的故事、步骤图文。 我上手试了一下,感觉效果…

雷电模拟器连接Android Studio步骤

打开雷电模拟器,点击桌面系统应用—>打开设置—>关于平板电脑→连续点击5次版本号,会出现开发者选项—->进入开发者选项—->勾选打开usb调试。 命令行提示符,进入雷电模拟器安装目录。然后执行 Plain Text adb.exe connect 127.0…

配置普通链接二维码规则 校验文件检查失败

配置普通链接二维码规则 校验文件检查失败 1.问题 2.解决思路: 直接访问地址,不跳转文本,感觉是nginx配置问题打开服务器nginx 域名默认走80端口,配置了指定的访问路径,命令行 nginx -t ,nginx -s reload,start ngin…

c语言经典基础编程题

c语言经典基础编程题 一、输出输出1.1温度输出1.2排齐数据1.3进制转换 二、选择分支2.1求最大值2.2成绩评定2.3分段函数求值2.4 利润计算2.5判断闰年2.6二次方程根 三、循环结构3.1倒数求和3.2最大数3.3判断素数3.4判断完全数3.5打印菱形🚀🚀&#x1f68…

安全的实现数据备份和恢复

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

OpenMCU(三):STM32F103 FreeRTOS移植

概述 本文主要描述了STM32F103移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_RTOS这个工程,该工程已经下载放好了移植STM32F103 FreeRTOS的所有文件 OpenMCU_RTOS工程的愿景…

生成对抗网络(GAN)原理与应用

目录 一、引言 二、GAN的基本原理 (一)生成器(Generator)的工作机制 (二)判别器(Discriminator)的工作机制 (三)对抗训练的过程 三、GAN在AIGC生图中的应…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接,异步是没时钟连接,靠约定号的频率(波特率)接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的,一般用不到…

Appium等待机制--强制等待、隐式等待、显式等待

书接上回,Appium高级操作--其他操作-CSDN博客文章浏览阅读182次,点赞6次,收藏7次。书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客。https://blog.csdn.net/fantasy_4/article/details/146162851主要讲解了Appium的一些…

NFS实验配置笔记

NFS NFS服务 nfs,最早是Sun这家公司所发展出来的,它最大的功能就是可以透过网络,让不同的机器,不同的操作系统,进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作…