Nowi programiści Go często nie wiedzą lub są zdezorientowani, co robi podstawowe polecenie go build.
Czego dokładnie go build
i go install
polecenia budować i gdzie włożyli wynik / wyjścia?
Odpowiedzi:
To, co go
robi polecenie, zależy od tego, czy uruchomimy je dla „normalnego” pakietu, czy dla "main"
pakietu specjalnego .
Do paczek
go build
buduje twój pakiet, a następnie odrzuca wyniki .go install
builds, a następnie instaluje pakiet w twoim $GOPATH/pkg
katalogu.Polecenia (pakiet main
)
go build
buduje polecenie i pozostawia wynik w bieżącym katalogu roboczym .go install
buduje polecenie w katalogu tymczasowym, a następnie przenosi je do $GOPATH/bin
.go build
?Możesz przekazywać pakiety do go build
pakietów, które chcesz zbudować. Możesz także przekazać listę .go
plików z pojedynczego katalogu, która jest wtedy traktowana jako lista plików źródłowych określająca pojedynczy pakiet.
Jeśli nie podano żadnych pakietów (ścieżek importu), kompilacja jest stosowana w bieżącym katalogu.
Ścieżka importu może zawierać jeden lub więcej "..."
symboli wieloznacznych (w tym przypadku jest to wzorzec ). ...
może dopasować dowolny ciąg, np. net/...
pasuje do net
pakietu i pakietów znajdujących się w dowolnym z jego podfolderów. Komenda
go build ./...
często używany do budowania pakietu w bieżącym folderze i powtarzających się wszystkich pakietów. To polecenie wydane w katalogu głównym projektu tworzy kompletny projekt.
Aby uzyskać więcej informacji na temat określania pakietów, uruchom go help packages
.
Wstępna obsługa modułów Go została wprowadzona w Go 1.11, a moduły stały się domyślne począwszy od Go 1.13. Gdy go
narzędzie jest uruchamiane z folderu zawierającego go.mod
plik (lub jednego z elementów nadrzędnych bieżącego folderu), go
narzędzie działa w trybie uwzględniającym moduł (starszy tryb nazywa się trybem GOPATH ).
W trybie obsługi modułów GOPATH nie definiuje już znaczenia importu podczas budowania, ale nadal przechowuje pobrane zależności (w GOPATH / pkg / mod) i zainstalowane polecenia (w GOPATH / bin, chyba że GOBIN jest ustawiony).
Podczas budowania modułów to, co jest budowane, jest określane na liście kompilacji . Lista kompilacji początkowo zawiera tylko moduł główny (moduł zawierający katalog, w którym go
polecenie jest uruchamiane), a zależności modułu głównego są dodawane do listy kompilacji rekurencyjnie (dodawane są również zależności zależności).
Aby uzyskać więcej informacji, uruchom go help modules
.
Zasadniczo możesz użyć go build
jako sprawdzenia, czy pakiety można zbudować (wraz z ich zależnościami), a go install
także (na stałe) zainstalować wyniki w odpowiednich folderach $GOPATH
.
go build
po cichu zakończy działanie, jeśli wszystko jest w porządku i wyświetli komunikaty o błędach, jeśli pakietów nie można zbudować / skompilować.
Za każdym razem, gdy go
narzędzie instaluje pakiet lub plik binarny, instaluje również wszelkie posiadane zależności, więc uruchomienie go install
spowoduje również automatyczne zainstalowanie pakietów, od których zależy twój program (publicznie dostępne, pakiety „go gettable”).
Na początek przeczytaj oficjalną stronę Jak napisać kod Go .
Więcej informacji o go
narzędziu: Polecenie idź
Możesz również uzyskać dodatkową pomoc, uruchamiając następujące polecenie:
go help build
Warto również zauważyć, że począwszy od Go 1.5 go install
usuwa się również pliki wykonywalne utworzone przez go build
( źródło ):
Jeśli polecenie „go install” (bez argumentów, co oznacza bieżący katalog) powiedzie się, usuń plik wykonywalny napisany przez „go build”, jeśli jest obecny. Pozwala to uniknąć pozostawienia nieaktualnego pliku binarnego za ...
Aby uzupełnić listę, go run
kompiluje aplikację do folderu tymczasowego i uruchamia ten wykonywalny plik binarny. Po zamknięciu aplikacji prawidłowo czyści pliki tymczasowe.
Pytanie zainspirowane powieścią Dave'a Cheney'a What does go build build?
Na pakiet:
go build
: buduje twój pakiet, a następnie odrzuca wyniki
To nie będzie prawdą po Go 1.10 (Q1 2018), dzięki CL 68116 i CL 75473 . Zobacz ten wątek , do którego się tu odwołuję.
Co dokładnie robi polecenia
go build
igo install
buildZa każdym razem, gdy narzędzie go instaluje pakiet lub plik binarny, instaluje również wszelkie posiadane zależności, więc uruchomienie go install spowoduje również automatyczne zainstalowanie pakietów, od których zależy Twój program (dostępne publicznie, pakiety „go gettable”).
Właściwie ... go install
zmieni się również z Go 1.10, oprócz nowej pamięci podręcznej:
Polecenie „
go install
” nie instaluje już zależności nazwanych pakietów ( CL 75850 ).Jeśli uruchomisz „
go install foo
”, jedyną zainstalowaną rzeczą będziefoo
.Wcześniej było różnie. Jeśli zależności były nieaktualne, "
go install
" instalował również wszelkie zależności.
Niejawna instalacja zależności podczas "go install
" powodowała wiele zamieszania i bólu głowy dla użytkowników, ale wcześniej konieczne było włączenie kompilacji przyrostowych.
Nigdy więcej.
Uważamy, że nowainstall what I said
semantyka " " będzie dużo bardziej zrozumiała, zwłaszcza że z raportów o błędach jasno wynika, że wielu użytkowników już się ich spodziewało.
Aby wymusić instalację zależności podczas "go install
", użyj nowego "go install -i
" , analogicznie do "go build -i
" i "go test -i
".Fakt, że "
go install
" używany do instalowania wszelkich odbudowanych zależności powodował zamieszanie najczęściej w połączeniu z-a
, co oznacza "force rebuild of all dependencies
".
Teraz, "go install -a myprog
" wymusi całkowitą przebudowę wszystkich zależnościmyprog
, a takżemyprog
siebie, ale tylkomyprog
zostanie zainstalowany. (Wszystkie odbudowane zależności będą oczywiście nadal zapisywane w pamięci podręcznej kompilacji).
Sprawienie, by ten przypadek działał bardziej zrozumiale, jest szczególnie ważne w połączeniu z nową analizą nieaktualności opartej na zawartości, ponieważ widzi dobre powody, aby odbudować zależności częściej niż wcześniej. , co zwiększyłoby ilość zamieszania „dlaczego moje zależności zostały zainstalowane”.
Na przykład, jeśli uruchomisz „go install -gcflags=-N myprog
”, zainstalujemyprog
zbudowany bez optymalizacji kompilatora, ale nie instaluje już ponownie pakietówmyprog
używanych z biblioteki standardowej bez optymalizacji kompilatora.
go build
tak get
? Mam błąd kompilacji cannot find package "github.com/spf13/cobra" in any of:…
. Nie wiem, jak to powiedzieć, żeby to dostać. Czy muszę wyraźnie uzyskać?
go.mod
plik?
go version go1.11.4 linux/amd64
. Nie wiem o go.mod. Ponownie buduję https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, to dziwne, ponieważ właśnie zbudowałem cały pakiet i używam tego przykładu jako podstawy, i stworzyłem bardziej podstawową wersję, która działała (ale nie korzystam z tej biblioteki). Nie widzę, dlaczego nie został zainstalowany z pakietem wąsów.