我有一个golang项目,并将代码放在git服务器中的某个位置。
我所有的代码现在都在$ GOPATH / mygitserver / folder /上。

直到gitserver更改URL之前,一切都已准备就绪,因此我需要将所有导入都替换为新的gitserver URL。因此,我不想在将来再次拥有它,并且想要更改其工作方式。

因此,现在我计划将整个工作空间上传到git(不包括外部库),而不是将包仅推送到我的git服务器。因此,我将有一个直接指向src文件夹的包(例如:src / mypackage)。因此,当我更改gitserver网址时,所有内容仍然可以使用。

问题是:执行此操作(将工作区上传到git)是否是一种好习惯?还是我们还有其他选择?

而且还带来了另一个以前不存在的问题。因此,克隆工作区后,必须为该项目使用的所有库调用" go get"。 (以前不会发生这种情况,因为当我调用go get mygitserver / package时,Golang会自动下载依赖项)。有什么办法可以使所有依赖项下载只是我的一个命令?

如果您希望服务器频繁移动,则一种可行的解决方案是使用虚荣导入路径。

Vanity导入路径使您可以将代码保留在您拥有的域上的导入路径中,该域会将您重定向到代码存储的位置。例如,如果您将代码托管在Bitbucket上,但担心将来可能会迁移并且拥有域example.net,则可以托管代码,以便将其与import"example.net/myproject"一起导入,并在幕后将< x2>工具将从Bitbucket中获取它。为此,您必须在所需的域中提供一个文档,该文档包含以下格式的自定义元标记:

1
<meta name="go-import" content="import-prefix vcs repo-root">

因此,例如在example.net/myproject处提供以下HTML文件将重定向go get以克隆提供的Bitbucket URL(它当然也可以指向包括您自己的其他任何Git服务):

1
<meta name="go-import" content="example.net/myproject git https://bitbucket.org/myname/myproject.git">

要将Nginx配置为提供这些重定向,可以使用类似以下的配置(用您的项目名称和URL替换myPackage和URL,当然):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location ~ /myPackage/[a-z][a-z0-9]* {
    if ($args ="go-get=1") {
        add_header Content-Type text/html;
        return 200 '<meta name="go-import" content="$host/myPackage git https://bitbucket.org/myName/myPackage.git">';
    }
    rewrite ^ https://mygithosting.example.org/myName/myPackage? permanent;
}
location ~ /myPackage$ {
    if ($args ="go-get=1") {
        add_header Content-Type text/html;
        return 200 '<meta name="go-import" content="$host/myPackage git https://mygithosting.example.org/myName/myPackage.git">';
    }
    rewrite ^ https://mygithosting.example.org/myName/myPackage? permanent;
}

现在,只要您移动Git服务器,就可以在meta标签中更改URL。

如果您担心某些用户直接从Git服务器进行导入,而另一些用户则使用虚荣导入路径,则可以将此路径设置为软件包规范导入路径。规范导入路径在Go程序的一个文件中的package行上指定为特殊注释(与哪个无关)。他们看起来像这样:

1
import mypackage // import"example.com/mypackage"

现在,如果上面的代码实际上托管在其他地方,并且有人尝试直接将其导入,则go get将抱怨:

$去获取mygithosting.example.org/myName/myPackage
程序包mygithosting.example.org/myName/myPackage:/go/mygithosting.example.org/myName/myPackage目录中的代码希望导入" example.com/mypackage"

  • 感谢您的回答,但是您认为通过上传整个工作区是否很好?
  • 糟糕,对不起,是的,我可以在一开始就解决最初的问题。 我不太了解您的特定用例,但总的来说,Id表示"不,那是个坏主意"。 随着工作空间的增长,这只会使事情变得更难管理,人们将不得不创建变通和黑客手段,使其适应正常的开发流程(他们可能希望工作空间中的事物在全球范围内无法适应, 但他们不想意外签到Git)。