go 使用 gitlab 搭建私有化模块系统

news2024/11/15 15:54:11

背景

本教程旨在教大家使用私有化部署的 gitlab 作为 go 的代码共享库,帮助团队分离代码模块,加强质量管控。go 官方在实现过程中就高度结合 VCS 系统,
可以仅通过配置相关的环境变量就实现私有库在 VCS 上的搭建。

代码分离样例

这里直接举出各种开发场景,提供开箱即用的案例参考,内部核心原理最后部分再讲。

案例1: 我会使用 gitlab, 我只想提交代码,不想搞什么 go 的配置

摘要

gitlab 拉下来的代码是一个独立的目录,建立对这个目录的依赖就可以使用这个模块的代码

## 配置项目对 example.com/project2 的包依赖定位到本地代码目录中
go mod edit -replace example.com/project2=../project2

## replace 完还需要手动 go get 来建立依赖关系
go get example.com/project2
案例讲解

这里从零创建两个独立模块 project1, project2 来讲解。至于 gitlab 拉取的项目也是一个独立的目录,按照下面的方法建立本地依赖即可。

在这里插入图片描述

project1, project2 分别初始化

C:\Project\code-all\project1> go mod init example.com/project1
go: creating new go.mod: module example.com/project1

C:\Project\code-all\project2> go mod init example.com/project2
go: creating new go.mod: module example.com/project2

在项目 project2 中新建自己的模块文件,暴露自己的公有函数

project2/result.go

package myfunc

func HelloProject2() string {
	return "这里是 project2 的工具方法"
}

在项目 project1 中导入模块 example.com/project2,使用暴露的方法

注意,直接这么写还不能让 go 正确定位模块,IDE 也会缺少语法提示

project1/main.go

package main

import (
	"fmt"

	myfunc "example.com/project2"
)

func main() {
	fmt.Print(myfunc.HelloProject2())
}

对本地分离的代码模块,go 提供 go mod edit -replace 指令来进行依赖管理。
我们在 project1 中使用该指令添加本地代码依赖

## 配置项目对 example.com/project2 的包依赖定位到本地代码目录中
go mod edit -replace example.com/project2=../project2

## replace 完还需要手动 go get 来建立依赖关系
go get example.com/project2

执行结果

C:\Project\code-all\project1> go mod edit -replace example.com/project2=../project2
C:\Project\code-all\project1> go get example.com/project2
go get: added example.com/project2 v0.0.0-00010101000000-000000000000
C:\Project\code-all\project1> 

现在运行 project1/main.go,可以看到 myfunc 包的函数被正常调用了

C:\Project\code-all\project1> go run .\main.go
这里是 project2 的工具方法
拓展

这个案例讲解的是怎么把本地的代码模块作为依赖添加到项目中。
go 官方推荐的用法是用这个 replace 方法做一些工具库的调试。
比如你依赖了一个流行的库,可以用这个方法在不改变主工程代码 import 语句的情况下,将库的代码手动拉下来,然后建立本地依赖进行调试。

官方举例:

replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5

replace (
    golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5
    golang.org/x/net => example.com/fork/net v1.4.5
    golang.org/x/net v1.2.3 => ./fork/net
    golang.org/x/net => ./fork/net
)

更多讲解查阅 https://go.dev/ref/mod#go-mod-file-replace

案例2:我不想把项目代码拉到本地来建立依赖,能不能像使用其他库那样直接从网络拉取

摘要

go 一开始就深度结合了 VCS 系统,提供了非常简便的环境变量配置来完成模块私有化的问题

## 配置私有域名,go 查找依赖时就不会经过 GOPROXY
go env -w GOPRIVATE=gitlab.b.com

## gitlab 没有配置 https 的话, 还需要配置域名让 go 拉包时发 http
go env -w GOINSECURE=gitlab.b.com

## 加一个不做公共校验的配置
go env -w GONOSUMDB=gitlab.b.com

## 创建 gitlab 仓库,将我们需要共享的库代码的 module 改为 gitlab 仓库地址
## 举例
module gitlab.b.com/c/test-helloworld.git

## 新建一个 gitlab 仓库 test-helloworld ,可见性设为 public, 上传自己的模块代码,
## 现在可以直接中 gitlab 拉取模块代码了
## 注意,模块地址后面要用 .git 结尾,不然拉取模块走的是 HTTP GET
go get gitlab.b.com/c/test-helloworld.git
案例讲解

案例1 中我们讲解了怎么建立对本地模块的依赖,或者说对独立拉取的 gitlab 项目代码的依赖。replace 方式并不是官方推崇的模块私有化方法。因为这样每次模块代码更新了,你都要手动在本地的目录中同步更新。目前网络上主流的模块升级方法是在项目中更改一下版本号后重新拉取模块即可。

go 的底层已经针对各种 VCS 系统 (.bzr, .fossil, .git, .hg, .svn)做了适配,可以简单的从模块地址是否以 VCS 后缀结尾来选择模块拉取逻辑

首先我们要配置我们的内部仓库域名为私有域名,一般 go 项目配置的代理 GOPROXYhttps://goproxy.cn,direct

所以需要配置私有域名,绕过我们配置的代理

go env -w GOPRIVATE=gitlab.b.com

gitlab 没有配置 https 的话, 需要配置域名让 go 拉包时发 http

go env -w GOINSECURE=gitlab.b.com

搭配不做公共校验的配置

go env -w GONOSUMDB=gitlab.b.com

接下来就是重点了,我们一定要对线上的模块打 git tag 标签,go 才能正常的完成拉取。我们下载 go 依赖时一般也会写上版本号,这个版本号就是 git tag 的对应名字。默认是 latest

下面我们试着将上面创建的 project2 上传到 gitlab 进行共享

cd ..\project2\
git init .
git add .
git commit -m "init"
git remote add origin ssh://git@gitlab.b.com:11111/c/go-test-project2.git
git push origin master

现在 gitlab 线上已经有我们的代码了,但这时还没有打 tag
在这里插入图片描述
完成了上面的环境变量设置后,我们在 project1 移除 replace 后再用 go get 来拉取我们的线上模块

不出意外报错了

C:\Project\code-all\project1> go get gitlab.b.com/c/go-test-project2
go get: unrecognized import path "gitlab.b.com/c/go-test-project2": 
parse http://gitlab.b.com/c/go-test-project2?go-get=1: 
no go-import meta tags (meta tag gitlab.b.com:81/c/go-test-project2 did not match 
import path gitlab.b.com/c/go-test-project2)

这里直接讲分析
当拉去一个模块时,如果模块的 URL 地址 gitlab.b.com/c/go-test-project2 后面没有携带 VCS 后缀(如 .git, .svn),go 将通过 HTTP GET 的方式去请求模块代码,发出的请求如:
http://gitlab.b.com/c/go-test-project2?go-get=1

会携带上 go-get=1 作为标志。一般的解决方法是 nginx 做一个反向代理,伪造正常响应来处理。但是内部配置的 gitlab 运行在非 80 端口上时,对 80 的访问会收到重定向的响应。这也是 go 会去请求 gitlab.b.com:81/c/go-test-project2 的原因。

但是 go 内部的包路径不允许携带端口在 URL 中,所以就中断了拉取流程。

而当包的 URL 携带了 .git 时,go 会进入直连模式,并且使用 git 来拉取代码。我们试一下

C:\Project\code-all\project1> go get gitlab.b.com/c/go-test-project2.git 
go: downloading gitlab.b.com/c/go-test-project2.git v0.0.0-20240726024502-c0914057a375
go get: gitlab.b.com/c/go-test-project2.git@v0.0.0-20240726024502-c0914057a375: parsing go.mod:
        module declares its path as: example.com/project2
                but was required as: gitlab.b.com/c/go-test-project2.git

可以发现现在 go 可以正常下载仓库代码,但是进行模块分析时报错,显示我们请求的模块路径和模块自己声明的路径不一致。我们模块里面写的 example.com/project2,但是请求是用的 gitlab.b.com/c/go-test-project2.git

所以我们修改 project2 的 module 为 gitlab.b.com/c/go-test-project2.git,然后提交到 gitlab 后重新拉取。

project2/go.mod

module gitlab.b.com/c/go-test-project2.git

go 1.17

现在重新拉取,可以看到模块被成功拉到本地了,而且是 go 去管理

C:\Project\code-all\project1> go get gitlab.b.com/c/go-test-project2.git 
go: downloading gitlab.b.com/c/go-test-project2.git v0.0.0-20240726030655-fa5e48794cf3
go get: added gitlab.b.com/c/go-test-project2.git v0.0.0-20240726030655-fa5e48794cf3

至此,已经完成了模块私有化的全部流程。

拓展

为了更好的对代码进行版本控制,标准的流程是在拉起 go 的模块时,需要携带版本号。这里演示一下怎么建立版本号:

