亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法從另一個目錄運行 Go 模塊

有沒有辦法從另一個目錄運行 Go 模塊

Go
心有法竹 2022-07-11 16:52:18
我有以下項目結構,在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和pkgVSCode 現在丟失并且由于某些原因無法執行測試(主要是因為沒有找到所有子包)。
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

重要的是我的源代碼保留在這個 src 目錄中。同樣重要的是,我能夠從項目的根目錄運行和構建我的代碼(例如,.env 文件位于存儲庫的根目錄)。

這兩個要求是矛盾的。你必須放手一個。

尤其是第二個是沒有根據的:不要使用 go run,使用 go build。將查找 .env 文件的路徑作為程序的命令行選項(Go 不是 PHP 或 JavaScript,根本沒有用于執行二進制文件的項目或源根目錄)。或者在某處構建可執行文件,但在項目根目錄中執行它。

請注意,有一個src文件夾——說得委婉一點——并不常見

我嘗試將 go.mod 移動到項目的根目錄并運行并運行 go run ./src 但這會導致其自身的問題:

好吧,從根本不使用開始go run,使用go build. 然后嘗試構建實際的主包。所有的 go 工具在上效果最好,而不是在文件系統文件夾上。如果您的模塊已命名playing.hardball/for-unspecific-reasons并且包 main 在srctry中go build playing.hardball/for-unspecific-reasons/src

即使這不能達到您想要的方式,也可以得到外賣:

  • 不要使用go run. 原因是多方面的,對于基本上所有其他用例,運行單個文件腳本和加載的 footgun 很有用。

  • go工具適用于導入 路徑。在簡單的情況下,可以從文件系統中推斷出導入路徑。

  • 編譯后的可執行文件沒有“項目目錄”、“源代碼”、“類路徑”或其他任何 概念,它是一個獨立的可執行文件,可在任何地方運行,并且完全與源代碼分離。

  • 使所有文件系統查找路徑成為配置選項(命令行標志或環境變量);提供實用的默認值(例如./);在運行可執行文件時使用它來宣布在哪里可以找到靜態文件,如 .env 文件、模板、圖標、css 文件等。


查看完整回答
反對 回復 2022-07-11
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

從Go 1.18開始,現在可以使用Go 工作區來實現這一點。


使用以下目錄結構


parent-dir/

└─ go.work

   hello-world/

   ├─ go.mod

   └─ main.go

您可以從using運行hello-world模塊。parent-dirgo run hello-world


go.work


go 1.18


use ./hello-world

去.mod


module hello-world


go 1.18

注意:這是可能的,不推薦@Volker指出


查看完整回答
反對 回復 2022-07-11
  • 2 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號