Другие языки программирования и технологии

golang Можно ли собрать несколько бинарников за раз?

Вопрос наверное странный, но вот прижало мне)

Вот есть команда go build main.go

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

Есть ли способ какого то цикла для сборки бинарников, что бы он мне сам собрал.. ну скажем 20 бинарников с портом 4001++ ?
Что бы 20-ый бинарник получился с портом 4020

Ну и соответственно что-то с именами самих бинарников подобное. Иначе он каждый предыдущий у меня затирает следующим, так как имя делает одинаковое.

Можно ли передавать желаемое имя файла на выходе?

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

package main

import "fmt"

var hello = "Hello"
var world = "World"

func main() {
fmt.Printf("%s, %s!\n", hello, world)
}
============================================

При обычном запуске, например, с помощью команды go run hello.go, мы получим строку «Hello, World!»:

$ go run hello.go
Hello, World!

А теперь добавим вызов линкера с флагами -X и новыми значениями переменных:

$ go run -ldflags="-X main.hello=Привет -X main.world=Мир" hello.go
Привет, Мир!

Подменять можно не только переменные из пакета main, но и переменные из любых пакетов вообще. Таким образом, во время сборки приложения можно зашить в него любую необходимую метаинформацию.

Как скомпилировать программу Go, состоящую из нескольких файлов?
htt__://qaru.site/questions/83177/how-to-compile-go-program-consisting-of-multiple-files
Александр Гусев
Александр Гусев
496
Лучший ответ
Вася Григоренко Всем огромное спасибо. Пишу комментом, потому что дополнить уже нельзя, но мало ли кто найдет) напишу то, что мне подсказали на другом проекте, что мне и нужно. Может кому пригодится

for i in `seq -w 1 1 3`; do go build -o file-$i -ldflags "-X main.argPort=400$i"; done

Таким образом запуститься цикл. Не все могу тут расшифровать) но 1 1 3 говорит о том, что начнется инкриментируемая переменная с 1 и цикл остановится когда она будет ровна 3 (включительно). Потом собственно сама команда build. Далее, как подсказали ниже -o имя желаемого на выходе файла с добавление $i (file-1, file-2, file-3)
Далее передача аргумента в пакет main. После точки имя перменно. В моем случае это порт, который так же будет постоянно инкрементиться. Ну тут еще не учитанно то, что начиная с 10 порт будет не 4010,
к вышесказанному добавлю лишь веселую команду man от слова мануал. пишем в терминале man go build,видим такую шнягу:
NAME
go - tool for managing Go source code

SYNOPSIS
go build [-o output] [ build flags ] [ packages ]
....
The -o flag specifies the output file name. If not specified, the name
is packagename.a (for a non-main package) or the base name of the first
source file (for a main package).

в переводе означает что если напишешь go build -o igogoport4020 main.go то go тебе соберет твой main.go в файл igogoport4020 . это ответ в лоб
но вообще все это порнушкой пахнет, почему бы не сделать прогу, которая бы принимала порт в качестве параметра? такую чтоб один раз написал go build -o igogo main.go, а потом мог вызвать её хоть ./igogo 4001 хоть ./igogo 123456 ?
Сергей Драган
Сергей Драган
13 437