То, что я собираюсь предложить, в лучшем случае выглядит как хак, но оно может сработать для вас, если вы кросс-компилируете вещи в контейнере или в изолированной среде сборки.
Вы можете отброситьGOBIN из команды установки:
# I'm not on this platform, so this is a cross compile
GOOS=darwin GOARCH=amd64 go install mypackage/app1 mypackage/app2
Предполагается, что ваш пакет находится в $GOPATH/src/mypackage
, указанная выше команда установит два двоичных файла в:
$GOPATH/bin/darwin_amd64/{app1, app2}
и файлы зависимостей компиляции .a в:
$GOPATH/pkg/darwin_amd64/mypackage/{app1,app2,common}
Если вы запускаете это в цикле for для всех платформ, которые вы планируете поддерживать, одна неприятность этого процесса заключается в том, что когда вы передаете GOOS=x GOARCH=y
в соответствии с вашей локальной архитектурой (т.е. не пересекаютсякомпиляции), тогда исполняемые файлы будут помещены непосредственно в $GOPATH/bin/
, а не $GOPATH/bin/x_y/
.
(пакеты с другой стороны всегда заканчиваются на $GOPATH/pkg/x_y/
, кросс-компиляция или нет).
Чтобы определить локальную архитектуру, вы можете выполнить следующие шаги в этом ответе: https://stackoverflow.com/a/35669816/5556676.
Имитация GOBIN=/foo/bin GOOS=x GOARCH=y go install mypackage/app{1,2,3}
Изменение$GOPATH
мало влияет на то, куда go install пишет вывод.С некоторыми командами go, такими как go get
, вы настраиваете, где установлены пакеты, добавляя новый компонент перед $GOPATH
.Но в версии 1.9 go install
всегда будет копировать двоичные файлы в папку bin/
, которая является родственным элементом src/
, в котором содержатся пакеты для установки.
Вместо использования GOBIN=/foo/bin
вы можете притворитьсяисходные файлы находятся в /foo/src/mypackage
(вы можете использовать символическую ссылку), а затем выполните GOPATH=/foo GOOS=x GOARCH=y go install mypackage/app{1,2,3}
.Это поместит двоичные файлы в /foo/bin
из-за поведения, которое я описал в предыдущем абзаце.
Вероятно, проще просто взять двоичные файлы из того места, где вы их ожидаете, чем копаться с копированием исходных деревьев вокруг.