运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

    • 前言

    • Go基础知识

    • Go基本语法

    • 实战项目:简单web服务

    • 基本数据类型

    • 内置运算符

    • 分支和循环

    • 函数 function

    • 结构体 struct

    • 方法 method

    • 实战项目:跟踪函数调用链

    • 接口 interface

    • 并发 concurrency

    • 指针

    • 实战项目:实现轻量级线程池

    • 实战项目:实现TCP服务器

    • go常用包

    • Gin框架

    • go随记

      • import 本地 module
        • import 本地 module
      • 拉取私有module
      • 规划、发布和维护 Go Module注意事项
      • Go 1_18 泛型
      • Go语言中常用的代码优化点
  • Python

  • Shell

  • Java

  • Vue

  • 前端

  • 编程浅尝
  • Go
  • go随记
lyndon
2022-06-07
目录

import 本地 module

# import 本地 module

背景:项目依赖的是本地正在开发、尚未发布到公共站点上的 Go Module。

解决方法:借助 go.mod 的 replace 指示符。

解决步骤:

假设你有一个项目,这个项目中的 module a 依赖 module b,而 module b 是你另外一个项目中的 module,它本来是要发布到github.com/user/b上的。但此时此刻,module b 还没有发布到公共托管站点上,它源码还在你的开发机器上。也就是说,go 命令无法在github.com/user/b上找到并拉取 module a 的依赖 module b,这时,如果你针对 module a 所在项目使用 go mod tidy 命令,就会收到类似下面这样的报错信息:

$go mod tidy
go: finding module for package github.com/user/b
github.com/user/a imports
 github.com/user/b: cannot find module providing package github.com/user/b: module github.com/user/b: reading https://goproxy.io/github.com/user/b/@v/list: 404 Not Found
 server response:
 not found: github.com/user/b@latest: terminal prompts disabled
 Confirm the import path was entered correctly.
 If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
1
2
3
4
5
6
7
8

首先,需要在 module a 的 go.mod 中的 require 块中,手工加上这一条(这也可以通过 go mod edit 命令实现):

require github.com/user/b v1.0.0
1

注意,这里的 v1.0.0 版本号是一个“假版本号”,目的是满足 go.mod 中 require 块的语法要求。

然后,再在 module a 的 go.mod 中使用 replace,将上面对 module b v1.0.0 的依赖,替换为本地路径上的 module b:

replace github.com/user/b v1.0.0 => module b的本地源码路径
1

修改之后,go 命令就会让 module a 依赖你本地正在开发、尚未发布到代码托管网站的 module b 的源码了。

而且,如果 module b 已经提交到类 GitHub 的站点上,但 module b 的作者正在本地开发新版本,那么上面这种方法,也同样适合 module b 的作者在本地测试验证 module b 的最新版本源码。

这种方法也是有“瑕疵”的:

require 指示符将github.com/user/b v1.0.0替换为一个本地路径下的 module b 的源码版本,但这个本地路径是因开发者环境而异的。

go.mod 文件通常是要上传到代码服务器上的,这就意味着,另外一个开发人员下载了这份代码后,极大可能是无法成功编译的,他要想完成 module a 的编译,就得将 replace 后面的本地路径改为适配自己环境下的路径。于是,每当开发人员 pull 代码后,第一件事就是要修改 module a 的 go.mod 中的 replace 块,每次上传代码前,可能也要将 replace 路径复原,这是一个很糟心的事情。

但即便如此,目前 Go 版本(最新为 Go 1.17.x)也没有一个完美的应对方案。针对这个问题,Go 核心团队在 Go 社区的帮助下,在预计 2022 年 2 月发布的 Go 1.18 版本中加入了 Go 工作区(Go workspace,也译作 Go 工作空间)辅助构建机制。基于这个机制,可以将多个本地路径放入同一个 workspace 中,这样,在这个 workspace 下各个 module 的构建将优先使用 workspace 下的 module 的源码。工作区配置数据会放在一个名为 go.work 的文件中,这个文件是开发者环境相关的,因此并不需要提交到源码服务器上,这就解决了上面“伪造 go.mod”方案带来的那些问题。

上次更新: 2022/06/20, 00:40:53
一对多关联查询
拉取私有module

← 一对多关联查询 拉取私有module→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式