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

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

如何訪問通過 Bazel go_binary 運行的 Go 應用程序內部的數據文件

如何訪問通過 Bazel go_binary 運行的 Go 應用程序內部的數據文件

Go
慕神8447489 2022-10-24 09:22:09
我有一個包含 go_binary 目標的 BUILD.bazel 文件。在此應用程序中,我需要訪問位于同一目錄中的 YAML 文件(例如 config.yml)。go_binary 看起來像這樣:go_binary(    name = "app1",    data = ["config.yml"],    embed = [":app1_lib"],    visibility = ["//visibility:public"],)我可以看到文件已添加到/private/var/tmp/_bazel/52b44015c7f2ec78df04b9a822df93c1/execroot/__main__/bazel-out/darwin-fastbuild/bin/services/app1/app1_/app1.runfiles/__main__/services/app1文件夾中。在我的 Go 應用程序中訪問此文件的最佳方式是什么?到目前為止,我發現我可以做到url := fmt.Sprintf("%s/services/app1/config.yml", os.Getenv("PWD"))...但我想避免必須明確指定文件夾結構。
查看完整描述

1 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

這就是您在 Bazel 中訪問數據文件的簡單方式……您從 WORKSPACE 根目錄指定文件的完整路徑。如果您的文件有目標//services/app1:config.yml,那么路徑就是serivces/app1/config.yml.


$PWD除非出于某種原因需要絕對路徑,否則無需添加前綴。這樣做的首選方法是:


const config = "services/app1/config.yml"

abs, err := filepath.Abs(config)

if err != nil {

    return err

}

這假設您沒有調用 chdir... 我避免在我的程序中調用 chdir,主要是因為這個原因。


請注意,它不是 URL,如果您需要 URL,您可以:


u := url.URL{Scheme: "file", Path: filepath.ToSlash(abs)}

另請注意,如果您正在處理多個存儲庫中的文件,則必須包含存儲庫,前綴為"external". 例如,@some-repo//dir/pkg:targetis external/some-repo-dir/pkg/target... 即使它只是":target"在您的 BUILD 文件中。呃,對吧?


為什么巴澤爾會這樣做?

您的代碼可能會將來自您工作區的所有包鏈接在一起。看起來很明顯,在您的情況下,您只是希望能夠config.yml從與包相同的目錄中讀取,但您同樣可以傳遞data = ["config.yml"]給.go_library()deps


為了讓它在任何地方都能正常工作,每個人都需要使用數據文件的完整路徑。這有點冗長,但是哦。


如果您僅調用go_binaryfrom agenrule或 build 規則而不是bazel run,則可以根據需要將配置文件的路徑作為命令行參數傳遞。這將允許您在沒有完整路徑的情況下指定它。


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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