Go 語言打包靜態文件和與Gin一起使用Go-bindata

2020-09-22 雙鬼帶單

系列文章目錄

第一章 Go 語言打包靜態文件以及如何與Gin一起使用Go-bindata



文章目錄

  • 系列文章目錄
  • 前言
  • 一、go-bindata是什麼?
  • 二、使用步驟
    • 1. 安裝
    • 2. 使用
    • 3. 讀取文件
  • 三、和 Gin 一起使用
    • 1. 使用 go-bindata-assetfs 進行打包
    • 2. 安裝 go-bindata-assetfs
    • 3. 打包文件
    • 4. 重新配置
    • 5. 日常開發
  • 總結
  • 題外
  • 參考



前言

前幾天,開始學習用 Go 語言開發一個內部項目來幫助解決測試環境中的一些不便利的問題。因為開發的小項目中存在一些靜態文件和配置文件,第一打包的時候發現並沒有將靜態文件打包進入可執行文件,這樣在發布的時候又需要手動拷貝一下靜態文件,這樣就很麻煩了。在一些網上資料上發現了 go-bindata。這樣我還是只分發一個文件就可以了,不過打包出來的文件會大一點。

一、go-bindata是什麼?

his package converts any file into managable Go source code. Useful for embedding binary data into a go program. The file data is optionally gzip compressed before being converted to a raw byte slice.

It comes with a command line tool in the go-bindata sub directory. This tool offers a set of command line options, used to customize the output being generated.

go-bindata 將任何文件封裝在一個 Go 語言的 Source Code 裡面,文件數據在轉換為原始字節時可以選擇使用 gzip 壓縮,同時提供了統一的接口,幫助獲取原始的文件數據

二、使用步驟

1. 安裝

go get -u github.com/jteeuwen/go-bindata/...

2. 使用

使用 go-bindata --help 可以查看具體的使用方式

go-bindata --helpUsage: go-bindata [options] <input directories> -debug Do not embed the assets, but provide the embedding API. Contents will still be loaded from disk. -dev Similar to debug, but does not emit absolute paths. Expects a rootDir variable to already exist in the generated code&34;./bindata.go&34;main&34;template/css/app.ee8ee5dd.css&34;template/favicon.ico&34;template/fonts/element-icons.535877f5.woff&34;template/img/Avatar.41ba4b7a.jpg&34;template/index.html&34;template/js/app.40872d4f.js&34;conf/app.ini&34;conf/app.ini&34;template/index.html&34;/css&34;./template/css&34;/fonts&34;./template/fonts&34;/img&34;./template/img&34;/js&34;./template/js&34;/favicon.ico&34;./template/favicon.ico&34;/&34;index.html&34;template/css&34;index.html&34;template/js&34;index.html&34;template/fonts&34;index.html&34;template/img&34;index.html&34;template&34;index.html&34;/css&34;/fonts&34;/img&34;/js&34;/favicon.ico&34;/&34;template/index.html&34;Accept&34;text/html&34;template&34;index.html&34;template&34;template/css/app.ee8ee5dd.css&34;index.html" 意思為如何查詢不到則默認返回 index.html 文件,因為配置了前綴,這裡返回的應該是 template/index.html

5. 日常開發

在日常開發中,沒有必要沒改動一下靜態文件就要重新生成 asset.go,此時我們可以使用 -debug 模式生成 asset.go 文件,這樣訪問文件還是使用的真實文件

go-bindata-assetfs -debug -o=asset/asset.go -pkg=asset template/... conf/...

總結

通過 go-bindata 和 go-bindata-assetfs 的使用,我們可以將靜態文件進行打包,最終提供單個分發文件,簡化部署和使用。

題外

提一下 go-bindata 項目之前的一些周折。

如果你搜索 go-bindata 的文章,會發現早期的文章指向的項目地址往往是:https://github.com/jteeuwen/go-bindata 。那是最早的項目地址,jteeuwen 是原作者 Jim Teeuwen 的帳號。

但不知道什麼時候,因為什麼原因,原作者把項目關閉了,連 jteeuwen 這個帳號都刪除了。(從現存線索推斷,大約是 2018 年的事)

現在原地址也有一個項目,但已經 不是原項目 ,也 不再維護 了。那是有人發現 go-bindata 刪除後,為了讓依賴它的項目不會報錯,重新註冊了 jteeuwen 這個帳號,重新 fork 了這個項目 (真正原項目已刪,是從一個 fork 那裡 fork 的) 。因為初衷是讓某個項目能夠繼續工作(據說是已經沒法修改的私人項目,所以也不能指向新的地址),並沒有打算繼續維護,也不想冒充原項目,所以這個項目設為了 archived (read only)。詳情可以參考以下討論:

https://github.com/jteeuwen/go-bindata/issues/5

https://github.com/jteeuwen/discussions/issues

現在給出的項目地址,不確定跟原作者有沒有關係——估計是沒有的。那它不過是眾多 fork 的其中一個。選它僅僅因為它最活躍、關注人數最多。這可能跟它掛在了同名 organization 下有一定關係,也可能裡面有某個大牛。

理由並不重要,只需要知道它最活躍是一個共識,就夠了。

題外這段引用 https://jaycechant.info/2020/go-bindata-golang-static-resources-embedding/

參考

  • https://github.com/jteeuwen/go-bindata
  • https://github.com/elazarl/go-bindata-assetfs
  • https://github.com/go-bindata/go-bindata

相關焦點

  • Go 每日一庫之 go-bindata—靜態資源嵌入詳解
    語言一項殺手級特性。看著不怎麼起眼,但被應用發布和運維折磨過的朋友,會明白這意味著什麼。可沒高興多久,發現應用還是要引入各種靜態資源。這時就要拿出 go-bindata 了。本文沒有一開始給出最佳實踐,而是從最簡單的做法開始,展示一點一點改進的過程。長度儘量精簡,希望你看到最後。
  • 提前試用將在 Go1.16 中發布的內嵌靜態資源功能
    然而一個項目,很可能會包含一些靜態資源文件,這樣一來,一個 Go 二進位文件就不能解決了,需要將靜態資源文件一起帶上。於是有了很多第三方解決方案,將靜態資源文件「嵌入」最終的 Go 二進位文件中。>之前第三方的現實,基本是基於 go generate,將靜態資源文件生成 go 源文件,最後編譯進二進位文件中。
  • 「Golang」將靜態文件打包到二進位
    前言:經常寫java應用,大家都知道的是打成jar包,把靜態文件都直接最後以一個xxx.jar包展現。在運行的時候也特別方便。那麼go其實也有這樣的操作。其實核心思想都是將靜態文件轉換為.go文件,然後再通過import將包導入進去開始使用查看安裝結果statik --help建立test文件夾,在文件夾內分別建立 main.go和a.json
  • 基於GO語言實現web客服即時通訊與客服管理系統GO-FLY
    github地址:https://github.com/taoshihan1991/go-fly1.使用gin http框架實現restful風格的API和template包的模板語法進行展示界面2.使用jwt-go配合gin
  • Go二進位文件逆向分析從基礎到進階——綜述
    概述Go 語言是一個比較新的強類型靜態語言,2009 年由 Google 發布,在 2012 年才發布首個穩定版。Go 語言靠 Goroutine 和 channel、wait group、select、context 以及 sync 等輔助機制實現的 CSP 並發模型,以簡潔高效編寫高並發程序為亮點,很快就在全球範圍內吸引大量開發者使用其編寫各種程序。
  • Go語言愛好者周刊:第 62 期—今天的題很細節
    6、Go 1.16 go module 機制默認開啟[9]官方還是很謹慎。沒有使用 module 真的說不過去了。7、k6 v0.28.0 發布[10]k6 是一種現代的開源性能和負載測試工具,用 Go 編寫並且可以用 JavaScript 編寫腳本。
  • go-admin 開源後臺管理系統
    go-admin是一個go語言開發的後臺管理系統,該系統以角色為基礎的權限管理設計(RBAC),完成了系統管理模塊功能的開發(其他示例模塊後續加上),採用前後端分離實現方式,服務端基於go開源gin框架,前端開源框架vue-element-admin。使用Swagger 2.0自動生成API文檔。
  • go modules:使用mod管理項目依賴包,通過vendor一鍵分發編譯包
    依靠go語言最新的mod模塊,可以將依賴包的不同版本都緩存至$GOPATH/pkg/mod目錄下,各個項目通過go.mod文件各取合適的依賴包版本使用。如果想實現一鍵分發編譯包,通過go mod vendor指令,將依賴包從$GOPATH/pkg/mod目錄拷貝至當前項目目錄下的vendor目錄中。將目錄打包,直接分發即可,當然這限同類平臺。
  • GoWeb框架之Gin-簡明教程
    go-get=1:dial tcp 216.239.37.1:443: i/o timeout因此,可以先從 Github 手動安裝好,再安裝 go-outline 和 goreturns。Go語言有大量的輔助工具,如果你使用VSCode,將會提示你將必要的工具,例如靜態檢查、自動補全等工具依次安裝完畢。
  • [Go 語言教程] Go 語言簡介
    Go 語言教程1 Go 語言介紹Go 即Golang,是Google公司2009年11月正式對外公開的一門程式語言。Go是靜態強類型語言,是區別於解析型語言的編譯型語言。2 Go語言特性跨平臺的編譯型語言語法接近C語言管道(channel),切片(slice),並發(routine)有垃圾回收的機制支持面向對象和面向過程的編程模式3 Go 語言特色編程模式比較簡單,沒有複雜的設計模式全部源碼編譯到一個文件,編譯速度很快最新版本也有動態庫形式
  • 老王學習go語言——3.Go語言基礎 -第一個go程序
    而這三個目錄分別用來存放編譯後的可執行文件,編譯時生成的中間文件和原始碼。main包,具備可以執行函數main的go文件必須位於該包下。下面生面一個方法 defaultHander,關鍵字func用來聲明方法,可以看到main方法前面也是func,這種風格其實在很多語言裡都有,但C和java省略的函數關鍵字,直接通過public,static,返回值類型等來標識和修飾函數,而go當前看起來就是 func yourFuncname(
  • 讓開發中的 Go 項目自動預編譯
    第三方實現的類庫有這兩個,使用起來都很方便:gin https://github.com/codegangsta/ginfresh https://github.com/pilu/fresh安裝大同小異,使用也一樣:安裝 gin :>> go get github.com/codegangsta/gin
  • Go-INI - 超讚的Go語言INI文件操作庫
    INI 文件(Initialization File)是十分常用的配置文件格式,其由節(section)、鍵(key)和值(value)組成,編寫方便,表達性強,並能實現基本的配置分組功能,被各類軟體框架和項目廣泛使用。然而,日漸受到關注的 Go 語言,其官方庫並沒有對 INI 文件操作的庫,而進行 INI 文件的解析也並不是幾行就能完成的簡單工作。
  • 「Go 語言教程」 Go語言結構
    1 目錄和源碼首先我門看目錄和源碼,從之前的Go 語言教程我們知道,Go語言有工程目錄,和GOPATH環境變量對應,工程目錄結構有bin 存放編譯後的可執行文件src 存放實現源碼,go get工具獲取的web上的模塊包都會放到這個目錄下,並有對應的目錄結構pkg 存放編譯後的庫文件(分不同平臺)Go語言的源碼文件格式為.go格式。
  • go-mir v1.0.2 發布,用 Go 結構體標籤定義 handler 路由信息的...
    go-mir v3版本將會直接使用OpenAPI v3定義接口,大體架構如下:v3版本將使用OpenApi v3.0的定義文件直接生成接口代碼,後面的邏輯和v2保持一致。使用OpenAPI v3.0定義RESTfull API接口非常清晰、方便的,一直都想從OpenApi 的定義文件直接生成golang接口文件,go-mir v3版本將提供這個特性的支持,敬請期待。
  • web開發我更喜歡使用GO語言
    go語言在2007年9月設計,然後於2009年11月正式向外宣布推出使用,而且是開放原始碼項目,首先在Linux系統與Mac OS X平臺實現運行,不久在Windows系統實現。go語言可能是Google開發的程式語言,迅速受到開發的關注並願意使用它,在2016年被TIOBE 選為「TIOBE 年最佳程式語言」,可想而知go能被開發者認可一定有它獨特的優勢,而我更喜歡使用GO語言web開發。
  • Go語言愛好者周刊:第 58 期—關於 context
    nbsp; ctx := context.TODO()    f(ctx)    fmt.Println(ctx.Value(&34;))}資訊1、關於 Go 語言泛型設計的最新進展和一些問題的說明
  • 一次使用 Go 語言編寫腳本的經歷
    本文介紹了我如何嘗試使用 Go 語言進行腳本編程的經歷。文中我將討論 Go 腳本的必要性,我們預期的表現以及可能的實現方式。在討論過程中,我講深入探討腳本、Shell 和 Shebang。最終,我們將會討論讓 Go 腳本工作的解決方案。為什麼 Go 語言適合編寫腳本?
  • go語言基於角色訪問的權限管理模型插件
    轉自:go語言中文文檔:www.topgoer.com1.1.1. 特徵Casbin的作用:以經典{subject, object, action}形式或您定義的自定義形式實施策略,同時支持允許和拒絕授權。
  • 證明Go語言魅力的10個開源項目
    DockerDocker[15]是一個開源的應用容器引擎,讓開發者可以打包他們的應用和依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux 、Mac 或 Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。Docker 無疑是 Go 最成功的案例。