首先在 project2 项目中打一个 git tag

C:\Project\code-all\project2> git tag -a v1.0.0 -m 'my version 1.0.0' 
C:\Project\code-all\project2> git show v1.0.0
tag v1.0.0
Tagger: c<c@b.org>
Date:   Fri Jul 26 11:17:28 2024 +0800

my version 1.0.0
tag v1.0.0
Tagger: c<c@b.org>

然后将这个 tag 发布到线上

C:\Project\code-all\project2> git push origin v1.0.0
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 160 bytes | 160.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To ssh://gitlab.b.com:10022/c/go-test-project2.git
 * [new tag]         v1.0.0 -> v1.0.0

现在我们可以用版本号来拉取代码了,可以看到 go 自动帮我们更新了依赖的版本

C:\Project\code-all\project1> go get gitlab.b.com/c/go-test-project2.git@v1.0.0
go: downloading gitlab.b.com/c/go-test-project2.git v1.0.0
go get: upgraded gitlab.b.com/c/go-test-project2.git v0.0.0-20240726030655-fa5e48794cf3 => v1.0.0

更多 go get 版本控制查阅
https://pkg.go.dev/cmd/go#hdr-Add_dependencies_to_current_module_and_install_them

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

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

相关文章

QT安装步骤

1、下载 打开下载链接&#xff1a; Index of /official_releases/online_installers页面下载在线安装工具 选择下载 qt-unified-windows-x64-online.exe&#xff0c;等下载完毕后直接运行即可 2、安装 下一步 下一步 选择安装目录&#xff0c;下一步&#xff0c;进入选择安装…

GalaChain 全面剖析:为 Web3 游戏和娱乐而生的创新区块链

作者&#xff1a;Stella L (stellafootprint.network) 原文首发于 CoinGecko Footprint Analytics 专栏。 什么是 GalaChain? GalaChain 是一款专为娱乐领域打造但具备广泛适用性的 Layer 1 区块链&#xff0c;由 Gala 构建&#xff0c;旨在支撑其日益扩张的娱乐生态系统。…

吴恩达辞任Landing AI CEO,专注AI投资?数学家斯蒂芬预言哲学家引领AI未来|AI日报

文章推荐 与人类产生情感共鸣&#xff1f;数字华夏推出“夏澜”人形机器人&#xff1b;微软Azure AI语音服务推出虚拟人形象&#xff5c;AI日报 码上报名丨大模型论坛&#xff0c;热议技术创造力与应用想象力 今日热点 国内首家人工智能标准化研究机构&#xff0c;北京人工…

Ubuntu下部署Hadoop集群+Hive(四)

更换为Tez计算引擎 准备环境&#xff1a; apache-tez-0.10.3-bin.tar.gz 下载地址&#xff1a;Index of /apache/tez (tsinghua.edu.cn) 步骤&#xff1a; 1.将apache-tez-0.10.3-bin.tar.gz包上传到安装hive的节点服务器&#xff0c;放到/opt/software目录下&#xff1b;…

Java实现UDP通信

文章目录 UDP 通信的基本概念Java 中的 UDP 编程入门例子实时通信和多发多收 UDP 通信的基本概念 无连接&#xff1a;UDP是一种无连接协议&#xff0c;发送数据之前不需要建立连接。不可靠&#xff1a;UDP不保证数据包的可靠传输&#xff0c;数据包可能会丢失。轻量级&#xf…

AI驱动下的协作经济模式可能性

人工智能 &#xff08;AI&#xff09; 已经变得无处不在&#xff0c;从我们醒来的那一刻到我们入睡的那一刻&#xff0c;它悄无声息地塑造着我们的日常体验。它策划我们的新闻提要&#xff0c;推荐我们的娱乐节目&#xff0c;甚至影响我们的财务决策。 随着 AI 覆盖范围的扩大&…

一、创建项目

项目中使用dotween插件&#xff1b; 一、建立预制体 首先创建一个空物体和一个父物体&#xff1b;在子物体身上挂载SpriteRenderer&#xff1b;父物体身上挂载代码和2D碰撞器 二、建立数据类集合&#xff08;ScriptObject&#xff09; 引用命名空间&#xff1b;创建数据类的…

基于SSM框架的客户经理信息管理系统开发与设计

