go embed失效不生效的問題(embed使用注意事項)

embed是go1.16引入的庫,允許我們編譯的時候內(nèi)嵌文件到go的二進(jìn)制文件类少,

最典型的應(yīng)用,就是web服務(wù)器把前端build的二進(jìn)制文件打包到一個二進(jìn)制文件。這樣用起來就很方便图毕。

還有就是把配置文件打包到二進(jìn)制文件之類的。

golang很多官方推出的庫眷唉,未必好用予颤,功能也不是最全的。

比如zip壓縮就不是很好用冬阳,還有就是文件匹配的glob蛤虐,它不支持**語法

這個embed就有一些問題

這次我碰到了embed失效的問題。

go這類注釋來表示的指令我之前其實沒用過肝陪,雖然知道go generate這個指令但是并沒有用過驳庭。

embed之前我在內(nèi)嵌html文件的時候用過,那時候發(fā)現(xiàn)的問題是氯窍,好像只能在根路徑使用(因為我的web的目錄在根路徑)饲常,因為好像不支持父級的相對路徑捏检,這個就導(dǎo)致難用,因為我本來想把這個內(nèi)嵌寫在router包里面的不皆。

但是現(xiàn)在發(fā)現(xiàn)embed似乎是支持父級相對路徑的

只是下面的不會生效贯城,會報錯

//go:embed ../test.txt

但是路徑分隔符用反斜杠就沒問題了。

//go:embed ..\test.txt

還有這次我碰到的指令不生效的問題

是因為指令和注釋最大的區(qū)別是霹娄, 指令是//go:,也就是說不能有空格能犯,有空格的會被當(dāng)做注釋處理。

也就是官方只是匹配//go:指令 這樣的前綴來解析指令犬耻。

// go:embed ..\test.txt

還有一個注意點是

embed只在package級別生效踩晶,也就是說在函數(shù)內(nèi)的注釋是不管的。

其他解決方案

最近給項目寫了github action枕磁,用于提交新版本tag的時候渡蜻,自動發(fā)布新版本。
然后發(fā)現(xiàn)我的項目在linux下編譯報錯了计济。
雖然我在windows本地的時候編譯沒有問題茸苇,
這時我發(fā)現(xiàn)那個父級目錄的用法,應(yīng)該是有問題的沦寂,至少在linux下編譯會失敗学密。。传藏。

然后我就翻了github的issue腻暮,沒有找到很好的解決方案。
因為我把配置文件放在根目錄毯侦,也就是和main文件在同一個目錄哭靖。所以沒有什么好的方法。
也不能從main中導(dǎo)入侈离,那樣會有循環(huán)依賴的問題试幽。。霍狰。

最后我從go github issue中找到兩種方法

go generate

這個方法給人感覺就比較蠢抡草,總之就是把文件拷貝到同級目錄就沒事了。

簡單粗暴的方法

//go:generate cp -r ../../assets ./local-asset-dir
//go:embed local-asset-dir
var assetFs embed.FS

創(chuàng)建一個package蔗坯,把文件放到這個package目錄中

其實和上面的方法是一樣的康震,甚至某種程度上還不如。

上面的方法宾濒,至少還能自由選擇文件的位置腿短。

最后我選擇這種方法,創(chuàng)建一個package,在其他包引入橘忱。這似乎就是官方推薦的方式了赴魁。

package conf

import (
    _ "embed"
)

//go:embed  rabc_modal.conf
var CasbinModalStr string

//go:embed policy.csv
var PolicyCSV string

//go:embed config.yaml
var DefaultConfig string

另外我還在issue里看到,希望把/作為模塊根目錄钝诚,這樣確實能解決這個問題颖御,但是這個被官方拒絕了。 https://github.com/golang/go/issues/58525

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凝颇,一起剝皮案震驚了整個濱河市潘拱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拧略,老刑警劉巖芦岂,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垫蛆,居然都是意外死亡禽最,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門袱饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川无,“玉大人,你說我怎么就攤上這事宁赤∫ㄍ福” “怎么了栓票?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵决左,是天一觀的道長。 經(jīng)常有香客問我走贪,道長佛猛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任坠狡,我火速辦了婚禮继找,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逃沿。我一直安慰自己婴渡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布凯亮。 她就那樣靜靜地躺著边臼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪假消。 梳的紋絲不亂的頭發(fā)上柠并,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼臼予。 笑死鸣戴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粘拾。 我是一名探鬼主播窄锅,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缰雇!你這毒婦竟也來了酬滤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤寓涨,失蹤者是張志新(化名)和其女友劉穎盯串,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戒良,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡体捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了糯崎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几缭。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沃呢,靈堂內(nèi)的尸體忽然破棺而出年栓,到底是詐尸還是另有隱情,我是刑警寧澤薄霜,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布某抓,位于F島的核電站,受9級特大地震影響惰瓜,放射性物質(zhì)發(fā)生泄漏否副。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一崎坊、第九天 我趴在偏房一處隱蔽的房頂上張望备禀。 院中可真熱鬧,春花似錦奈揍、人聲如沸曲尸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽另患。三九已至,卻和暖如春奏篙,著一層夾襖步出監(jiān)牢的瞬間柴淘,已是汗流浹背迫淹。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留为严,地道東北人敛熬。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像第股,于是被迫代替她去往敵國和親应民。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容