如何在golang中设置应用程序图标?

kgqe7b3p  于 2023-06-03  发布在  Go
关注(0)|答案(8)|浏览(329)

我刚刚在Windows上创建了我的第一个Go应用程序。
我如何给予它一个图标?
似乎没有任何构建标志来做这件事,我知道golang不支持资源。

xvw2m8pv

xvw2m8pv1#

您可以使用像akavel/rsrc这样的工具来生成一个.syso文件,其中包含嵌入在.rsrc节中的指定资源,旨在供Go链接器在构建Win32可执行程序时使用。
例如lxn/walk应用程序,它在其可执行文件中嵌入了其他元数据。

rsrc [-manifest FILE.exe.manifest] [-ico FILE.ico[,FILE2.ico...]] -o FILE.syso

-ico="":要嵌入的.ico文件的路径列表,以逗号分隔
这不同于将二进制数据嵌入到围棋程序中。
使用jteeuwen/go-bindata
要访问资产数据,我们使用Asset(string) []byte函数,该函数包含在生成的输出中。

data := Asset("pub/style/foo.css")
if len(data) == 0 {
    // Asset was not found.
}

// use asset data

2021年更新:如John Nanswer中所述,您还可以用途:
github.com/tc-hib/go-winres
一个简单的命令行工具,用于在使用Go构建的Windows可执行文件中嵌入常用资源:

  • 货单
  • 应用程序图标
  • 版本信息(文件属性中的“详细信息”选项卡)
  • 其他图标和光标

它也可以用作图书馆。

6qfn3psc

6qfn3psc2#

这个主题很长,实际上mingw只是一个需求,我们不需要第三方依赖。此外,资源文件*.rc对于win32可执行应用程序是必需的。最后,您可以在rc-demo中找到演示。
1)使用Chocolatey安装mingw:choco install mingw
2)创建main.exe.manifest文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="x86"
    name="controls"
    type="win32"
/>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

3)创建main.rc文件

100 ICON    "main.ico"
100 24      "main.exe.manifest"
101 RCDATA  "content.zip"

4)建设
在git-bash窗口中执行以下命令:windres -o main-res.syso main.rc && go build -i

qij5mzcb

qij5mzcb3#

上面的答案对我都不起作用。唯一的方法,我可以得到一个ico嵌入到一个去exe是与资源黑客。
http://www.angusj.com/resourcehacker/
1.安装并打开资源黑客
1.在Resource Hacker中打开编译的exe
1.操作>添加图像或其他二进制资源
1.选择ICO >添加资源
1.保存并关闭
如果需要将其添加到构建脚本中,也可以直接从命令行运行它。

ResourceHacker -open main.exe -save output.exe -action addskip -res main.ico -mask ICONGROUP,MAIN,
anhgbhbe

anhgbhbe4#

有一个由Joseph Spurrier编写的github包GoVersionInfo
Go语言的Microsoft Windows文件属性/版本信息和图标资源生成器
包创建一个syso文件,其中包含Microsoft Windows版本信息和一个可选图标。当你运行“go build”时,Go会在可执行文件中嵌入版本信息、一个可选的图标和一个可选的清单。如果syso文件与main()函数位于同一目录,Go会自动使用它。

h7wcgrx3

h7wcgrx35#

这对我很有用

go get github.com/akavel/rsrc
rsrc -ico YOUR_ICON_FILE_NAME.ico
go build
wecizke3

wecizke36#

这样做很好:

go install github.com/tc-hib/go-winres@latest
go-winres simply --icon youricon.png
go build

如果您的应用有GUI:go-winres simply --icon icon.png --manifest gui

xxls0lw8

xxls0lw87#

我针对我的需求深入研究了这个问题,John NCoconut提到的简单方法并没有像预期的那样工作。
经过更多的钻研,我找出了问题所在,我分享它,所以它可能对其他人有用。

  • Syso文件需要是应用程序使用的包的一部分。
  • 当有一个cmd/main.go文件用于构建时,syso文件不能放在项目的根目录中。
  • syso文件不能放在应用程序的主包中(即在构建cmd/main.go文件时,将syso放置在cmd下不会使其)。
    一些对我有用的例子:

扁平化项目结构

...\test1
│   go.mod
│   main.go
│   rsrc.syso

去哪儿.mod

module test1

go 1.19

和主路,走

package main

import (
        "fmt"
)

func main() {
        fmt.Println("test1")
}

然后go build按照预期创建了test1.exe

空包

把syso文件放在一个新的文件夹包和创建空文件与包的名称,强制导入此软件包使用_

...\test2
│   go.mod
│
├───cmd
│       main.go
│
└───rsrc
        init.go
        rsrc.syso

去哪儿.mod

module test2

go 1.19

rsrc.go

package rsrc

和主路,走

package main

import (
        "fmt"
        _ "test2/rsrc"
)

func main() {
        fmt.Println("test2")
}

然后go build -o test2.exe cmd\main.go按预期创建了test2.exe

piggyback在现有包上

将syso文件放置在项目应用程序已使用的文件夹包中(**注意:**如果不同的应用程序使用该包,则它们将具有相同的syso)

...\test3
│   go.mod
│
├───cmd
│       main.go
│
└───other
        other.go
        rsrc.syso

去哪儿.mod

module test3

go 1.19

other.go

package other

func Foo() string {
        return "bar"
}

和主路,走

package main

import (
        "fmt"
        "test3/other"
)

func main() {
        fmt.Println("test3")
        fmt.Println(other.Foo())
}

然后go build -o test3.exe cmd\main.go按预期创建了test3.exe

使用docker构建流程

基于现有包的Dockerized构建

因为,嘿,其他人可能也需要这个。
如果您有多平台/体系结构构建流,请使用arch将其设置为适当的ARCH

...
ARG TARGETARCH
ARG TARGETOS
RUN go install github.com/tc-hib/go-winres@latest
RUN go-winres simply --icon images/icon.png --out other/rsrc --arch ${TARGETARCH}
...
GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o test3.exe cmd/main.go 
...

我希望这能帮助任何被困的人

thtygnil

thtygnil8#

你想先改变一个图标,你知道setIcon() method它只允许低byte[],所以你首先创建图像并转换成字节[]。以下过程也是如此。

// define icon path using os.Open()
iconFile, err := os.Open("/home/user/image/icon.png")
if err != nil {
    log.Fatal(err)
}
defer iconFile.Close()

// png.Decode() to convert image path to image
img, err := png.Decode(iconFile)
if err != nil {
    log.Fatal(err)
}

// Then convert the image to byte[] format using bytes.Buffer
buf := new(bytes.Buffer)
err1 := jpeg.Encode(buf, img, nil)
_ = err1

// save the converted byte[] to variable
img_buf := buf.Bytes()

// set the coverted byte[] icon using systray.SetTemplateIcon() method
systray.SetTemplateIcon(img_buf, img_buf)

谢谢你!

相关问题