使用" go get"在个人git仓库

时间:2014-10-13 19:31:55

标签: git go

我在个人VPS上托管我的git存储库,我有一个我想制作的软件包" go get" -able。我试图通过发出" go help importpath"找到帮助文档的所有内容。没有运气。无论我做什么,我都会收到以下错误:

package example.com/user/package: unrecognized import path "example.com/user/package"

我已经尝试了所提到的META标签的每个组合以及相同的结果。

<meta name="go-import" content="example.com git http://example.com/user/package">

可以通过http://example.com/user/package.git访问实际的git存储库。我可以直接克隆它,但我想去下载并正确安装。

根据帮助文档,如果go向http://example.com/user/package?go-get=1发出请求,则返回的页面包含META标记。如果go然后向http://example.com/?go-get=1发出后续请求,则返回的页面也包含完全相同的META标记。<​​/ p>

是否需要在服务器上进行任何特殊配置?我不会这么认为,因为go会通过http请求访问存储库。

我的智慧结束了。我们非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:18)

这是我为gitlab服务器配置nginx的元标记: 如果您请求http://mygit.server/group/project?go-get=1

你得到:

<meta content='mygit.server/group/project git git+ssh://git@mygit.server/group/project.git' name='go-import'>

它就像一个魅力。

这是执行此操作的nginx重写规则:

location ~ "(/[^/]+/[^/]+)(/.*)?" {
    if ($arg_go-get = "1") {
            echo '<html><head><meta name="go-import" content="my.domain.com$1 git git+ssh://git@my.domain.com$1"/></head></html>';
    }
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

这当然假设您正在使用git而不是ssh。如果您使用https,请相应地重写网址。

答案 1 :(得分:2)

只是为了扩展@Not_a_Golfer的答案,这非常有帮助。

我为我的Gerrit安装使用Gitiles浏览源代码,所以现在godoc工作(它将文​​档链接到正确的代码行):

    # http://stackoverflow.com/questions/26347516/using-go-get-on-a-personal-git-repo/26348986#26348986
    location ~ "(/[^/]+)(/.*)?" {
        if ($arg_go-get = "1") {
                echo '<html><head><meta name="go-import" content="myserver.example.com$1 git https://myserver.example.com$1"/><meta name="go-source" content="myserver.example.com$1 https://myserver.example.com/plugins/gitiles$1 https://myserver.example.com/plugins/gitiles$1/+/master/{dir} https://myserver.example.com/plugins/gitiles$1/+/master/{dir}/{file}#{line}" /></head></html>';
        }
        try_files $uri @gerrit;
    }

    location / {
        try_files $uri @gerrit;
    }

答案 2 :(得分:1)

我刚刚为自己做了这个 - 类似的场景:一些小型回购和一个大多数私人网站。 Nginx配置:

root /var/www;

location / {
    try_files $uri?$args $uri $uri/ @my-proxy;
}
然后我跑了:

$ echo '<html><head><meta name="go-import" content="example.com/project-name git git+ssh://example.com/~/code/magic/blah/project-name.git" /></head></html>' > /var/www/project-name\?go-get\=1
  • 查询字符串嵌入到文件名中,如果存在,则nginx服务。
  • 我们为每个项目创建一个适当(略微怪异)名称的文件。
  • 每个文件都包含一个带有相应<meta />标记
  • 的最小HTML文档

成本是对位置块每次点击的额外stat()调用,但是你避免使用可怕的nginx if指令和树外echo模块,并且可以轻松地调整每个存储库的元内容。

如果这些奇怪的文件名有误,您可以限制范围:.go文件中的import "example.com/code/project-name"和nginx中的location /code { try_files ... }