让golang的get命令兼容gitlab

我们有些什么呢?

Gitlib已经发布了6.0,号称是企业级的版本了,作为私有git库的首选,自然越来越多人用

假设 有这样一个golang 的库,URL是 http://git.wendal.net/wendal/gofly

如果尝试执行下面的语句去获取这个库的话

go get git.wendal.net/wendal/gofly

#会输出
package git.wendal.net/wendal/gofly: unrecognized import path "git.wendal.net/wendal/gofly"

然而,如果我们输入

go get git.wendal.net/wendal/gofly.git

#会输出
fatal: repository 'git.wendal.net/wendal/gofly' does not exist
package git.wendal.net/wendal/gofly.git: exit status 128

为什么呢?貌似go get不支持自定义的库地址啊(git的)

且看 $GOROOT/src/cmd/go/vcs.go里面的一段代码

    // General syntax for any server.
    {
        re:   `^(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?Pbzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`,
        ping: true,
    },

可以看到, 对于未知的库地址(非github/Google Code/Bitbucket/Launchpad),都按这里的配置进行设置

按上述的正则表达式,输入git.wendal.net/wendal/gofly可以得到

root = git.wendal.net/wendal/gofly
repo = git.wendal.net/wendal/gofly
vcs  = git

What? 当使用git进行clone的时候,其实就执行了

git clone $repo $GOPATH/src/$root
#展开之后(假设GOPATH=/opt/gopath)
git clone git.wendal.net/wendal/gofly /opt/gopath/src/git.wendal.net/wendal/gofly

git库的地址当成本地路径了,不出错才怪呢

怎么解决呢? 添加自定义的库地址,跟github类似

首先,拷贝一份github的配置

    // Github
    {
        prefix: "github.com/",
        re:     `^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`,
        vcs:    "git",
        repo:   "https://{root}",
        check:  noVCSSuffix,
    },

改成

    // git.xwoods.org
    {
        prefix: "git.wendal.net/",
        re:   `^(?Pgit\.wendal\.net/(?P

.[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*))$`, ping: false, repo: "git@git.wendal.net:{p}.git", vcs : "git", },

注意 re和repo,做了特别处理哦,多一个p变量, 这样repo就把凑成标准的ssh式git地址,自动使用密钥(哈哈,私有库嘛)

最后,还需要把golang编译

# linux/mac 下
$GOROOT/src/make.bash

#windows下
cd %GOROOT%\src\cmd\go
go install

本文来自:Wendal 随笔

感谢作者:Wendal Chen

查看原文:让golang的get命令兼容gitlab

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。