我正在尝试Go的新模块系统,并且无法访问本地软件包.以下项目位于我的gopath外部桌面上的文件夹中.
我的项目结构如下:
/
- /platform
- platform.go
- main.go
- go.mod
Run Code Online (Sandbox Code Playgroud)
// platform.go
package platform
import "fmt"
func Print() {
fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)
// main.go
package main
import "platform"
func main() {
platform.Print()
}
Run Code Online (Sandbox Code Playgroud)
go build main.go
告诉我
cannot find module for path platform
Run Code Online (Sandbox Code Playgroud) 我已经使用 go modules 安装了一个包(go get in Go 1.13),现在我想删除它。在文档中没有任何关于此的内容,并且在go get docu 中也没有。
手动从 go.mod 中删除包并不能解决问题,因此它保留在 go.sum 中。
我应该如何以干净的方式移除包裹?
当我启用gomodules并构建我的go程序时,将下载所需的包.
但我可以在$ GOPATH/src /或$ GOPATH/src/mod中找到它们.
它们存放在哪里?
export GO111MODULE=on
go mod init
go build main.go
go: finding github.com/sirupsen/logrus v1.0.6
go: downloading github.com/sirupsen/logrus v1.0.6
...
Run Code Online (Sandbox Code Playgroud) 我正在使用vgo和一个Dockerfile开展一个go项目,我希望docker能够缓存项目的依赖项,这样它就有两个属性:
go.mod
文件更改,将重新下载依赖项go.mod
,则不会重新下载依赖项.现在,我这样做:
...
RUN go get -u golang.org/x/vgo
COPY . /go/src/whatever
RUN vgo install
...
Run Code Online (Sandbox Code Playgroud)
但是,如果您更改了go文件,则必须从该COPY
层重建dockerfile .
简而言之,我想做的是:
...
RUN go get -u golang.org/x/vgo
COPY go.mod /go/src/whatever
RUN vgo install_dependencies
COPY . /go/src/whatever
RUN vgo install
...
Run Code Online (Sandbox Code Playgroud)
这样,如果我更改go.mod
,将下载并重建所有依赖项,但除此之外,我们可以继续构建二进制文件.
我可以看到几种方法来获得这样的行为,但所有这些方法都有缺点:
$GOPATH/src/mod
到docker容器中,但是这将有很多我不需要的文件vgo mod -vendor
在构建docker容器之前复制供应商目录,但这依赖于开发人员记住vgo mod -vendor
每次go.mod
更改时都要运行,否则应用程序将无法构建,他们必须vgo mod -vendor
在重试docker构建之前运行.你能想到一种方式让我获得像我想象中的行为vgo install_dependencies
吗?我错过了一个vgo技巧吗?
我正在将Go 1.10应用程序迁移到Go 1.11.这还包括从迁移dep
到mod
管理依赖项.
由于应用程序依赖于数据库,我使用a docker-compose
来设置本地开发环境.使用Go 1.10,我只需将本地存储库(包括vendor
文件夹)安装到容器中的正确位置GOPATH
:
web:
image: golang:1.10
working_dir: /go/src/github.com/me/my-project
volumes:
- .:/go/src/github.com/me/my-project
environment:
- GOPATH=/go
- PORT=9999
command: go run cmd/my-project/main.go
Run Code Online (Sandbox Code Playgroud)
由于Go 1.11沟渠GOPATH
(当使用模块时),我想我可以做以下事情:
web:
image: golang:1.11rc2
working_dir: /app
volumes:
- .:/app
environment:
- PORT=9999
command: go run cmd/my-project/main.go
Run Code Online (Sandbox Code Playgroud)
这是有效的,但每次我docker-compose up
(或任何其他命令调用Go工具)它将从头开始解析并重新下载依赖关系树.当我在容器外部运行命令时(即在我的本地操作系统上),这不会发生(而只是一次).
如何改进设置,以便Docker容器持久保存go
工具下载的模块?
在我的Go项目中,我想将一些通用功能分解为Go模块,与主项目分开.我在GOPATH之外这样做是为了与go的未来保持一致.我不想在GitHub或其他任何地方发布模块.
我将此模块导入主项目的所有尝试都会导致:
cannot find module for path X
Run Code Online (Sandbox Code Playgroud)
我已经go mod init X
在模块的文件夹中运行了.其go.mod
文件的内容是:
module X
Run Code Online (Sandbox Code Playgroud)
构建或安装此模块似乎什么都不做.我没有发现它的迹象$GOPATH/pgk/mod
.
我尝试了各种import语句:
import "X"
import "../x"
(模块目录的相对路径)import "../x/X"
(目录+模块名称的路径)救命!
所以我有一个我的 main.go 导入的私人仓库。执行 go build 时出现此错误:
找不到路径的模块
我需要为私人回购做任何特别的事情吗?我一直在谷歌搜索,找不到任何好的信息。它与 dep 一起工作得很好。
在内部导入(使用)go 模块的正确方法是什么?
例如:
通过以下方式创建新模块:go mod init example.com/my-project
(example.com 或其他不存在的域)
并在同一个项目中使用它:
import (
"example.com/my-project/package"
)
Run Code Online (Sandbox Code Playgroud)
此示例取自Let's Go书(但极其简化)
问题:
我正在使用 Goland,它无法识别此本地模块。Goland 建议我使用go get -t example.com/my-project/package
命令。但example.com/...
只是一个模块的名称