在使用Go语言开发Windows应用程序时,编译得到的exe文件天然不依赖动态链接库和运行环境,但默认也不含图标、文件版本、公司名称等属性信息。对于需要分发给用户的桌面工具或系统服务,带上正确的图标和元数据不仅能提升专业度,还能避免被误识别为可疑文件。本文介绍如何通过go-winres这一命令行工具,为Go构建的exe添加自定义图标和标准资源信息。
安装go-winres
首先确保已安装Go开发环境。在终端执行以下命令即可将go-winres安装到系统PATH中:- go install github.com/tc-hib/go-winres@latest
复制代码 安装完成后,在命令行中直接使用go-winres命令。
初始化配置模板
在Go项目的根目录下执行:该命令会在当前目录生成一个winres文件夹,其中包含winres.json配置文件以及两个示例PNG图标文件(icon.png和icon16.png)。winres.json是核心配置,用于定义图标、应用程序清单和版本元数据。
配置图标
使用文本编辑器打开winres.json。找到RT_GROUP_ICON节点,其结构如下:- "RT_GROUP_ICON": {
- "APP": {
- "0000": [
- "icon.png",
- "icon16.png"
- ]
- }
- }
复制代码 APP代表图标组名称,0000代表语言(通常无需修改)。数组内列出需要嵌入的图标文件,支持多个分辨率,最终exe会根据系统需要自动选择合适的尺寸。
将自定义的图标文件(PNG格式,尺寸不超过256x256)放入winres文件夹,然后修改配置,例如只保留一个图标文件:- "RT_GROUP_ICON": {
- "APP": {
- "0000": [
- "my-icon.png"
- ]
- }
- }
复制代码 注意:图标文件必须与winres.json位于同一目录(即winres文件夹内)。
配置应用程序清单
RT_MANIFEST节点用于声明程序所需的最低操作系统版本、执行权限、DPI感知等属性。示例如下:- "RT_MANIFEST": {
- "#1": {
- "2052": {
- "description": "我的Go示例程序",
- "minimum-os": "win7",
- "execution-level": "highest",
- "dpi-awareness": "system",
- "ui-access": false,
- "auto-elevate": false,
- "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:最低操作系统版本,可选值包括"vista"、"win7"、"win8"、"win8.1"、"win10"。
- execution-level:请求的权限级别,可选"as invoker"(无特殊权限)、"highest"(当前用户可用最高权限)、"administrator"(强制以管理员身份运行)。
- dpi-awareness:DPI感知级别,建议设为"system"或"per-monitor"。
注意:identity字段(名称和版本)对于普通应用程序可以留空或删除。
配置版本元数据
RT_VERSION节点用于设置文件版本、产品版本、公司名称、版权等属性。结构如下:- "RT_VERSION": {
- "#1": {
- "0000": {
- "fixed": {
- "file_version": "1.0.0.0"
- },
- "info": {
- "2052": {
- "CompanyName": "公司名称",
- "FileDescription": "我的Golang示例程序",
- "LegalCopyright": "© 版权",
- "OriginalFilename": "demo.exe",
- "ProductName": "Go示例",
- "ProductVersion": "1.0.0.0"
- }
- }
- }
- }
- }
复制代码 - fixed.file_version / product_version:按x.y.z.w格式填写。
- info内以语言代码为键(如0409为英语,2052为简体中文),可配置多语言,Windows会按系统语言显示对应信息。
为简化配置,原文提供了一个精简的模板,读者可根据自身需求修改。
编译资源文件
在winres文件夹所在目录(即项目根目录)下执行:该命令会读取winres/winres.json,生成两个syso文件(例如resource_windows_amd64.syso和resource_windows_386.syso)。这些syso文件即为编译后的资源对象,后续go build会自动链接。
如果配置文件不在默认位置,可通过--in参数指定:- go-winres make --in "../res/winres.json"
复制代码 使用--out可指定输出路径。
编译Go程序
确保资源文件(syso)、go.mod以及Go源代码处于同一目录下。然后正常执行go build命令:- go build -ldflags "-w -s"
复制代码 其中-ldflags "-w -s"为可选参数,用于去除调试信息和符号表以减少exe体积。生成的可执行文件将包含先前配置的图标、版本信息、描述等属性。
注意事项
- syso文件的后缀名必须保留类似_windows_amd64.syso的形式,不能随意更改,否则go build无法根据目标架构自动匹配。
- 编译时请注意目标架构:go build默认使用当前系统架构,如需交叉编译32位exe,需设置环境变量GOARCH=386,go build会自动选择对应的_windows_386.syso文件。
- 如果项目中已存在go.mod,syso文件必须与go.mod同级;如果没有go.mod,则需与主入口文件(如main.go)同级。
通过以上步骤,任何用Go编写的Windows命令行工具或后台服务都能拥有标准的Windows资源信息,从而更好地融入Windows生态。 |