微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种方法可以从另一个目录运行Go模块

如何解决有没有一种方法可以从另一个目录运行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 ./srcgo 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目录中非常重要。 同样重要的是,我能够从项目的根目录开始runbuild(例如,.env文件位于存储库的根目录)。>

因此,我正在寻找一种从项目根目录在run目录中buildsrc我的代码方法

我尝试将go.mod移到项目的根目录并运行并运行go run ./src,但这会导致其自身的问题:

  • go命令现在无法找到internalpkg
  • 中的所有子包。
  • 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 举报,一经查实,本站将立刻删除。