Git 如何开发和测试本地go模块

Git 如何开发和测试本地go模块,git,go,symlink,go-modules,Git,Go,Symlink,Go Modules,我有这个剧本: #!/usr/bin/env bash set -eo pipefail cd "$(dirname "$BASH_SOURCE")"; pth_to_make="$GOPATH/src/ores/json-logging" mkdir -p "$pth_to_make"; rm -rf "$pth_to_make"; ln -sf "$PWD" "$pth_to_make"; 然而,这个模块并没有在go.mod中声明为go模块……我正在将一个不同的依赖项符号链接到repo

我有这个剧本:

#!/usr/bin/env bash

set -eo pipefail

cd "$(dirname "$BASH_SOURCE")";
pth_to_make="$GOPATH/src/ores/json-logging"
mkdir -p "$pth_to_make";
rm -rf "$pth_to_make";
ln -sf "$PWD" "$pth_to_make";
然而,这个模块并没有在go.mod中声明为go模块……我正在将一个不同的依赖项符号链接到repo中以测试它

生产中的真正依赖性在于:

"$GOPATH/src/github.com/oresoftware/json-logging"
测试路径为:

"$GOPATH/src/ores/json-logging"
现在,我只需要删除本地开发中真正的依赖路径,问题是它只需要删除repo中的.git文件夹,然后我不得不再次下载它

有没有什么方法可以让我在真正的repo/dep文件夹上进行符号链接,但不会丢失git文件?也许我可以:

 mv   "$GOPATH/src/github.com/oresoftware/json-logging"  "/tmp/gotemp/json-logging"
 # call the script above
 # then when I am done:
 rm -rf "$GOPATH/src/github.com/oresoftware/json-logging"
 mv "/tmp/gotemp/json-logging" "$GOPATH/src/github.com/oresoftware/json-logging"  # put it back

这是前进的最佳方式吗?

因此,为了进一步阐述我的评论,您所追求的似乎是
替换
指令,您可以阅读更多有关该指令的信息。但我在下面概述了一个简单的例子

如果我们想象一下目录结构:

├── replace-directive
│   ├── go.mod
│   └── replace.go
├── sandbox
│   ├── go.mod
│   └── main.go
replace指令
是一个go模块,其
go.mod
文件包含:

module example.com/replacedirective

go 1.14
Sandbox是我们希望使用此本地依赖项版本的地方,而不是从
example.com
获取该版本。因此,在我们的沙盒
go.mod
文件中,我们有如下替换指令

module example/sandbox

require (
  example.com/replacedirective v0.0.0  // This would be your reference to your production dependency
)

replace example.com/replacedirective => ../replace-directive // This is your local dependency

go 1.14

因此,现在当您在代码中引用模块时,它将使用本地依赖项。不需要符号链接。

停止做疯狂的事情。两次阅读如何编写Go代码。遵循它并停止摆弄文件路径。使用replace指令可以使用依赖项的本地版本。永远不要使用符号链接。请写。依赖关系管理通过go模块工作。使用围棋模块。通过go.mo文件中的replace指令使用本地版本的go模块。你尝试做的事情很容易出错(简单地说)。让我重复一遍:不要使用符号链接。停止做疯狂的事。尽可能使用Go模块。如果不是:使用正确的GOPATH设置,将源复制到那里。没有符号链接。“这是前进的最佳方式吗?”——停止与工具抗争。你可以坚持按你的方式做事,只按你的方式做事,并责怪工具,或者你可以接受有经验的人对这一主题的了解并听从他们的建议。这基本上取决于你。你似乎不愿意遵循推荐的做法,因为你不喜欢它们,你以前的工作方式不同,你不愿意理解这些做法背后的想法。那么,为什么还要在这里这样问呢?当其他人使用您的模块作为依赖项时,replace指令是如何工作的?毫无意义。它如何知道您是在您的机器上还是在某些最终用户的机器上?所以您希望所有使用您的代码的人都能使用可共享的分叉版本的依赖关系?如果您在您的机器上设置了符号链接,它们将不会在另一台机器上设置-如果这是您所追求的,并且您只希望它出现在您的机器上进行测试,那么不要提交更改后的
go.mod
文件(在大多数情况下,我不建议这样做)。这样,其他人将默认返回存储在
example.com
的原始模块。我不明白。我的回购协议中的
go.mod
文件将被依赖于我的其他模块使用。如果replace指令在我的
go.mod
文件中,那么除了我的机器之外,这不会让任何机器上的人陷入混乱吗?你要找的东西非常不清楚。据我所知,您有一个依赖于包的项目。出于测试目的,您希望临时将该包指向一个本地包。这是你希望你的团队也做的事情吗?在这种情况下,他们将需要访问您的本地软件包,无论何时,您都可以共享go.mod。您认为您需要更新您的问题,以便更具体地了解您对a)您的机器b)其他人的机器c)通过远程使用本地依赖关系的原因