問題發現
當我們執行我們專案的時候,我們通過go build 把我們的專案編譯成了一個二進位制的可執行檔案,在當前目錄下執行這個可執行檔案是沒有問題的
但是如果我們切去其他的目錄的話,通過路徑去執行這個可執行檔案,就會報錯!因為我們啟動專案要讀取一個關於專案環境的配置檔案,在[/Users/codehope/setup]
這裡找不到這個配置檔案,因為他編譯後,在程式找配置檔案,是相對於當前執行目錄去尋找的配置檔案,而不是基於專案目錄結構(可能此時不存在什麼目錄結構了)
如何解決-通過命令列引數注入
方式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
發現這種就可以成功的跑起來啦!
方法2 標準庫flag
//flag.Type(flag名, 預設值, 幫助資訊)*Type (定義某種資料型別返回對應指標型別)
configPath := flag.String("config", "", "專案配置檔案")
定義了flag可以通過執行專案 -h
來檢視幫助資訊
configPath := flag.String("config", "", "專案配置檔案")
flag.Parse()
fmt.Println(*configPath)
執行:可以通過這種方式注入配置
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 協議》,轉載必須註明作者和本文連結