Goembed是一個Go編程語言中用於將文件和其他資源直接嵌入到代碼中的工具。在使用過程中,Goembed可將文件如圖片、CSS文件以及其他文本文件和DLL嵌入應用程序中,這樣可以大大簡化應用程序的部署和管理。接下來,我們將從不同的方面來詳細闡述Goembed的嵌入文件和DLL功能。
一、Goembed嵌入DLL
1、嵌入單個DLL
Go語言本身是跨平台支持的,但是,為了實現相應的功能,還需要諸如動態鏈接庫(DLL)之類的資源添加到應用程序中。如果您想在應用程序中嵌入一個簡單的DLL文件,Goembed將為您提供具有以下文件內容的DLL文件:
//go:embed sample.dll
var d []byte
我們可以使用go generate命令來生成將DLL嵌入應用程序中的文件。因此,我們需要更新go.mod文件:
module demo
go 1.16
require (
github.com/lxn/walk v0.0.0-20210809111303-dbed2ece652c
)
//go:generate go run ./tools/embeddll.go
該代碼往go.mod文件添加了嵌入代碼的進程。接下來,我們需要添加一個名為embeddll.go的新文件,並將如下內容添加到其中:
package main
import (
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
)
func main() {
out, err := os.Create("demo.rc")
if err != nil {
log.Fatal(err)
}
defer out.Close()
// Write .rsrc file header
out.WriteString("1 24 \"demo.exe.manifest\";\n")
out.WriteString(`1 14 "MICROSOFT_D2D" {`);
out.WriteString("FONT ");
out.WriteString("DEFAULT_GUI_FONT");
out.WriteString(" {\n");
out.WriteString(" DIALOGEX 8, 8, 161, 36\n");
out.WriteString(" STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU\n")
out.WriteString(" CAPTION \"\"\n");
out.WriteString(" FONT 9, \"MS Shell Dlg\", 0, 0, 0x1\n");
out.WriteString("}\n");
out.WriteString("}\n");
// Write command to embed the DLL
out.WriteString("1 24 \"sample.dll\" {\n");
out.WriteString(" RCDATA sample.dll\n");
out.WriteString("}\n");
out.Sync()
// use rc.exe to compile .rc file to .syso
cmd := exec.Command("cmd", "/c", "rc.exe", "/fo", "demo.syso", "demo.rc")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
log.Fatal(err)
}
err = os.Remove("demo.rc")
if err != nil {
log.Fatal(err)
}
}
這個示例代碼演示了如何將單個DLL文件嵌入應用程序中並在Windows上運行該應用程序。
2、嵌入多個DLL
如果您需要嵌入多個DLL文件,可以使用以下兩種不同的方法來完成:
第一種方法:在每個DLL文件上使用相同的名稱,即將每個DLL文件重命名為template.dll並運行以下命令:
go generate
golibrsrc -o myresource.syso *.dll
第二種方法:使用以下命令將每個DLL文件分別轉換為.SYSO文件,並在應用程序代碼中嵌入這些文件:
//go:embed sample1.dll sample2.dll sample3.dll
var d []byte
二、Goembed嵌入文件夾選取
如果您想將文件夾中的所有文件嵌入到應用程序中,則可以使用以下代碼:
//go:embed mydirectory/*
var embeddedFS embed.FS
f, err := embeddedFS.Open("mydirectory/myfile.txt")
if err != nil {
log.Fatal(err)
}
b, err := ioutil.ReadAll(f)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
使用此代碼,將在示例文件夾中的所有文件(包括子文件夾)嵌入到名稱為d的[]byte變數中,我們可以使用此[]byte變數訪問所有文件。
3、Goembed選擇文件夾
如果您只想嵌入文件夾中的一些文件,則可以在路徑中指定嵌入的文件。例如,假設我們只想嵌入文件夾中的文件.txt和file2.txt,我們可以使用以下代碼:
//go:embed mydirectory/file.txt mydirectory/file2.txt
var embeddedFS embed.FS
f, err := embeddedFS.Open("mydirectory/file.txt")
if err != nil {
log.Fatal(err)
}
b, err := ioutil.ReadAll(f)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
使用此代碼,只有文件夾中file.txt和file2.txt文件將嵌入到名稱為d的[]byte變數中。我們可以使用此[]byte變數訪問兩個文件。
總結
通過使用Goembed,我們可以輕鬆地將文件和其他資源嵌入到Go應用程序中,避免了將文件保存在磁碟上並需要相應的文件位置的繁瑣過程。無論是嵌入單個DLL還是文件夾,Goembed都能簡化您的代碼,並讓您的應用程序更易於部署和管理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182921.html