Это отличный вопрос, и мне потребовалось немного исследований, чтобы ответить.
Я собираюсь предположить, что ваш вопрос действительно является лишь минимальным примером для целей воспроизведения, и что ваш REAL вопрос в следующем: «Как мне скомпилировать программу на Go с использованием как исходного кода, так и бинарных пакетов ?»
Давайте пройдем этот шаг за шагом
Этап 1. Создание пакета только для двоичного кода.
Возможно, у вас уже есть пакет только для двоичного кода, поэтому вы можете пропустить этот шаг, если хотите, но это полезно для настройкиcontext.
Во-первых, давайте удостоверимся, что имена ваших пакетов действительно соответствуют структуре папок.Это означает, что main.go имеет следующий импорт:
import (
"project/packageA"
"project/packageB"
)
Аналогично, исходный код в packageB (который в вашем примере зависит от packageA) использует import "project/packageB"
Так что вы хотитеизначально иметь структуру, которая выглядит следующим образом:
$GOPATH/
src/
project/
main.go
packageA
xxx.go
packageB
xxx.go
И вы хотите скомпилировать packageA так, чтобы это был просто статический двоичный файл.Вы можете сделать это очень просто, запустив go install .
из каталога packageA
.
Теперь у вас есть следующая структура:
$GOPATH/
pkg/
$ARCH/
project/
packageA.a
src/
project/
main.go
packageA
xxx.go
packageB
xxx.go
Этап 2: Сборка main.goбез исходного кода Go для пакета A
Теперь ваша проблема: как мне сказать компилятору Go искать оба исходных файла go в src
и связанных двоичных файлов в pkg
?
Подвох в том, что если вы просто удалите packageA, цепочка инструментов компилятора Go будет сбита с толку - по умолчанию предполагается, что отсутствующий исходный код Go означаетсборка не удалась.Итак, что вы можете сделать с Go 1.7, это предоставить флаг компиляции внутри пакета A , который говорит: «Эй! Не используйте этот исходный код, используйте вместо этого связанный двоичный файл!»
Чтобы сделать это, мы хотим заменить содержимое исходного кода в packageA на файл, который выглядит следующим образом:
//go:binary-only-package
package packageA
Теперь все, что нам нужно сделатьпостроить main.go
- это просто использовать старый go build main.go
, и мы все сделали.