在使用golang的go.mod时,正确使用递归替换是一个重要的问题。php小编鱼仔为您提供了一些解决方案。递归替换是指在go.mod文件中将某个模块替换为本地目录的方式,以便在开发过程中进行调试和修改。但是,如果替换的模块依赖其他模块,可能会导致一些问题。通过正确使用递归替换,您可以避免这些问题,保证项目的依赖关系正常运行。在本文中,我们将讨论如何在go.mod中正确使用递归替换,并提供一些实用的技巧和注意事项。
问题内容
我想要一个项目结构,如下所示:
src/github.com/myname/myproject/
- tl:
- constructor
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/constructor
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
require github.com/myname/myproject/tl/types/account v0.0.0
require github.com/myname/myproject/tl/types/auth v0.0.0
require github.com/myname/myproject/tl/types/bots v0.0.0
replace github.com/myname/myproject v0.0.0 => ./../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./../types
replace github.com/myname/myproject/tl/types/account v0.0.0 => ./../types/account
replace github.com/myname/myproject/tl/types/auth v0.0.0 => ./../types/auth
replace github.com/myname/myproject/tl/types/channels v0.0.0 => ./../types/channels
- crcs
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/crcs
- functions
- account
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/functions/account
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./../../types
- auth
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/functions/auth
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./../../types
- bots
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/functions/bots
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./../../types
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/functions
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../crcs
replace github.com/myname/myproject v0.0.0 => ./../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./../types
- types
- account
- something.go
- go.mod:
module github.com/myname/myproject/tl/types/account
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./..
- auth
- something.go
- go.mod:
module github.com/myname/myproject/tl/types/auth
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./..
- channels
- something.go
- go.mod:
module github.com/myname/myproject/tl/types/channels
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../../crcs
replace github.com/myname/myproject v0.0.0 => ./../../..
replace github.com/myname/myproject/tl/types v0.0.0 => ./..
- someghing.go
- go.mod:
module github.com/myname/myproject/tl/types
require github.com/myname/myproject/tl/crcs v0.0.0
require github.com/myname/myproject v0.0.0
replace github.com/myname/myproject/tl/crcs v0.0.0 => ./../crcs
replace github.com/myname/myproject v0.0.0 => ./../..
- something.go
- go.mod:
module github.com/myname/myproject
[some external dependencies]
require github.com/myname/myproject/tl/types v0.0.0
replace github.com/myname/myproject/l/types v0.0.0 => ./tl/types
登录后复制
这不起作用。我使用 jetbrains 的 ide,它在所有(子)模块上执行 go list,并告诉我以下错误:
go: github.com/myname/myproject/tl/[email protected] requires
github.com/myname/myproject/tl/[email protected]: reading github.com/myname/myproject/tl/crcs/go.mod at revision tl/crcs/v0.0.0: unknown revision tl/crcs/v0.0.0
登录后复制
我不明白为什么会发生这种情况,看起来它尝试从存储库中获取模块,即使所有内容都在本地替换。
除了改变项目结构之外,我愿意接受建议。我将来需要能够使用 account.sometype
之类的东西,因此将所有内容都放在一个文件中会很痛苦。
上下文:我正在为电报构建 mtproto 库,它具有 tl 模式,其中每个“请求”/“类”都在自己的命名空间中(例如“帐户”、“通道”)(或在全局命名空间中,例如我是 functions
和 types
相应)(因为这些函数/类有超过 1900 个,每个函数/类都有自己的构造函数和参数,因此将所有内容都放在一个模块中将很难使用)
tl文件夹中的文件是从tl模式自动生成的go代码。
解决方法
感谢Dean指出您可以在一个模块中包含多个包(如何?)。它解决了我的问题,同时仍然保持相同的结构。
以上就是如何在 golang 的 go.mod 中正确使用递归替换?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!