2016-01-17 7 views
6

Jeśli spróbujesz skompilować następujący program Go:Jak połączyć statycznie plik binarny Go korzystający z crypto/tls?

package main 

import _ "crypto/tls" 

func main() { 

} 

Będziesz skończyć z dynamicznie połączonej Go binarny. Jest to dla mnie denerwujące (buduję plik binarny Go w kontenerze Docker, który wykorzystuje inną bibliotekę z mojego hosta, co spowoduje, że plik binarny nie będzie działać na moim hoście).

W jaki sposób jeden wymusza Czy utworzyć taki program statycznie?

Odpowiedz

8

Jedynym systemem operacyjnym, w którym crypto/tls używa cgo, jest darwin, gdzie musi zadzwonić pod numer FetchPEMRoots, aby uzyskać główne urzędy certyfikacji.

Powodem, dla którego używany jest program cgo, jest fakt, że crypto/tls importuje pakiet net, który domyślnie łączy się z programem do rozstrzygania hosta. Możesz zbudować pakiet net bez cgo przy użyciu znacznika "netgo".

go build -tags netgo 

Lub jeśli jesteś na zwolnieniu gdzie pakiety std lib nie zostanie zbudowany domyślnie, można je wywołać być skompilowany z nowym installsuffix

go build -installsuffix netgo -tags netgo 

Skoro jesteś nie będziesz potrzebować ani używać Cgo w swoim środowisku, możesz po prostu zbudować wszystko przy pomocy CGO_ENABLED=0, aby całkowicie wyłączyć cgo.

Powiązane problemy