基于SSM框架的客户经理信息管理系统开发与设计 嗨&#xff0c;我是射手座的程序媛&#xff0c;期待和大家更多的交流与学习&#xff0c;欢迎添加3512724768。 1.软件开发流程 软件的开发流程包括&#xff1a;问题的定义及规划、需求分析、软件设计、程序编码、软件测试五个阶…

网络优化2|最小生成树|Kruskal|Prim|Matlab

最小生成树问题 树 连通图 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G中不含任何回路&#xff0c;则称G为树。 ∣ V ∣ 1 |V |1 ∣V∣1时称之为平凡树 生成树 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G的一个生成子图是一棵树&#xff0c;则称之为G的一棵生成树&#…

Redis中的缓存穿透、缓存击穿、缓存雪崩(面试版)

缓存穿透 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;在mysql数据库中查询不到数据也不会写入缓存&#xff0c;导致每次请求都查询数据库&#xff0c;增加数据库负载。 解决办法&#xff1a; 1、缓存空值:将数据库中不存在的结果(例如空值)也缓存起来&#xff0c…

链式二叉树(C语言数据结构)

前言&#xff1a; 前期学习二叉树&#xff0c;包括堆&#xff0c;都是利用数组实现。 接下来就用链表的形式实现二叉树&#xff0c;并实现二叉树的相关功能。 二叉树前序遍历&#xff1a; 什么是前序遍历&#xff0c;任何一棵二叉树都可以分为根和左子树、右子树。 例如&…

【黑马点评】优惠券秒杀(单体模式)

优惠券秒杀业务流程 一人一单&#xff1a;要保证一个用户最多只能下一单 用户提交优惠券id根据优惠券id查询优惠券信息判断秒杀是否开始或结束&#xff0c;如果秒杀尚未开始或已经结束就直接返回错误信息判断库存是否充足&#xff0c;如果库存数量小于1就直接返回错误信息根据…

火源类型检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

火源类型检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

word技巧:保护Word文档页眉,确保内容不被随意修改

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…

无线领夹麦克风哪个牌子好?麦克风品牌排行榜前十名推荐

在直播与Vlog盛行的当下&#xff0c;一款性能卓越、稳定可靠的无线领夹麦克风无疑是内容创作者的最佳拍档。然而&#xff0c;市场上的无线领夹麦克风种类繁多&#xff0c;质量参差不齐。不少商家为追求利润最大化&#xff0c;采用廉价材料制造&#xff0c;导致收音效果差、噪音…

SqlHelper 使用EF-Core框架

public async Task AddAsync<T>(T entity) where T : class{await _context.Set<T>().AddAsync(entity);await _context.SaveChangesAsync();} //增加实体 public 表面方法是公开的&#xff0c;所有其他类都可以调用 async 表方法内可能包含异步操作&#xff0c…

快手如何去水印教程,推荐五款免费高效去水印工具

随着互联网的快速发展&#xff0c;视频内容创作和分享变得越来越普及。很多视频创作者在分享自己的作品时&#xff0c;都希望能够去除视频中的水印&#xff0c;以保护自己的版权或提高视频的观感。本文将为您介绍五款高效的视频去水印工具&#xff0c;帮助您轻松去除视频中的水…

特斯拉CEO马斯克呼吁加州加强AI监管,市场关注国际贸易动态

特斯拉与AI监管&#xff1a;马斯克的倡议 特斯拉&#xff08;TSLA&#xff09;首席执行官埃隆马斯克&#xff08;Elon Musk&#xff09;周一在社交媒体上再次表达了他对人工智能&#xff08;AI&#xff09;监管的坚定立场。他呼吁加州通过SB 1047法案&#xff0c;要求科技公司和…

前端自我提升秘籍:用这个工具快速成为全栈开发者!

最近&#xff0c;有不少前端开发者都在讨论如何进一步提升自己的技能&#xff0c;尤其是那些一直在公司里负责后台管理系统的同学。毕竟&#xff0c;后台管理系统虽然重要&#xff0c;但往往功能固定、需求清晰&#xff0c;相对来说技术挑战有限。要想突破自己的技术瓶颈&#…

黑神话悟空配置要求_2024年黑神话悟空游戏电脑配置推荐

《黑神话&#xff1a;悟空》作为一款采用虚幻引擎打造的高品质游戏&#xff0c;对硬件配置有着一定的要求。包括操作系统、处理器、内存、显卡等多方面需求。有些同学一直问&#xff0c;黑神话悟空配置要求是什么&#xff1f;下面小编就针对这个问题给大家介绍黑神话悟空官方配…