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

golang项目中如何使用私密仓库的扩展包

在go项目中,一般会经常使用import关键词来引入第三方的扩展包,比如:

package xxximport ("context""github.com/zeromicro/go-zero/core/logx"
)

上面的"github.com/zeromicro/go-zero/core/logx" 就是一个第三方扩展包,通俗的说,就是别人造好的一个轮子,我们直接拿来用。但是看,有些时候,我们需要引入一些私密仓库的扩展包,比如公司内部的仓库,不对外开放,如果像上面的方式直接引入的话就会报错。

比如,我这里有一个自己创建的sdk,存储到gitee平台,并且设置为私密仓库。然后在另外一个项目中引入,就会报错:

go get gitee.com/rxbook/rx_gosdk_demo

image-20250605103926706

接下来,就来实际操作一下,如何在自己的项目中引入私密仓库的扩展包。

首先,上面的gitee.com/rxbook/rx_gosdk_demo 里面的内容很简单,就是一个go文件,实现了“合并多个Excel为一个”的逻辑。核心代码如下:

mergeExcel.go

package mergeExcelimport ("errors""fmt""github.com/tealeg/xlsx""io/ioutil""os""path/filepath"
)// MergeExcelFiles 合并Excel文件
// sourceFilePath:需要合并的Excel文件所在的目录,比如 /home/rx/Documents/tmp_64c20e88848fb
// outputFileName:输出的文件名称,比如 result.xlsx
func MergeExcelFiles(sourceFilePath string, outputFileName string) (string, error) {if sourceFilePath == "" || outputFileName == "" {return "", errors.New("sourceFilePath or outputFileName is empty")}dir, err := ioutil.ReadDir(sourceFilePath)if err != nil {return "", errors.New("open sourceFilePath failed: " + err.Error())}//设置输出文件的完整路径,放在sourceFilePath的同级目录下outputDir := sourceFilePath + "/../" + outputFileNameoutputDir, err = filepath.Abs(outputDir)if err != nil {return "", errors.New("get outputDir failed: " + err.Error())}//合并后的文件var newFile *xlsx.Filevar newSheet *xlsx.SheetnewFile = xlsx.NewFile()var newErr errornewSheet, newErr = newFile.AddSheet("Sheet1")for _, fi := range dir {if newErr != nil {return "", newErr}//读取文件xlFile, err := xlsx.OpenFile(sourceFilePath + string(os.PathSeparator) + fi.Name())if err != nil {return "", errors.New("open failed: " + err.Error())}for _, sheet := range xlFile.Sheets {num := 0skipNum := 0 //跳过的行数for _, row := range sheet.Rows {num++//跳过前面多少行if num <= skipNum {continue}//将后面的行写入新的文件newRow := newSheet.AddRow()//newRow.SetHeightCM(1)for _, cell := range row.Cells {text := cell.String()//fmt.Printf("%s\n", text)newCell := newRow.AddCell()newCell.Value = text}}}}//写入文件newErr = newFile.Save(outputDir)if newErr != nil {return "", errors.New("写入文件失败:" + newErr.Error())}return outputDir, nil
}func SayHello() {fmt.Println("Nothing,Just Say Hello!")
}

设定 go.mod ,需要注意,这里的module要写完整的仓库地址,因为将来在其他项目中引入的时候要用到这个仓库地址。

这里的完整的仓库地址就是:gitee.com/rxbook/rx_gosdk_demo

module gitee.com/rxbook/rx_gosdk_demogo 1.23.3require github.com/tealeg/xlsx v1.0.5

以上就是所有的代码逻辑,接下来写一个测试用例,我们自己先来测试一下这个扩展包是可用的,再发布到远程仓库,确保其他人使用的时候是没问题的。

merge_test.go

