1

go modules 使用本地库、合规库、私有库

 2 years ago
source link: https://studygolang.com/articles/35234?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

公司项目使用 go module 开发的过程中会有一些自己的库要引用,这些库用gitlab管理,需要研究引用gitlab库的方法,下面是研究过程中的一些经验。

介绍两种引用方案:

  • 1、引用本地目录
  • 2、引用合规地址库
  • 3、引用私有不合规库
  • 4、恶心至极的私有不合规库

上述名词中的 合规 是指:

  • [x] 库的地址是通过域名方式访问
  • [x] 支持HTTPS
  • [x] 库的地址通过 80 和 443 端口,而不是其它端口

满足上述条件即是 合规库,否则是 不合规库,由于通常不合规库都是私有的,这里直接叫 私有不合规库。 其中,违反第3点的最为恶心(官方不支持,给官方提需求的同时,不得不吐槽这种情况太恶心了)。

注意:本文撰写于 2020年7月3日,go版本 1.14.4,到撰写日为止内容真实有效,均经过本人验证。

二、引用本地目录

修改文件 go.mod:

module main

go 1.14

// 替换规则
replace (
    github.com/pborman/uuid => /data/go-packages/uuid v1.2.0 // 绝对路径 或 相对路径 都可以
)

// 源地址
require (
    github.com/pborman/uuid v1.2.0
)

默认使用 github.com/pborman/uuid 包会到 Github 上去下载,但这个包还在本地开发中并未push到线上,那么可以通过 replace 配置来重定向当前项目对该包的加载路径:

github.com/pborman/uuid => /data/go-packages/uuid

这里 /data/go-packages/uuid 为本地包的绝对路径,这样写就可以了,当本地 uuid 包代码修改后就可以在当前项目看到实时效果了,注意中间符号是 =>

配置好以后正常拉取代码、编译、调试。

二、引用合规库

引用本地目录类似,修改文件 go.mod:

module main

go 1.14

// 替换规则
replace (
    github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 开源中国地址
)

// 源地址
require (
    github.com/pborman/uuid v1.2.0
)

接下来正常拉取代码、编译、调试。

三、引用私有不合规库

这里我们介绍第二种情况

3.1、配置仓库访问权限

有以下两种授权方式:

  • 1、访问令牌(Access Token)

    通过在gitlab生成个人的“访问令牌”,并在拉取git仓库的机器上配置Token来实现访问仓库。

    通常是在这个地址:https://{{gitlab_url}}/profile/personal_access_tokens

    {{gitlab_url}} 是gitlab地址

    personal_access_tokens

  • 2、SSH秘钥(SSH Key) 【推荐】

    通过在gitlab的 个人账户 或者 仓库 下面配置 SSH秘钥,来实现客户端访问仓库。

    注意:这种方式高效、简单,只要保证本地 .ssh 目录下存在相应的秘钥对即可。

3.2、本地配置“访问令牌(Access Token)”参数

"ssh密钥"授权忽略本节

对本项目生效:

git config http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"

对所有git项目生效:

git config --global http.extraheader "PRIVATE-TOKEN:YOUR_PRIVATE_TOKEN"

注:根据需求任意选择上面一个配置即可

3.3、配置使用git方式拉取代码

git config --global url."git@{{gitlab_url}}:groupName/projectName.git".insteadOf "https://{{gitlab_url}}/groupName/projectName.git"` 

也可以直接全局替换,那么可以拉取域名下的所有包,如:

git config --global url."git@{{gitlab_url}}:".insteadof "https://{{gitlab_url}}/"

上面是通过命令修改配置,也可以像这样,直接修改配置文件 ~/.gitconfig,在里面添加如下配置:

[url "git@{{gitlab_url}}:"]
    insteadOf = https://{{gitlab_url}}/

insteadof 中的参数是 https,因为不管目标地址是http还是https,go get默认使用https方式访问,因此我们要强制将https转换成git协议。

五、恶心至极的私有不合规库

为什么会有恶心至极的私有不合规库?这种库有什么特点?

这种库把合规库所有的标准践踏一遍,也就是说它违反了每一条规则:

  • 1、ip访问
  • 2、端口非80、443
  • 3、没有证书

其中第3点并不重要,第2点是产生这种情况的根源。

这种情况下,我们要:

  • 1、结合 “三、引用私有不合规库”

  • 2、在 go.mod 和 git config 中配置别名(映射)

    通过两次别名,重定向到 IP:Port

    • 2.1、在 go.mod 中配置地址别名,该别名必须是真实有效的 HTTPS 地址

      go.mod 配置:

      module main
      
      go 1.14
      
      // 替换规则
      replace (
          github.com/pborman/uuid => gitee.com/gober/uuid v1.2.0 // 第一次别名地址,地址真是有效,并且是HTTPS
      )
      
      // 源地址
      require (
          github.com/pborman/uuid v1.2.0
      )
      
    • 2.2、在 git config 中再次配置别名,将 go.mod 中的别名指向真正的地址

      git config --global url."[email protected]:CloudComputing/Cloud-Fundamation/Operation-Center".insteadof "https://gitee.com/gober"
      

参考资料及附录


本文由 qingchuwudi 译制或原创,除非另有声明,在不与原著版权冲突的前提下,本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 88x31.png 进行许可。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK