在GOPATH
之外,我具有以下项目结构。
. // Project root
├── Dockerfile
├── .env
├── README.md
└── src
├── main.go
├── go.mod
├── go.sum
├── internal
│ ├── somepackage
│ │ ├── main.go
│ │ └── types.go
│ ├── someother
│ │ ├── main.go
│ │ ├── oauth.go
│ │ └── types.go
│ └── models
│ └── main.go
└── pkg
├── somepackage
│ └── main.go
└── anotherpackage
└── main.go
我想运行src
目录中的Go模块代码。
当我cd
进入src
目录并使用go run .
或go build .
我的代码时,它可以正常工作。
当我站在项目的根目录时,我无法运行go run ./src
或go build ./src
。我收到以下错误。
src/service.go:8:2: cannot find package "web-service/internal/auth" in any of:
/usr/lib/go/src/web-service/internal/auth (from $GOROOT)
/home/miloertas/Packages/go/src/web-service/internal/auth (from $GOPATH)
src/endpoints.go:3:8: cannot find package "web-service/internal/handlers" in any of:
/usr/lib/go/src/web-service/internal/handlers (from $GOROOT)
/home/miloertas/Packages/go/src/web-service/internal/handlers (from $GOPATH)
将我的源代码保留在此src
目录中非常重要。
同样重要的是,我能够从项目的根目录开始run
和build
(例如,.env
文件位于存储库的根目录)。>
因此,我正在寻找一种从项目根目录在run
目录中build
或src
我的代码的方法。
我尝试将go.mod
移到项目的根目录并运行并运行go run ./src
,但这会导致其自身的问题:
go
命令现在无法找到internal
和pkg
答案 0 :(得分:3)
重要的是,我的源代码应保留在此src目录中。同样重要的是,我能够从项目的根目录运行和构建代码(例如.env文件位于存储库的根目录)。
这两个要求是矛盾的。你必须放手一个。
尤其是第二个是没有根据的:不要使用go run,请使用go build。将用于查找.env文件的路径作为程序的命令行选项(Go不是PHP或JavaScript,仅是没有正在执行的二进制文件的项目或源根)。或在某处构建可执行文件,但在项目根目录中执行它。
请注意,拥有一个src
文件夹是-不常见。
我尝试将go.mod移至项目的根目录,然后运行并运行./src,但这会导致以下问题:
好吧,从根本不使用go run
开始,使用go build
。然后尝试构建实际的主程序包。所有go工具在包上效果最佳,而不是在文件系统文件夹上。如果您的模块名为playing.hardball/for-unspecific-reasons
,而包main在src
中,请尝试go build playing.hardball/for-unspecific-reasons/src
。
即使无法按照您想要的方式进行外卖:
go run
。原因有很多,对于每个其他用例,运行单个文件脚本和已加载的步枪非常有用。go
工具适用于 import 路径。在简单的情况下,可以从文件系统推断导入路径。./
);在运行可执行文件时使用它来宣布在哪里可以找到静态内容,例如.env文件,模板,图标,css文件等。