Golang项目中如何轻松实现私有仓库pkg包的引入
在企业内部创建一个公共的Golang模块工程可以帮助提高代码复用性和开发效率。本文将从如何创建一个公共的Golang工程开始,指导你一步步创建它、并引入到你的工程中。
1、公共模块规范
下面是一个简单的步骤指南来创建这样一个公共模块项目。
创建版本控制仓库:使用版本控制工具(如Git)创建一个新的代码仓库,用于管理该公共模块工程的代码。
项目结构:定义好项目的结构,使其易于理解和使用。一个常见的Golang项目结构如下:
my-module/|- README.md # 项目文档和说明|- go.mod # Go模块定义文件|- go.sum # Go模块的依赖版本文件|- cmd/ # 命令行应用程序目录(如果有的话)|- pkg/ # 项目的库代码目录|- internal/ # 内部库代码目录,不对外公开|- examples/ # 示例代码目录|- tests/ # 单元测试和集成测试目录
-
Go模块初始化:进入项目根目录,运行
go mod init <module-name>来初始化 Go 模块。模块名称应该是该模块工程的唯一标识符。 -
编写代码:在
pkg/目录下编写公共的Golang库代码。这些代码应该是可复用的,不与具体应用逻辑绑定。 -
文档和注释:对于公共模块,清晰的文档和注释是非常重要的。确保每个公共函数和类型都有良好的注释,方便其他开发人员理解和使用。
-
示例代码:在
examples/目录下提供一些简单的示例代码,展示如何使用这个公共模块。 -
单元测试:编写完整的单元测试和集成测试,保证模块的正确性和稳定性。测试代码放在
tests/目录下。 -
版本管理:在Go中,版本管理使用Go Modules。当你的模块准备发布新版本时,确保适当地更新go.mod文件,并通过
go get <module-name>@<version>或go mod tidy来更新依赖关系。 -
持续集成:将公共模块纳入到企业的持续集成流程中,确保每次修改都通过了测试,并符合质量标准。
-
发布和文档:根据企业内部的发布流程,发布新的版本,并及时更新项目文档,方便其他开发人员使用。
以上是一个基本的指南来创建企业内部的Golang公共模块工程,可根据实现项目灵活调整。记得在开发过程中关注代码质量和安全性,并积极倾听来自其他开发人员的反馈,不断改进和优化模块。
2、如何引入公共模块
在Go中引入私有Git仓库的包可以通过在 go.mod 文件中添加 replace 或 require 语句来实现,具体取决于你的使用场景。以下是引入私有Git仓库包的三种常见方法。
在下述前两种方法中,你需要将 github.com/yourusername/yourprivatepkg 替换为你私有Git仓库的实际路径,然后根据需要设置路径或版本号。
完成后,运行 go mod tidy 命令来更新依赖。Go会自动下载和管理你的私有Git仓库包。
2.1 私有项目的路径替换
使用 replace 语句实现。
如果你希望在开发过程中使用本地路径或其他方式替代私有Git仓库,可以使用 replace 语句。这样可以方便地在不同环境中进行开发和测试。
如果私有项目 A 依赖另一个私有项目 B,且通过 go get 无法获取权限,可以采用 replace 方式。
在你的项目的 go.mod 文件中添加类似如下的 replace 语句,将私有Git仓库的路径替换为本地路径或其他路径:
replace github.com/yourusername/yourprivatepkg => /path/to/local/repo
或者,你可以使用相对路径:
replace github.com/yourusername/yourprivatepkg => ../path/to/local/repo
2.2 go mod私有项目的访问
使用 require 语句实现。
如果你想直接从私有Git仓库获取包并将其添加到项目依赖中,可以使用 require 语句。
在你的项目的 go.mod 文件中添加类似如下的 require 语句,将私有Git仓库的路径和版本号添加到依赖中:
require github.com/yourusername/yourprivatepkg v1.0.0
要实现上述方式,需要额外的配置,确保能够正常 go get 私有Git仓库的工程。
-
设置 Go GOPRIVATE 变量
# 配置多个私有项目地址 go env -w GOPRIVATE="gitlab.example.com" # 其中gitee.com/user 是你的个人账户所在地址-
默认情况下,如果设置GOPRIVATE,会自动设置GONOPROXY和GONOSUMDB配置;
-
Golang项目非代理NOPROXY配置
如果设置GONOPROXY和GONOSUMDB均为none,意味着所有module,不管是公共的还是私有的,都要经过proxy下载,经过sumdb验证。
-
-
私有仓库的请求认证
方法一:在请求URL中嵌入认证信息
git config --global url."https://${user}:${password}@gitlab.example.com".insteadOf "https://gitlab.example.com"Git全局配置查看和删除:
#查看git全局配置 git config --global -l # 删除url路径替换, 或是修改${GitProject}/.git/config文件中对应url git config --global --unset url."git@gitlab.example.com".insteadOf方法二:使用SSH替换HTTPS进行认证
git config --global url."git@gitlab.example.com".insteadOf "https://gitlab.example.com" -
Golang私有项目的http访问
如果私有库不支持https协议,会报如下的错误。这是因为Go更新依赖时,会强制校验CA证书来确保依赖库的安全性。
go: gitee.com/modules/project@v0.0.0-20200320063051-28c4ad7fe2ea: unrecognized import path "gitee.com/modules/project": https fetch: Get "https://gitee.com/modules/project?go-get=1": dial tcp 123.123.123:443: connect: connection refused如果私有库不支持https协议,还需要go配置参数或环境变量,使其使用http方式访问。
方法一:go get -insecure
使用
go get -insecure,这种方式不推荐,原因如下:-
添加 `-insecure`` 参数,即表示更新依赖时可以不去校验CA证书,但是这会带来一个问题:范围无法界定(overkill),所有与要更新依赖相关联的依赖,均不会去做校验,可能会意外更新到不安全的依赖。
-
-insecure仅支持 go get 命令,不支持 go mod 命令,因此使用 go mod 命令时是无法更新不支持https协议的私有库的。
方法二:GOINSECURE
添加
GOINSECURE参数,推荐这种方式。-
在Go 1.14 中增加了新的环境变量,用于指定哪些域名下的仓库不去校验 CA 证书。
-
使用方式同
GOINSECURE类似go env -w GOINSECURE=gitlab.example.com。
-
2.3 git 子模块(推荐)
在 Go 中,你可以使用 Git 子模块的方式引用私有的公共模块工程,以便在你的项目中使用。
-
创建 Git 子模块
在你的项目中,使用以下命令添加 Git 子模块,将私有的公共模块工程作为子模块引入:
git submodule add <repository-url> path/to/submodule其中
<repository-url>是你私有模块工程的 Git 仓库 URL,path/to/submodule是子模块在你的项目中的路径。 -
配置认证
如果你的私有模块工程需要身份验证,你可能需要在执行
go get或go mod时提供适当的认证凭证。这可能包括用户名、密码、Personal Access Token(如果使用 GitLab)等。 -
使用子模块的包
在你的项目中,可以通过
import语句引入子模块的包,然后在代码中使用这些包。import ("your/repo/path/to/submodule/package" )func main() {// 使用子模块的包submodulepackage.DoSomething() } -
使用 Go Modules 进行版本管理
确保你的项目启用了 Go Modules,并在
go.mod文件中添加了子模块的引用。go mod edit -replace=example.com/submodule=path/to/submodule -
更新子模块
如果子模块的工程代码发生变化,你可以进入子模块目录,使用
git pull更新子模块的代码。然后在你的项目根目录使用go mod tidy更新模块依赖。
3、总结
条条道路通罗马,技术更是如此。
具体选择那种取决于你的实际环境、实际场景,这里只提供一个思路、方向供大家参考。
参考文章:
- Go Mod引用私有库
- 怎么让Go Modules使用私有依赖模块
- Git: submodule 子模块简明教程
相关文章:
Golang项目中如何轻松实现私有仓库pkg包的引入
在企业内部创建一个公共的Golang模块工程可以帮助提高代码复用性和开发效率。本文将从如何创建一个公共的Golang工程开始,指导你一步步创建它、并引入到你的工程中。 1、公共模块规范 下面是一个简单的步骤指南来创建这样一个公共模块项目。 创建版本控制仓库&am…...
Python项目实战:基于napari的3D可视化(点云+slice)
文章目录 一、napari 简介二、napari 安装与更新三、napari【巨巨巨大的一个BUG】四、napari 使用指南4.1、菜单栏(File View Plugins Window Help)4.2、Window:layer list(参数详解)4.3、Window:layer…...
go的gin和gorm框架实现切换身份的接口
使用go的gin和gorm框架实现切换身份的接口,接收前端发送的JSON对象,查询数据库并更新,返回前端信息 接收前端发来的JSON对象,包含由openid和登陆状态组成的一个string和要切换的身份码int型 后端接收后判断要切换的身份是否低于该…...
仓库库存管理难点在哪?有哪些仓库库存管理软件?
仓库库存管理常见的难点有:库存数据混乱、库存成本较高、库存积压严重等问题 使用仓库管理软件,企业可以更好地管理库存、优化供应链、提高操作效率,并基于准确的数据进行决策和规划,从而解决许多仓库库存管理中的难题。 一、仓库…...
服务链路追踪
一、基础概念 1.背景 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如: 如何串联整个调用链路,快速定位问题?如何理清各个微服务之间的依赖关系?如何进行各个微服…...
macOS - 安装使用 libvirt、virsh
文章目录 关于 libvirt使用安装启动服务virsh 交互模式virsh 帮助命令 关于 libvirt libvirt 官网: https://libvirt.org/gitlab : https://gitlab.com/libvirt/libvirtgithub : https://github.com/libvirt/libvirt 只读,gitlab 的镜像 libvirt是一套…...
Windows Server 2019设置使用照片查看器查看图片的设置方法
1、使用winR快捷键快速打开运行,输入regedit打开注册表: 2、在注册表中找到:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations 3、在右侧新建字符串项: 4、例如新建两项.jpg 和.png值…...
【需求输出】流程图输出
文章目录 1、什么是流程图2、绘制流程图的工具和基本要素3、流程图的分类和应用场景4、如何根据具体场景输出流程图 1、什么是流程图 2、绘制流程图的工具和基本要素 3、流程图的分类和应用场景 4、如何根据具体场景输出流程图...
opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo
前言 本篇文档的demo包含了 1.使用OpenCV对图像进行处理,对图像进行置灰,旋转,抠图,高斯模糊,中值滤波,部分区域清除置黑,背景移除,边缘检测等操作;2.单纯使用opencv播放…...
stable-diffusion-webui 的模型更新
shared.py和sd_models.py中 shared.py: options_templates.update(options_section((sd, "Stable Diffusion"), {"sd_model_checkpoint": OptionInfo(None, "Stable Diffusion checkpoint", gr.Dropdown, lambda: {"choices": list_…...
Gin模板语法
Gin模板语法 文章目录 <center> Gin模板语法前提提醒Gin框架启动服务器模板解析模板渲染遇到不同目录下相同的文件如何加载和渲染自定义函数加载静态文件 前提提醒 由于有了前面template包的基础,所以该笔记不再过多详细分析 Gin框架启动服务器 语法: r:gin.Default()/…...
Go http.Handle和http.HandleFunc的路由问题
Golang的net/http包提供了原生的http服务,其中http.Handle和http.HandleFunc是两个重要的路由函数。 1. 函数介绍 http.HandleFunc和http.Handle的函数原型如下,其中DefaultServeMux是http包提供的一个默认的路由选择器。 func HandleFunc(pattern st…...
如何使用Kali Linux进行渗透测试?
1. 渗透测试简介 渗透测试是通过模拟恶意攻击,评估系统、应用或网络的安全性的过程。Kali Linux为渗透测试人员提供了丰富的工具和资源,用于发现漏洞、弱点和安全风险。 2. 使用Kali Linux进行渗透测试的步骤 以下是使用Kali Linux进行渗透测试的基本…...
简单易用且高效的跨平台开发工具:Xojo 2023 for Mac
Xojo for Mac是Mac平台上一个跨平台的针对桌面、Web、移动和Raspberry Pi的快速应用程序开发软件。与其他多平台开发工具相比,Xojo for Mac为开发人员提供了显着的生产率提高。 Xojo for Mac具有拖放功能,使您能够快速创建用户界面设计,然后…...
HIVE SQL实现分组字符串拼接concat
在Mysql中可以通过group_concat()函数实现分组字符串拼接,在HIVE SQL中可以使用concat_ws()collect_set()/collect_list()函数实现相同的效果。 实例: abc2014B92015A82014A102015B72014B6 1.concat_wscollect_list 非去重拼接 select a ,concat_ws(-…...
【问心篇】渴望、热情和选择
加班太严重完全没有时间学习,怎么办? 我真的不算聪明的人,但是,我对学习真的是有渴望的。说得好听一点,我希望自己在不停地成长,不辜负生活在这个信息化大变革的时代。说得不好的一点,就是我从…...
【贪心】CF1841 D
Codeforces 题意: 思路: 首先模拟一下样例 并没有发现什么 那么就去考虑特殊情况,看看有没有什么启发 考虑一个大区间包含所有小区间的情形,这种情况就是在这么多区间中找出两个区间 换句话说,这么多区间组成一个…...
移动端预览指定链接的pdf文件流
场景 直接展示外部系统返回的获取文件流时出现了跨域问题: 解决办法 1. 外部系统返回的请求头中调整(但是其他系统不会给你改的) 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…...
【Go 基础篇】Go语言字符类型:解析字符的本质与应用
介绍 字符类型是计算机编程中用于表示文本和字符的数据类型,是构建字符串的基本单位。在Go语言(Golang)中,字符类型具有独特的特点和表示方式,包括Unicode编码、字符字面值以及字符操作。本篇博客将深入探讨Go语言中的…...
Java基础(十二)面向对象编程 OOP
一、抽象数据类型 1.面向对象基本概念 1. 面向对象 面向对象程序设计(OOP)是一种基于对象概念的软件开发方法,是目前软件开发的主流方式。 常见面向对象的语言:C 、Python 、Java 常见面向过程的语言:C 面向对象的三…...
Linux驱动开发:proc接口原理、实现与调试实战
1. 项目概述:为什么需要了解proc接口?在Linux驱动开发这条路上,很多开发者朋友都曾有过这样的困惑:我的驱动模块加载成功了,设备也识别了,但怎么才能直观地看到它内部的工作状态、配置参数,或者…...
从‘指代消解’到‘看图说话’:手把手拆解Transformer解码器如何像人一样‘生成’内容
从‘指代消解’到‘看图说话’:拆解Transformer解码器的内容生成魔法 想象一下,当你看到一张照片——一只猫蹲在键盘上,爪子按着删除键。你会脱口而出:"它在删我的代码!"这个瞬间完成的"看图说话"…...
如何5分钟快速集成PinLockView到你的Android应用:终极指南 [特殊字符]
如何5分钟快速集成PinLockView到你的Android应用:终极指南 🚀 【免费下载链接】PinLockView A clean, minimal, highly customizable pin lock view for Android 项目地址: https://gitcode.com/gh_mirrors/pi/PinLockView PinLockView 是一个专为…...
《Sysinternals实战指南》ZoomIt 学习笔记(11.9):绘图模式——演示时“手写板”:标注、圈画、临时白板
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
深度解析:基于RAG与任务执行的AI Agent全能力矩阵在话务系统的工程实践
在企业通讯架构演进中,话务系统正经历从流程驱动向智能驱动的范式转移。传统话务台高度依赖预设的IVR流程与人工查询,不仅交互生硬,且存在严重的数据孤岛问题。本文将聚焦AI Agent的全能力矩阵,从技术架构与业务逻辑层面ÿ…...
开源fNIRS脑机接口帽技术解析与应用
1. 开源可穿戴fNIRS脑机接口帽技术解析在神经工程领域,功能性近红外光谱(fNIRS)技术正逐渐成为研究大脑活动的重要工具。与传统的脑电图(EEG)或功能磁共振成像(fMRI)相比,fNIRS具有独…...
Keil MDK构建时间戳记录方案与实现
1. 项目概述:Keil MDK构建时间戳记录方案在嵌入式开发中,项目构建(Project Build)的时间管理是个容易被忽视却至关重要的细节。当我们需要调试复杂工程时,准确记录构建开始时间可以帮助我们同步调试日志;而…...
终极RPG Maker游戏资源解密工具:无需安装的浏览器解决方案
终极RPG Maker游戏资源解密工具:无需安装的浏览器解决方案 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://git…...
从ENVI到MATLAB:高光谱图像处理工作流迁移指南(以真假彩色显示为例)
从ENVI到MATLAB:高光谱图像处理工作流迁移指南(以真假彩色显示为例) 对于长期使用ENVI进行遥感影像分析的研究者而言,MATLAB的编程环境提供了截然不同的工作流体验。本文将聚焦高光谱图像可视化这一基础但关键的操作,系…...
基于RL78/G13的电位器ADC采集与串口通信上位机显示系统设计
1. 项目概述与核心思路最近在整理工作室的旧零件,翻出来一块瑞萨电子的RL78/G13开发板,还有几个吃灰的电位器。想着不能浪费,就琢磨着做个简单但能体现MCU基本功的小项目:用这块开发板实时采集电位器的电压,并把数据上…...
