Go語言編譯時為exe添加圖標(biāo)和屬性信息的方法
在使用Go語言開發(fā)應(yīng)用程序時,有個非常方便的地方就是編譯得到的可執(zhí)行文件可以不依賴任何動態(tài)鏈接庫、并且不需要任何運行環(huán)境即可運行,這一點Java就沒那么方便了。
不過在Windows上編譯得到的exe
文件,默認是不帶圖標(biāo)和任何屬性信息的,那么怎么才能讓我們編譯得到的可執(zhí)行文件帶上圖標(biāo)和屬性信息呢?
事實上,借助go-winres這款命令行工具即可很方便地實現(xiàn)。
1,安裝go-winres命令
執(zhí)行下列命令即可安裝go-winres
命令到電腦中:
go install github.com/tc-hib/go-winres@latest
2,創(chuàng)建配置模板
我們首先需要一個配置文件來指定我們的圖標(biāo)文件和屬性信息,然后將它們編譯得到資源文件,最后將資源文件和Go源代碼一起編譯即可得到帶有圖標(biāo)的可執(zhí)行文件了!
我們可以先生成一個配置模板,然后進行修改即可,執(zhí)行下列命令:
go-winres init
然后在當(dāng)前目錄下,你會發(fā)現(xiàn)多了個winres
目錄,其中winres.json
就是配置文件,而兩個png
文件則是它自帶的圖標(biāo)文件:
3,修改配置
使用文本編輯器打開winres.json
文件,其中有一些初始內(nèi)容:
其中的大致結(jié)構(gòu)我們不需要修改,基本上就是修改指定其中部分字段值即可。
下面,我們來單獨看一下每個部分。
(1) 圖標(biāo)指定
我們來看看圖標(biāo)部分,聲明在json
文件中的RT_GROUP_ICON
屬性中:
"RT_GROUP_ICON": { "APP": { "0000": [ "icon.png", "icon16.png" ] } }
上述APP
表示一組圖標(biāo),其中還有一個0000
,表示語言,不過這兩個屬性名稱都不需要怎么動,重點是看0000
這個屬性,它是一個數(shù)組,而很顯然數(shù)組中記錄著一組圖標(biāo),在其中可以指定不同分辨率的圖標(biāo)。在這里指定的圖標(biāo)就會被應(yīng)用到最終編譯的可執(zhí)行文件上去。
圖標(biāo)文件可以就是png
文件,將它和winres.json
放在同一目錄下,然后在這個0000
數(shù)組中指定圖標(biāo)文件名即可。
假設(shè)我現(xiàn)在需要自定義圖標(biāo),并且只需要一個文件,那么我可以先刪除里面自帶的兩個png
文件,然后把我的圖標(biāo)放在和winres.json
同級目錄下:
然后修改圖標(biāo)部分配置如下:
"RT_GROUP_ICON": { "APP": { "0000": [ "my-icon.png" ] } }
這樣,圖標(biāo)就指定完成了!
需要注意的是,圖片文件尺寸不能大于256 x 256
!
(2) 軟件清單
軟件清單部分聲明在RT_MANIFEST
屬性中:
"RT_MANIFEST": { "#1": { "0409": { "identity": { "name": "", "version": "" }, "description": "", "minimum-os": "win7", "execution-level": "as invoker", "ui-access": false, "auto-elevate": false, "dpi-awareness": "system", "disable-theming": false, "disable-window-filtering": false, "high-resolution-scrolling-aware": false, "ultra-high-resolution-scrolling-aware": false, "long-path-aware": false, "printer-driver-isolation": false, "gdi-scaling": false, "segment-heap": false, "use-common-controls-v6": false } } }
上述并非所有屬性都需要填寫和修改,這里將重要的部分講解一下:
description
文件的描述信息minimum-os
最低要求操作系統(tǒng),可以是以下值:"vista"
"win7"
"win8"
"win8.1"
"win10"
execution-level
應(yīng)用程序所需的權(quán)限,可以是:"as invoker"
不需要任何權(quán)限"highest"
使用當(dāng)前用戶的可用最高權(quán)限"administrator"
強制要求管理員權(quán)限才能運行
對于identify
屬性,普通應(yīng)用程序建議留空即可,也可以將其刪除。
(3) 元數(shù)據(jù)信息
這部分定義在RT_VERSION
屬性中:
"RT_VERSION": { "#1": { "0000": { "fixed": { "file_version": "0.0.0.0", "product_version": "0.0.0.0" }, "info": { "0409": { "Comments": "", "CompanyName": "", "FileDescription": "", "FileVersion": "", "InternalName": "", "LegalCopyright": "", "LegalTrademarks": "", "OriginalFilename": "", "PrivateBuild": "", "ProductName": "", "ProductVersion": "", "SpecialBuild": "" } } } } }
這里也并非所有屬性都需要填寫和修改,這里將重要的部分講解一下:
fixed
屬性中的兩個屬性,主要是聲明文件版本和程序版本,按照x.y.z.w
的格式自己填寫即可info
主要是屬性信息,其中0409
是英語的語言代碼,表示在英文環(huán)境下顯示其中的屬性,在info
中可以定義多個語言環(huán)境下的屬性信息,具體大家可以查看官方項目示例,在其中:CompanyName
公司名稱FileDescription
文件描述FileVersion
文件版本ProductVersion
程序版本LegalCopyright
版權(quán)信息OriginalFilename
原始文件名ProductName
程序名稱
(4) 簡易winres.json模板
可見上述有許多屬性是我們大多數(shù)時候不需要進行設(shè)定的,可以刪除,因此這里我提供一個模板,大家可以復(fù)制作為自己的winres.json
文件使用:
{ "RT_GROUP_ICON": { "APP": { "0000": [ "my-icon.png" ] } }, "RT_MANIFEST": { "#1": { "2052": { "description": "我的Go示例程序", "minimum-os": "win7", "execution-level": "highest", "ui-access": false, "auto-elevate": false, "dpi-awareness": "system", "disable-theming": false, "disable-window-filtering": false, "high-resolution-scrolling-aware": false, "ultra-high-resolution-scrolling-aware": false, "long-path-aware": false, "printer-driver-isolation": false, "gdi-scaling": false, "segment-heap": false, "use-common-controls-v6": false } } }, "RT_VERSION": { "#1": { "0000": { "fixed": { "file_version": "1.0.0.0" }, "info": { "2052": { "CompanyName": "公司名稱", "FileDescription": "我的Golang示例程序", "LegalCopyright": "? 版權(quán)", "OriginalFilename": "demo.exe", "ProductName": "Go示例", "ProductVersion": "1.0.0.0" } } } } } }
大家修改其中信息為自己的即可。
4,編譯資源
在winres
文件夾所在目錄下執(zhí)行命令
go-winres make
此時你會發(fā)現(xiàn)多了這幾個syso
文件,這就是編譯得到的資源:
需要注意的是,上述命令的運行路徑是在winres
文件夾所在目錄下,而不是winres
文件夾里面。
當(dāng)然,你也可以使用--in
參數(shù)指定json
文件位置,如果你的運行路徑不在winres
文件夾的所在目錄下的話:
# 指定json配置文件在上一級目錄的res目錄中 go-winres make --in "../res/winres.json"
還可以使用--out
參數(shù)指定輸出的資源文件位置,具體大家可以通過命令go-winres make --help
查看幫助。
5,編譯Go程序
首先確保上述編譯得到的兩個syso
資源文件和Go語言模塊配置go.mod
在同級目錄下:
然后像平時一樣,在go.mod
所在目錄下執(zhí)行構(gòu)建命令即可:
go build -ldflags "-w -s"
這樣,我們得到的可執(zhí)行文件就有圖標(biāo)和屬性信息了!
上述命令中,ldflags
參數(shù)指定的是去除調(diào)試和符號信息以減小構(gòu)建產(chǎn)物文件大小,這個參數(shù)可以省略。
可見我們編譯得到的資源文件都有著類似_windows_amd64
這樣的后綴,這個后綴是用于go build
命令鏈接資源時,根據(jù)架構(gòu)判斷鏈接哪個資源用的,例如當(dāng)我們編譯64位程序時,go build
就會自動尋找名為xxx_windows_amd64.syso
的資源文件進行鏈接,同樣地如果是編譯為32位程序,則是尋找名為xxx_windows_386.syso
的資源文件,因此syso
資源文件的文件名必須是xxx_windows_amd64.syso
這樣的形式,不可以修改其后綴。
與此同時,在進行go build
時,go.mod
文件必須要和syso
文件在同一目錄下,如果沒有go.mod
文件,那主程序文件(被編譯的)就需要和syso
文件在同一目錄下。
以上就是Go語言編譯時為exe添加圖標(biāo)和屬性信息的方法的詳細內(nèi)容,更多關(guān)于Go exe添加圖標(biāo)和屬性信息的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang在整潔架構(gòu)基礎(chǔ)上實現(xiàn)事務(wù)操作
這篇文章在 go-kratos 官方的 layout 項目的整潔架構(gòu)基礎(chǔ)上,實現(xiàn)優(yōu)雅的數(shù)據(jù)庫事務(wù)操作,需要的朋友可以參考下2024-08-08基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn)
這篇文章主要介紹了基于go手動寫個轉(zhuǎn)發(fā)代理服務(wù)的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12