用Go在Windows下写了一个.exe的程序,这个程序默认是不带版本,版权,产品名称以及图标的,因此,这些东西我们要自己去生成。

Go对于程序版本这方面已经有了开源的包,见GitHub - https://github.com/josephspurrier/goversioninfo。

你可以自己在Go的代码中引入这个包,并且在生成.syso文件,这样子是可以的。

既然提到了.syso,那么可以推断出,要使得用Go编写的Windows程序具有这些属性信息,.syso是必须的,至于怎么生成.syso,那就有很多方法了。

这里只介绍用windres.exe.rc资源文件还有.manifest来生成这些属性。

windres.exeWindows下是不带的,我用Everything在我的电脑上搜到的路径如下:

版本的生成

标准的做法是这样子的,a.b.c.d,前三位是固定不动的,例如1.0.1,这作为一个大版本,如果修改,需要人手动修改;

后面这一位就有讲究了,由于开发程序时我们都会有版本控制工具,而Git也是用得最多的,因此这最后一位要和Git版本控制挂钩。

而版本号有两个,产品版本号和文件版本号,表现形式又要分两种,一种是直接作为程序的标识,一种是给人看的(这个呈现在属性页上)。给人看的可以随便写,程序的标识可不能随便弄;

而文件版本号修改一次增加一次,产品版本号发布一次增加一次,由于我的程序是.exe,因此这两个是一样的。

因此我们用两个Git的两个命令来生成版本号:

  • git rev-list --count HEAD,获取该分支提交(修改)了多少次
  • git rev-parse --short HEAD,获取该分支最后一次提交的短哈希号

提交了多少次可以作为最后一位版本号,短哈希号可以附加到最后一位版本号后面,便于我们追踪问题。

因此我们需要一些脚本和一些文件来完成这些工作。

// version_template.h#pragma once
#define VER_MAJOR 1
#define VER_MINOR 0
#define VER_PATCH 1

这个是前三位的版本号。

// make_version.bat@ECHO OFF
cd /d %1
if exist %2 del /q %2
for /f "delims=" %%i in ('git rev-list --count HEAD') do (set REVISION=%%i)
for /f "delims=" %%i in ('git rev-parse --short HEAD') do (set REVISION_HASH=%%i)if "%REVISION%" == "" (set REVISION=0
) (echo #define VER_REVISION %REVISION%  && echo #define VER_REVISION_HASH %REVISION_HASH%) > %2

执行这个脚本make_version.bat ./ ./version.h可以生成最后一位版本号和短哈希值。如下:

// version.h#define VER_REVISION 33
#define VER_REVISION_HASH a883258

注意version.h是通过脚本生成的,不要添加到版本库中,这属于无用的文件(因为可以生成啊)。

举个例子,最后的版本号应该是这个样子的:1.0.1.33以及1.0.1.33.a883258

.manifest

这个东西我对它的了解只限于添加启动权限,因此这里也用它添加启动时需要管理员权限。

// FlushHip.manifest<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="requireAdministrator"/></requestedPrivileges></security></trustInfo>
</assembly>

.rc

这个是重点,通过.rc文件把版权,版本,名称这些属性描述信息写进去。下面就提供一个模板。大家可以对应着地方进行修改

// FlushHip.rc#define RT_MANIFEST 24#include "version.h"
#include "version_template.h"#define MAKEVER_S(a,b,c,d) a,b,c,d
#define MAKEVER(a,b,c,d,e) a.b.c.d.e
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)1 VERSIONINFO
PRODUCTVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)
FILEVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)BEGINBLOCK "StringFileInfo"BEGINBLOCK "040904B0"BEGINVALUE "CompanyName", "blog.csdn.net/FlushHip"VALUE "FileDescription", "FlushHip"VALUE "FileVersion", TOSTRING(MAKEVER(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION, VER_REVISION_HASH))VALUE "InternalName", "FlushHip"VALUE "LegalCopyright", "Copyright (C) 2018. FlushHip. All Rights Reserved."VALUE "OriginalFilename", "FlushHip.exe"VALUE "ProductName", "FlushHip"VALUE "ProductVersion", TOSTRING(MAKEVER(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION, VER_REVISION_HASH))ENDENDBLOCK "VarFileInfo"BEGINVALUE "Translation", 0x0409, 0x04B0END
END1 ICON "FlushHip.ico"1 RT_MANIFEST "FlushHip.manifest"
1 VERSIONINFO
PRODUCTVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)
FILEVERSION MAKEVER_S(VER_MAJOR, VER_MINOR, VER_PATCH, VER_REVISION)

上面这三行代码是程序的表示,一定要不能错;

下面的描述信息可以随意,在属性页中呈现的就是这些东西;

1 RT_MANIFEST "FlushHip.manifest"

