非專案目錄下命令列執行go程式遇到的問題

村望老弟 發表於 2021-11-25
Go

問題發現

當我們執行我們專案的時候,我們通過go build 把我們的專案編譯成了一個二進位制的可執行檔案,在當前目錄下執行這個可執行檔案是沒有問題的

image-20211125113705890

image-20211125144754234

但是如果我們切去其他的目錄的話,通過路徑去執行這個可執行檔案,就會報錯!因為我們啟動專案要讀取一個關於專案環境的配置檔案,在[/Users/codehope/setup]這裡找不到這個配置檔案,因為他編譯後,在程式找配置檔案,是相對於當前執行目錄去尋找的配置檔案,而不是基於專案目錄結構(可能此時不存在什麼目錄結構了)

image-20211125144949774

如何解決-通過命令列引數注入

方式1 利用os.Args

前情提要,我們的配置檔案是通過viper讀取的,所以通過命令列的方式去注入配置檔案的路徑,這樣就不是基於專案去尋找了

首先我們先在viper初始化的時候列印一下os.Args

/*
    InitAppConfig 初始化vipper的配置檔案
*/
func InitAppConfig() (error error) {
    fmt.Println(os.Args)
....

build程式碼後

~/remote-es-server-code/go-cli-v1/go-cli-v1

切去非當前專案目錄下去執行(依然是報錯的,但是可以看到os.Args的列印結果=>[/Users/codehope/remote-es-server-code/go-cli-v1/go-cli-v1])

那麼我們就可以通過傳入第二個引數去注入配置檔案的路徑了

~/remote-es-server-code/go-cli-v1/go-cli-v1 ~/remote-es-server-code/go-cli-v1/config

image-20211125145450595

發現這種就可以成功的跑起來啦!

方法2 標準庫flag

標準庫flag文件

//flag.Type(flag名, 預設值, 幫助資訊)*Type  (定義某種資料型別返回對應指標型別)
configPath := flag.String("config", "", "專案配置檔案") 

定義了flag可以通過執行專案 -h來檢視幫助資訊

image-20211125150647640

configPath := flag.String("config", "", "專案配置檔案")
flag.Parse()
fmt.Println(*configPath)

執行:可以通過這種方式注入配置

image-20211125150829257

viper.AddConfigPath(*configPath) //設定配置檔案path

完整版

$~/remote-es-server-code/go-cli-v1/go-cli-v1 -config /Users/codehope/remote-es-server-code/go-cli-v1/config          
  /Users/codehope/remote-es-server-code/go-cli-v1/config
  [/Users/codehope/remote-es-server-code/go-cli-v1/go-cli-v1 -config /Users/codehope/remote-es-server-code/go-cli-v1/config]
  資料庫初始化成功!
  redis初始化成功!
  [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
   - using env:   export GIN_MODE=release
   - using code:  gin.SetMode(gin.ReleaseMode)

  [GIN-debug] POST   /public/api/v1/user/register --> go-cli-v1/controller.(*UserController).RegisterNewUser-fm (4 handlers)
  [GIN-debug] POST   /public/api/v1/user/login --> go-cli-v1/controller.(*UserController).UserLogin-fm (4 handlers)
  [GIN-debug] GET    /private/api/v1/user/profile --> go-cli-v1/controller.(*UserController).GetUserProfile-fm (5 handlers)
  [GIN-debug] POST   /private/api/v1/category  --> go-cli-v1/controller.(*CategoryController).UserCreateNewCategory-fm (5 handlers)
  [GIN-debug] GET    /private/api/v1/category  --> go-cli-v1/controller.(*CategoryController).UserQueryAllCategoryList-fm (5 handlers)
  [GIN-debug] GET    /public/api/v1/category/:category_id --> go-cli-v1/controller.(*CategoryController).QueryCategoryDetailByCategoryId-fm (4 handlers)
  [GIN-debug] POST   /private/api/v1/post      --> go-cli-v1/controller.(*PostController).UserCreateNewPost-fm (5 handlers)
  [GIN-debug] PUT    /private/api/v1/post      --> go-cli-v1/controller.(*PostController).UserUpDatePost-fm (5 handlers)
  [GIN-debug] DELETE /private/api/v1/post      --> go-cli-v1/controller.(*PostController).UserDeletePost-fm (5 handlers)
  [GIN-debug] GET    /public/api/v1/post/:post_id --> go-cli-v1/controller.(*PostController).PostDetail-fm (4 handlers)
  [GIN-debug] GET    /private/api/v1/post      --> go-cli-v1/controller.(*PostController).UserPostList-fm (5 handlers)
  [GIN-debug] GET    /public/api/v1/post       --> go-cli-v1/controller.(*PostController).PublicPostList-fm (4 handlers)
  [GIN-debug] POST   /private/api/v1/comments  --> go-cli-v1/controller.(*CommentsController).CreateComments-fm (5 handlers)
  [GIN-debug] GET    /public/api/v1/comments/:post_id --> go-cli-v1/controller.(*CommentsController).QueryPostComment-fm (4 handlers)
  [GIN-debug] GET    /public/api/v1/comments2comments/:comment_id --> go-cli-v1/controller.(*CommentsController).QueryComments2Comment-fm (4 handlers)
  [GIN-debug] GET    /transitionTest           --> go-cli-v1/routes.Init.func1 (4 handlers)
  [GO ! GO ! GO ! ]  Server run at http://localhost:8080

成功解決問題!

本作品採用《CC 協議》,轉載必須註明作者和本文連結