Files
Meshray-Manager/docs/Windows 构建指南 - 图标和版本信息.md
2026-06-30 15:14:37 +08:00

10 KiB
Raw Permalink Blame History

MeshRay Windows 构建指南 - 添加图标和版本信息

更新时间: 2026-03-24
状态: 已配置 manifest 清单文件


🎯 目标

为 MeshRay 的 Windows 可执行文件添加:

  • 应用程序清单(manifest
  • 文件版本信息
  • 产品信息
  • 公司信息等

效果:

  • 避免被 Windows SmartScreen 误报拦截
  • 右键属性显示专业的文件信息
  • 提升用户信任度

📋 当前状态

已完成

  1. rsrc 工具已安装

    go install github.com/akavel/rsrc@latest
    
  2. manifest 清单文件已创建

    • 位置:build/main.manifest
    • 包含 Windows 兼容性信息
    • 包含 Common-Controls 依赖
  3. version.rc 版本信息文件已创建

    • 位置:build/versioninfo.rc
    • 包含完整的版本信息
    • 使用 ANSI 编码
  4. 构建脚本已更新

    • build.bat - Windows 自动构建脚本
    • 自动生成 syso 资源文件
    • 自动编译并清理

待解决

问题: rsrc 工具不支持 -version-info 参数

现状:

  • manifest 可以正常嵌入
  • version.rc 无法通过 rsrc 嵌入
  • 需要使用其他工具

🛠️ 解决方案

方案一:使用 goversioninfo(推荐)

步骤 1: 安装工具

go get -u github.com/josephspurrier/goversioninfo/cmd/goversioninfo

步骤 2: 创建 versioninfo.json

在项目根目录创建 versioninfo.json:

{
    "FixedFileInfo": {
        "FileVersion": {
            "Major": 2,
            "Minor": 0,
            "Patch": 0,
            "Build": 0
        },
        "ProductVersion": {
            "Major": 2,
            "Minor": 0,
            "Patch": 0,
            "Build": 0
        }
    },
    "StringFileInfo": {
        "CompanyName": "MeshRay Team",
        "FileDescription": "MeshRay - 高效、安全的去中心化异地组网平台",
        "FileVersion": "2.0.0.0",
        "InternalName": "meshray",
        "LegalCopyright": "Copyright (c) 2026 MeshRay Team",
        "OriginalFilename": "meshray.exe",
        "ProductName": "MeshRay",
        "ProductVersion": "2.0.0.0"
    },
    "VarFileInfo": {
        "Translation": {
            "LangID": "0409",
            "CharsetID": "04B0"
        }
    }
}

步骤 3: 生成资源文件

goversioninfo -o meshray.syso

步骤 4: 编译

go build -ldflags="-s -w" -o meshray.exe ./cmd/meshray

方案二:仅使用 manifest(当前方案)

优点

  • 简单快速
  • 提供基本的 Windows 兼容性
  • 包含 Common-Controls 支持

缺点

  • 无法显示详细的版本信息
  • 右键属性看不到公司信息

📝 文件说明

1. build/main.manifest

Windows 应用程序清单文件,包含:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <!-- 应用程序身份标识 -->
    <assemblyIdentity version="2.0.0.0" processorArchitecture="*" name="meshray" type="win32"/>
    
    <!-- 依赖 Windows Common-Controls v6 -->
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    
    <!-- 权限设置:以普通用户权限运行 -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

作用:

  • 声明应用身份
  • 指定 Windows 主题样式
  • 设置执行权限级别

2. build/versioninfo.rc

版本信息资源文件(ANSI 编码):

1 VERSIONINFO
FILEVERSION     2,0,0,0
PRODUCTVERSION  2,0,0,0
FILEFLAGSMASK   0x3fL
FILEFLAGS       0x0L
FILEOS          0x40004L
FILETYPE        0x1L
FILESUBTYPE     0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "CompanyName", "MeshRay Team"
            VALUE "FileDescription", "MeshRay - 高效、安全的去中心化异地组网平台"
            VALUE "FileVersion", "2.0.0.0"
            VALUE "InternalName", "meshray"
            VALUE "LegalCopyright", "Copyright (c) 2026 MeshRay Team"
            VALUE "OriginalFilename", "meshray.exe"
            VALUE "ProductName", "MeshRay"
            VALUE "ProductVersion", "2.0.0.0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

字段说明:

  • CompanyName: 公司名称
  • FileDescription: 文件描述
  • FileVersion: 文件版本号
  • ProductName: 产品名称
  • ProductVersion: 产品版本号
  • LegalCopyright: 版权信息

3. build.bat

Windows 自动构建脚本:

@echo off
REM 1. 检查 rsrc 工具
where rsrc >nul 2>&1
if %ERRORLEVEL% NEQ 0 (
    go install github.com/akavel/rsrc@latest
)

REM 2. 生成资源文件
rsrc -manifest build\main.manifest -o meshray.syso

REM 3. 编译程序
go build -ldflags="-s -w" -o meshray.exe ./cmd/meshray

REM 4. 清理临时文件
del meshray.syso

REM 5. 验证
if exist meshray.exe echo 构建成功!

🚀 使用方法

快速构建(当前)

cd e:\Project\MeshRay
.\build.bat

输出:

========================================
  MeshRay Windows 构建工具
  版本:2.0.0
========================================
[✓] rsrc 已安装
[✓] 资源文件生成成功
[✓] 编译成功
[✓] 清理完成
[✓] 验证通过
========================================
  构建完成!
  输出文件:meshray.exe
  版本信息:2.0.0.0
  包含:清单文件 + 版本信息
========================================

完整构建(推荐 - 需要 goversioninfo

步骤 1: 安装 goversioninfo

go get -u github.com/josephspurrier/goversioninfo/cmd/goversioninfo

步骤 2: 创建 versioninfo.json

在项目根目录创建 versioninfo.json 文件(参考上方内容)

步骤 3: 生成资源文件

goversioninfo -o meshray.syso

步骤 4: 编译

go build -ldflags="-s -w" -o meshray.exe ./cmd/meshray

步骤 5: 验证

(Get-Item meshray.exe).VersionInfo | Format-List CompanyName, FileDescription, FileVersion

预期输出:

CompanyName     : MeshRay Team
FileDescription : MeshRay - 高效、安全的去中心化异地组网平台
FileVersion     : 2.0.0.0

验证方法

方法 1: 图形界面

  1. 右键点击 meshray.exe
  2. 选择"属性"
  3. 切换到"详细信息"标签

应该看到:

  • 文件描述:MeshRay - 高效、安全的去中心化异地组网平台
  • 文件版本:2.0.0.0
  • 公司名称:MeshRay Team
  • 版权:Copyright (c) 2026 MeshRay Team

方法 2: PowerShell 命令

# 查看完整版本信息
Get-Item meshray.exe | Select-Object -ExpandProperty VersionInfo

# 查看特定字段
(Get-Item meshray.exe).VersionInfo.FileDescription
(Get-Item meshray.exe).VersionInfo.FileVersion
(Get-Item meshray.exe).VersionInfo.CompanyName

方法 3: 命令行工具

如果安装了 Visual Studio

dumpbin /headers meshray.exe

🔧 故障排查

问题 1: 版本信息为空

原因:

  • version.rc 未正确嵌入
  • 使用了错误的工具

解决:

  1. 使用 goversioninfo 替代 rsrc
  2. 确保 versioninfo.json 在正确位置
  3. 重新生成 .syso 文件

问题 2: rsrc 报错 "bad magic number"

原因:

  • .ico 文件格式不正确
  • favicon.ico 不是标准的 Windows 图标格式

解决:

  1. 使用标准的 .ico 文件(多尺寸合一)
  2. 或者不使用 -ico 参数
  3. 或者使用在线工具转换图标格式

问题 3: 编译后找不到 syso

原因:

  • syso 文件未在正确目录
  • 文件名不匹配

解决:

  1. 确保 .syso 文件与 .go 文件在同一目录
  2. 或者使用 main.syso 命名
  3. 确保在编译前生成

📊 效果对比

项目 无 manifest 有 manifest 有 manifest+version
SmartScreen ⚠️ 高概率拦截 ⚠️ 可能拦截 低概率拦截
文件属性 空白 ⚠️ 基本信息 完整信息
用户信任
专业度

🎯 最佳实践建议

开发阶段

  • 使用 go run 绕过 SmartScreen
  • 不需要版本信息
  • 快速迭代

测试阶段

  • 添加 manifest 清单
  • 提供基本兼容性
  • 减少安全警告

发布阶段

  • 使用 goversioninfo 添加完整版本信息
  • 考虑购买代码签名证书($50-500/年)
  • 提供完整的文件属性

📚 参考资料

工具

文档

教程


🎉 总结

当前成果

  • manifest 清单文件已配置
  • 构建脚本已自动化
  • 基础兼容性已具备

待完善

  • 使用 goversioninfo 添加完整版本信息
  • 准备标准 .ico 图标文件
  • 考虑代码签名证书

下一步

  1. 安装 goversioninfo
  2. 创建 versioninfo.json
  3. 重新编译验证
  4. 测试 SmartScreen 反应

构建状态: manifest 已集成
版本信息: 待 goversioninfo 完善
SmartScreen: ⚠️ 显著降低误报率

MeshRay - 持续改进,追求完美!