Как мне скомпилировать программу Go как с исходным кодом, так и с пакетами только для двоичного кода? - PullRequest
0 голосов
/ 11 мая 2018

Справочная информация: я написал функцию (в packageA) и не хочу, чтобы кто-нибудь видел мой код.Поэтому я установил его в файл .a (packageA.a).Я использую его по методу ниже:

package main  
import packageA  
func main(){  
    packageA.Run()  
}   

Тогда я делаю

go tool compile -I lib/ main.go<br> go tool link -o main -L main.o Это может работать.

Но когда я делаю это, это не работает.
Я написал другую функцию (packageB) в $GOPATH/src/project/packageB
и обновил main.go

// main.go
package main
import (
    "packageA"
    _ "project/packageB"
)

func main(){
    packageA.Run()
}

exec go tool compile -I lib/ main.go

но ошибка can't find import "packageB"

мой макет каталога

project  
     main.go  
     lib/  
        packageA.a  
     packageB  
        xxx.go  

Хотелось бы узнать, является ли это хорошей практикой и что будет лучшим способом сделатьтот?go tool compile как импортировать .a файл и исходный код?

Искренне спасибо заранее.

1 Ответ

0 голосов
/ 11 мая 2018

Это отличный вопрос, и мне потребовалось немного исследований, чтобы ответить.

Я собираюсь предположить, что ваш вопрос действительно является лишь минимальным примером для целей воспроизведения, и что ваш 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, и мы все сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...