Go 語言打包靜態文件


對於 Go 語言開發者來說,在享受語言便利性的同時,最終編譯的單一可執行文件也是我們所熱衷的。但是,一旦遇到我們需要分發的東西不只有可執行文件的時候,事情就變得稍微有點復雜了,例如,需要分發個默認的配置文件;或者說是一個 Web 服務需要附帶一些簡單的 js/css 文件之類的。

當然,對於經驗豐富的老司機們來說這都不是問題,例如 RH 系列的 RPM 是很多老司機們的選擇,像我這樣的新手也是覺得老司機們的這車開得好,可以很方便得管理一個分發包。但是,對於我們說的如果只有一點點文件,我就來打個 rpm 包,似乎有點脫褲放屁的感覺;同時,有時我們可能是在 OSX/Win 平台跑,這又缺乏一定的通用性。

基於很多考慮,有同學就覺得為啥不把這些簡單的靜態文件打包進可執行文件中,這樣我還是只分發一個文件就可以了,其實我也挺喜歡這種方式的,好處就是很簡單,帶來的缺點當然也很明顯,自然分發可執行文件就大了。Anyway,有得有失,不妨一起和我看一下這種方式是如何實現的。

go-bindata 介紹

在 Go 語言的 Awesome 中你可以看到很多靜態打包庫,但是,你卻看不到 go-bindata,哈哈,這很奇怪哈。而且相比於 Awesome 中列舉的這些庫,go-bindata 明顯更受歡迎,更流行。

go-bindata 很簡單,設計理念也不難理解。它的任務就是講靜態文件封裝在一個 Go 語言的 Source Code 里面,然后提供一個統一的接口,你通過這個接口傳入文件路徑,它將給你返回對應路徑的文件數據。這也就是說它不在乎你的文件是字符型的文件還是字節型的,你自己處理,它只管包裝。

瞎說無憑,這里就給出一個例子用於展示 go-bindata 的實際使用:

這里可以看到,Line 1 就是一個使用 go-bindata 的例子,這里講 etc/config.json 通過 go-bindata 封裝起來,然后下面就直接使用它,這樣在運行的時候我就不用關注靜態文件的具體位置了,我只認准 etc/config.json 就好了。

go-bindata 使用

首先,先介紹一下我的目錄結構,因為這對於待會介紹 go-bindata 的使用有很大關系:

在根目錄下我是定義了接口文件的,然后再 etc 目錄下是放置我的配置文件:config.json,這也是我希望打包的配置文件,然后再 file/service.go 里面我是實現了需要進行文件讀取的代碼。

1. 使用 go-bindata 打包靜態文件

前面說了,go-bindata 是將靜態文件打包成 go 文件,所以第一步就是使用 go-bindata 讀取配置文件,然后再生成 go 文件,具體的使用命令為:

$ go-bindata  -pkg etc -o etc/bindata.go etc/

關於 go-bindata 的參數,可以使用 go-bindata --help 查看。使用上面這條命令之后,會發現在 etc 目錄下多了一個 bindata.go 文件,下一步我們就會使用它來代替 etc/config.json 文件。

使用靜態文件

使用靜態文件的代碼也是很簡單,我們只需要記住我們剛才生成 go 文件的相對路徑,然后使用:

Asset("etc/config.json")

這樣的語句就可以讀取到靜態文件了,整個 service 的示例代碼為:

這里的 Line 5 就是使用剛才我們生成的 bindata.go 來讀取靜態文件的一段代碼。

總結

這篇文章很簡單得介紹了一下如何使用 go-bindata 來打包靜態文件,同時在項目中如何使用這些靜態文件。從這篇文章的介紹中應該可以看出 go-bindata 還是比較簡單的,沒有太復雜的方式,使用 go-bindata --help 也會發現參數還是相對比較少的,所以適合一些要求不復雜的場景。但是,這就意味着它的功能可能也是有限的,例如,默認是不支持 http.FileSystem 的,只能找其他插件支持。

Reference

  1. Go-Bindata


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM