【问题标题】:How to use replace directive with env var or relative path如何使用带有环境变量或相对路径的替换指令
【发布时间】:2020-05-15 10:33:37
【问题描述】:

我正在查看 go.mod 的替换指令:

https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/

module github.com/pselle/foo

replace github.com/pselle/bar => /Users/pselle/Projects/bar

require (
    github.com/pselle/bar v1.0.0
)

在团队中工作时,这非常愚蠢,因为 url 是绝对的,并且会在除您自己的机器之外的任何机器上中断。

有没有办法使用环境变量或相对路径来指定替换指令?像这样的:

replace github.com/pselle/bar => $GOPATH/src/github.com/pselle/bar

replace github.com/pselle/bar => ./github.com/pselle/bar

当 PWD 发生变化时使用相对路径非常糟糕,带有 env var 的绝对路径会好得多。

【问题讨论】:

  • 你绝对需要提交 go.mod 包括本地路径 replace 指令吗?通常这仅用于本地测试并且在提交文件时不包括在内,因此其他开发人员不必担心您如何在您的机器上设置它。
  • 嗯,你的意思是我会把 go.mod 放在 gitignore 中?如果它在版本控制中,那么一遍又一遍地在文件中添加/删除同一行并不是很有趣。 NPM 通过使用符号链接可以更好地做到这一点。
  • @Alex 我不认为@Adrian 是在暗示这一点。 go.modreplace 通常用于本地开发/测试(因为真正的 repo 不存在或有新的方法/类型)。是的 go.mod 应该检查到 git 中。但是,对于本地路径的 replace 指令可能不应该被排除在 git 之外。

标签: go go-modules


【解决方案1】:

这应该回答你的问题:

https://stackoverflow.com/a/55534126/12834955

Env 变量不起作用,但您可以使用相对于固定位置(模块根目录)的相对路径。从答案中可以看出:

您为替换指令指定的路径必须是 绝对路径或相对路径,相对于模块的根目录。

【讨论】:

    【解决方案2】:

    目前不可能。 There was a proposalusing 指令引入go.mod 文件,这将允许重用环境变量进行替换。但该提议被拒绝了。据我所知,目前没有针对该问题引入简单解决方案的计划。

    【讨论】:

    • 太糟糕了,因为环境变量可能会增加价值
    【解决方案3】:

    如果您与团队合作,您如何在许多开发人员机器上协调这些新代码?

    为什么不直接将这个新代码签入 git。生产版本仍将通过 go.mod 和您的 semver 标签进行版本控制。您可以标记此开发推送。或者您可以随时拉@master 以获取最新信息。所有开发人员都可以在不中断生产的情况下处理此通用代码。当准备好发布时,标记下一个工作提交并更新 go.mod 的 semver 标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多