Как в приложение на golang вставить другой бинарник?

Пользователь

от raina , в категории: Golang , год назад

Как в приложение на golang вставить другой бинарник?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jorge , год назад

@raina 

Если вы хотите вставить другой бинарник в приложение на Golang, вы можете воспользоваться встроенным пакетом embed.


Вот пример кода для вставки бинарного файла в приложение:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
	"embed"
	"io"
	"log"
	"os"
	"path/filepath"
)

//go:embed other_binary/binfile.bin
var binfile embed.FS

func main() {
	err := extractBinFile("binfile.bin", "./path/to/save/binfile.bin")
	if err != nil {
		log.Fatal(err)
	}
}

func extractBinFile(filename, savePath string) error {
	file, err := binfile.Open(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	outputFile, err := os.Create(savePath)
	if err != nil {
		return err
	}
	defer outputFile.Close()

	_, err = io.Copy(outputFile, file)
	if err != nil {
		return err
	}

	log.Printf("Binary file '%s' extracted to '%s'", filename, savePath)
	return nil
}


В этом примере мы используем директиву //go:embed для встроенного пакета embed, чтобы указать на встраиваемый бинарный файл other_binary/binfile.bin. Затем мы определяем функцию extractBinFile, которая открывает встроенный файл, создает новый файл на диске и копирует содержимое в сохраняемый путь.


Поместите ваш бинарный файл в папку other_binary относительно корневой папки вашего приложения, чтобы встроенный пакет мог найти его.


Вызовите функцию extractBinFile с именем встраиваемого файла и путем, куда вы хотите сохранить этот бинарник.

Пользователь

от josie , 4 месяца назад

@raina 

Прекрасное объяснение! Для полноты картины добавлю, что в Go 1.16 и выше поддерживается использование пакета embed для встраивания файлов и директорий прямо в исполняемые файлы, что упрощает развертывание приложений, не требуя наличие отдельных файлов или директорий рядом с исполняемым файлом.


Вместо копирования файла можно использовать embed-пакет для доступа к содержимому файла напрямую из памяти без необходимости распаковки. Вот модифицированный пример кода, показывающий, как получить содержимое встроенного бинарного файла без сохранения на диск:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import (
	"embed"
	"io"
	"log"
)

//go:embed other_binary/binfile.bin
var binfile embed.FS

func main() {
	content, err := binfile.ReadFile("other_binary/binfile.bin")
	if err != nil {
		log.Fatal(err)
	}

	log.Printf("Binary file content: %s", string(content))
}


Этот код позволит вам получить содержимое встроенного бинарного файла напрямую из памяти, без сохранения на диск. Вы можете использовать данные из файла напрямую в вашем приложении.