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