如何解决有没有一种方法可以从另一个目录运行Go模块
在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
中的所有子包。
- VSCode现在丢失了,由于某些原因(主要是因为未找到所有子包),无法执行测试。
解决方法
重要的是,我的源代码应保留在此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 路径。在简单的情况下,可以从文件系统推断导入路径。 - 已编译的可执行文件具有“项目目录”,“源”,“类路径”或其他内容的 no 概念,它是独立的 >可执行文件可在任何地方运行,并且与源代码完全脱离。
- 将所有文件系统查找路径设为配置选项(cmdline标志或环境变量);提供实际的默认值(例如
./
);在运行可执行文件时使用它来宣布在哪里可以找到静态内容,例如.env文件,模板,图标,css文件等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。