这个是加权限。

图标

1 ICON "FlushHip.ico"

只能用.ico格式的图标

生成.syso文件

我们写的上面的所有东西,最终的目的都是生成.syso文件,因此可以这么做:

cd "%~dp0"
call make_version.bat ./ version.hcd "%~dp0"
windres.exe -i FlushHip.rc -o FlushHip.sysocall go build -ldflags "-H windowsgui"

写的是后台程序,不希望弹出控制台,因此加上-ldflags "-H windowsgui"

这样子就可以在项目FlushHip下生成一个FlushHip.exe的文件,我们打开属性页看看

成功。

Go利用windres.exe和.rc文件在Windows下生成的程序带有版本、版权、产品名称、图标等属性信息相关推荐

  1. 教你如何利用php.exe运行php文件

    在windows环境下我们可以在命令行中利用php.exe来运行php文件.下面我们来介绍2种使用php.exe的方法.   第一种,我们可以利用php命令加上php文件+路径来执行具体的php文件. ...

  2. Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe

    Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe 文章目录 Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成e ...

  3. 怎么看c语言程序目录,windows下c语言获取程序当前的执行目录,读文件的代码片...

    代码如下: #include "stdafx.h" #include "stdlib.h" #include #include int _tmain(int a ...

  4. Windows下生成dump文件的三种方式

    文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...

  5. Qt学习之Windows下Qt应用程序打包成exe安装包

    本文介绍如何将exe可执行程序打包成exe安装包,打包完的安装包可以直接在Windows下安装,需要用到 Inno Setup 安装程序制作软件工具,工具下载完之后直接安装即可. 工具下载: 打包安装 ...

  6. linux iphone文件,在linux下生成iphone所需要的视频和音频文件的方法总结

    在linux下生成iphone所需要的视频和音频文件的方法总结 (2011-05-07 09:53:18) 标签: linux iphone mencoder ffmpeg mplayer 一.生成可 ...

  7. linux下文件与Windows下文件格式的区别与转换

    问题: Windows下的TXT文件上传到Linux系统上,用cut,grep.sed,awk等文本处理工具处理过后再次传到Windows电脑上,发现内容都连到一块了,百度了一下才知道换行符被删除了, ...

  8. c语言bnd文件,Unix环境下嵌入式C程序编译

    A.预编译部分 1.预编译DB2篇 1.1 什么是DB2预编译 在我们用C语言编写访问DB2的程序过程中,需要用到嵌入式SQL,其作用是将DB2 SQL混入一般C程序中, DB2预编译器可以将SQL语 ...

  9. python-py文件在windows下乱码

    1.windows下CMD运行.py文件出现乱码 出现了乱码 2.转换完字符编码,然后正确了 3.原因: python2中,CMD默认gbk编码,所以只能把代码中的中文进行gbk编码了. utf-8通 ...

最新文章

  1. 其他算法-Dijkstra
  2. Android开发学习笔记:数据存取之SQLite浅析
  3. redis java 性能_Redis 性能优化
  4. 【数据分析】数据分析(EDA)学习总结!
  5. go IDE 编译环境设置win32和win64
  6. js利用tab键切换当前页面_JS实现的tab切换并显示相应内容模块功能示例
  7. ps -ef grep java解释,ps -ef | grep java(示例代码)
  8. mysql 客户端_Linux桌面应用之MySQL客户端DBeaver
  9. nucleo stlink 固件_自制nucleo,可以随意更换芯片,支持stlink,板载usbisp
  10. C#—Dev XtraTabControl操作总结如动态增加Tab和关闭选项卡方法等
  11. 升级WINDOWS 10的失败
  12. local class incompatible: stream classdesc serialVersionUID = -3129896799942729832, local class seri
  13. Common IO 使用小结
  14. 传统数据与大数据对比
  15. position的8种定位方式
  16. Attach函数的讲解
  17. Unity Android手机触屏事件
  18. Eclipse启动失败,提示查看.metadata文件夹下的.log文件
  19. 第五讲 中断、异常和信号
  20. echarts树图修改连线样式颜色,树的形状曲线和折线,树图边的曲度

热门文章

  1. java反向映射_推荐一款Java对象映射神器,别再傻傻手动转换了!
  2. Redis持久化的两种方式
  3. 【Java基础】Java Lambda表达式详解
  4. 红底证件照背景怎么弄?试试这几种方法非常简单
  5. 浏览器-怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
  6. 打印耗材,原配的才是真正贴心的
  7. C++类和对象详细总结
  8. vwap 公式_VWAP算法标准VWAP策略原理
  9. 当shell命令键盘侠dadada!会的眨眨眼!
  10. mysql如何存储字符上下标_SQL Server如何存储特殊字符、上标、下标