main.go当在之外使用Go模块(go版本> = 1.11)时,找不到在本地包中分解出某些代码的方法$GOPATH。
我没有导入任何需要包含的外部依赖项go.mod,我只是想在本地组织此Go模块的源代码。
文件main.go:
package main
// this import does not work
import "./stuff"
func main() {
stuff.PrintBaz()
}
Run Code Online (Sandbox Code Playgroud)
该文件./stuff/bar.go(假装为本地软件包):
package stuff
import "log"
type Bar struct {
Baz int
}
func PrintBaz() {
baz := Bar{42}
log.Printf("Bar struct: %v", baz)
}
Run Code Online (Sandbox Code Playgroud)
文件go.mod(命令go mod init foo):
module foo
go 1.12
Run Code Online (Sandbox Code Playgroud)
执行时go run main.go:
import "./stuff",那么我明白了build command-line-arguments: cannot find module for path …我只想使用 go 模块使用本地包。
我在文件夹 goweb 中有这些文件:
和 go.mod
模块goweb
go 1.12
require mypack v0.0.0
replace mypack => ./src/mypack
Run Code Online (Sandbox Code Playgroud)
但go.mod抱怨:
replacement module without version must be directory path (rooted or starting with .
Run Code Online (Sandbox Code Playgroud)
去获取 -u ./...
go: parsing src/mypack/go.mod: open <local path>/goweb/src/mypack/go.mod: no such file or directory
go: error loading module requirements
Run Code Online (Sandbox Code Playgroud)
所以我在这里缺少一些路径结构
我有一个名为 的 Go 模块mymodule,我想将其重命名为github.com/hylowaker/awesome-module
使用命令go mod edit -module github.com/hylowaker/awesome-module仅更改go.mod文件中的模块名称,而 go 源保持不变。我在 GoLand IDE 中尝试了重构功能,但 GoLand 不允许使用斜杠 ( /) 字符重命名。
所以我必须找到一位替代import "mymodule/..."到import "github.com/hylowaker/awesome-module/...从我的源文件。
有没有更好的方法来重构它们?
有没有办法在模块中使用较短的名称表示/映射?
我有一个项目,其 url 命名为:
module github.com/<org>/<project>
go 1.14
Run Code Online (Sandbox Code Playgroud)
如果能够做到这一点就太好了:
import "<short_name>/<project>/package_folder"
Run Code Online (Sandbox Code Playgroud)
来自 a go.mod,类似:
module github.com/<org>/<project> => short_name
go 1.14
Run Code Online (Sandbox Code Playgroud) 假设我有一个 monorepo 并且有几个单独的 golang 服务:
\nroot \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 services\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 svc1\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 svc2\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\nRun Code Online (Sandbox Code Playgroud)\n而 svc2 将来将依赖于 svc1。另外,要求svc1和svc2可以单独释放。
\n有没有办法可以单独发布模块?go mod 文档仅假设只有 repo,因此它不提供这样的灵活性。
\n我正在尝试加快Go应用程序的Docker构建速度。现在,仅花费60年代就建立了依赖关系(这是一个k8s控制器,所以有很多)。
一个非常重要的约束:我的项目依赖于私有GitHub存储库。我在go mod vendor外面做docker build,在那里我有建立回购协议的资格。
我现在的Dockerfile大致是:
FROM golang:1.12
WORKDIR /src
COPY . .
RUN go build -mod=vendor
...
Run Code Online (Sandbox Code Playgroud)
即使无需下载dep,该构建也要花费一些时间,因为它每次都会重新构建数百个软件包docker build。
我想做的是这样的:
FROM golang:1.12
WORKDIR /src
# these shouldn't change very often
COPY go.mod go.sum vendor ./
RUN go build -mod=vendor <all dependency packages>
COPY . .
RUN go build -mod=vendor
...
Run Code Online (Sandbox Code Playgroud)
我尝试解析go.mod,但是当然列出了模块,而不是包。我曾尝试过,go list但从未设法获得成功。
我们正在使用 Go 模块。我想在 CLI 中获取模块的特定版本。是否可以?
如果你好奇,原因是我想添加以下generate命令:
//go:generate go run github.com/golang/mock/mockgen -source="$GOPATH/pkg/mod/mymodules.com/mymodule@${VERSION}/module.go" -destination=module_mock.go
Run Code Online (Sandbox Code Playgroud)
所以我需要以某种方式获得版本
为什么个别模块版本有时需要 2 行go.sum?
v0.1.1在下面的示例中)/go.mod到版本上(v0.1.1/go/mod在下面的示例中)。例如:
github.com/foo/bar v0.1.1 h1:kDgnGXZpvZUi7ym6Rm23yVn3gRqBag+vU6M/wytZR9c=
github.com/foo/bar v0.1.1/go.mod h1:MZcarCLffCxoj/EF1yhRb4HvOSmCkm5Z8FPmzWrMG+g=
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为有时当我go get打包时,仅使用上面示例中的第二行就会生成间接依赖项,然后该 package@version 的go.sum构建将失败。410 gone但是,如果我手动go get间接依赖,构建将不再失败并显示410 gone.
我相信这只发生在私有存储库中,所以我知道它不能与 sum.golang.org 很好地配合。然而,我想弄清楚是否可以首先避免获得 410,特别是在自动模块更新等方面。
目前我正在开发一个使用 Serverless Framework 和 Go 的 API。
我正在使用 Serverless-offline 插件进行本地测试。
该 API 依赖于其他一些存储库(我也维护这些存储库),我使用该go.mod文件导入这些存储库。
然而,我很难完善我的开发人员工作流程。
目前,如果我想对此 API 所依赖的存储库进行更改,我必须更改项目go.mod以包含替换指令以进行测试,但随后我必须手动将其更改回以部署到生产环境。
基本上我正在寻找一种包含替换指令的方法,该指令仅在本地开发期间应用。其他人都是如何处理这个问题的?
额外问题:有什么方法可以在 docker 中离线运行 Serverless 吗?我发现在裸机上运行的无服务器离线会导致不同开发人员环境之间的不一致。
这是回应
not found: github.com/me/private-repo@v0.0.0-20220413034319-81fe8421f99f: invalid version: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/ea2baff0eaed39430ee011ad9a011101f13b668d5fcbd9dffdfa1e0a45422b40: exit status 128:
fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
Run Code Online (Sandbox Code Playgroud)
我尝试~/.netrc使用新创建的 GitHub 个人访问令牌的密码添加记录并添加配置~/.gitconfig
[url "ssh://git@github.com/"]
insteadOf = https://github.com/
Run Code Online (Sandbox Code Playgroud)
所有这些都不起作用。
如果我禁用总和检查,那么GOSUMDB=off go mod tidy它会起作用,但我认为这对我来说不正确。
go ×10
go-modules ×10
docker ×1
dockerfile ×1
git ×1
go-packages ×1
gomock ×1
local ×1
refactoring ×1
serverless ×1