package mergeExcelimport "testing"func TestMergeExcelFiles(t *testing.T) {resultFilePath, err := MergeExcelFiles("/Users/renxing/Documents/test1/bank", "银行网点.xlsx")if err != nil {t.Errorf("MergeExcelFiles failed: %v", err)return}t.Logf("MergeExcelFiles success, resultFilePath: %s", resultFilePath)
}func TestSayHello(t *testing.T) {// 测试 SayHello 函数SayHello()
}

执行以上测试用例,发现可以实现预期目标,将3个Excel文件合并成了1个:

image-20250605111140368

加下来,就要配置在其他项目中引入这个私密仓库的扩展包了。

首先,设置go envGOPRIVATE,命令如下:

go env -w GOPRIVATE=gitee.com # 这里的GOPRIVATE设置成指定的私密仓库的HOST,如果是github的,就改为 GOPRIVATE=github.com

接下来,如果是Mac或Linux系统,则如下设置: sudo vim ~/.netrc ,写入如下内容:

machine gitee.com login 你的仓库登录账号 password 你的仓库登录密码

如果是Windows系统,稍微有点不同,不是 修改 ~/.netrc文件,而是:C:\Users\<你的用户名>\_netrc 这个文件。写入的内容是相同的。

如果是阿里云的云效仓库:
go env -w GOPRIVATE=codeup.aliyun.com

sudo vim ~/.netrc 写入:
machine codeup.aliyun.com login 登录账户 password 登录密码

这样配置之后,再来 go get gitee.com/rxbook/rx_gosdk_demo 就可以了:

image-20250605110238363

然后,在要使用的项目中,直接调用上面仓库中写的两个方法,也是没有问题的。

image-20250605110608699

通过这样的方式,可以实现团队内部的底层扩展和实际业务解耦,方便更多的业务复用。

特别说明:如果按照上面的方式还是不能安装 gitee.com 的私密扩展,那么就在项目同级目录创建一个 my_sdk 目录,

然后手动克隆 git@gitee.com:rxbook/rx_gosdk_demo.git

接下来,在当前项目的 go.mod 中添加:

replace gitee.com/rxbook/rx_gosdk_demo => ../my_sdk/rx_gosdk_demo

http://www.lqws.cn/news/212563.html

相关文章:

  • 大模型在创伤性脑出血全周期预测与诊疗方案中的应用研究
  • JDK21深度解密 Day 15:JDK21实战最佳实践总结
  • Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程
  • ELF文件,静态链接(Linux)
  • 开疆智能Ethernet/IP转Modbus网关连接质量流量计配置案例
  • Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
  • 深度解析:Spring Boot 配置加载顺序、优先级与 bootstrap 上下文
  • 《JavaAI:稳定、高效、跨平台的AI编程工具优势解析》
  • RD-Agent-Quant:一个以数据为中心的因素与模型联合优化的多智能体框架
  • 408第一季 - 数据结构 - 字符串和KMP算法
  • 【Zephyr 系列 13】BLE Mesh 入门实战:构建基础节点通信与中继组播系统
  • 【C++】类型转换
  • 死锁的四个必要条件
  • HTML面试整理
  • 在Mathematica中使用Newton-Raphson迭代绘制一个花脸
  • 【判断既约分数】2022-4-3
  • Python60日基础学习打卡Day46
  • 杭州瑞盟 MS35774/MS35774A 低噪声256细分微步进电机驱动,用于空调风门电机驱动,香薰电机驱动
  • 【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析
  • 智能手表供应链与采购清单(Aurora Watch S1)
  • 用队列实现栈
  • [TI板]MSPM0G3507学习笔记(一) 超详细keil环境配置+烧录配置+空工程迁移+vscode配置+点灯
  • 容器安全最佳实践:云原生环境下的零信任架构实施
  • 游戏(game)
  • 【RTSP从零实践】1、根据RTSP协议实现一个RTSP服务
  • compose 组件 ---无ui组件
  • SDC命令详解:使用set_propagated_clock命令进行约束
  • 路过美国Intel公司
  • 【AI论文】反思、重试、奖励:通过强化学习实现大型语言模型的自我提升
  • 计算机组成原理-存储器的概述