Co znaczy go build build? (przejdź do budowania vs. przejdź do instalacji)

108

Nowi programiści Go często nie wiedzą lub są zdezorientowani, co robi podstawowe polecenie go build.

Czego dokładnie go buildi go installpolecenia budować i gdzie włożyli wynik / wyjścia?

icza
źródło

Odpowiedzi:

127

To, co gorobi 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 installbuilds, a następnie instaluje pakiet w twoim $GOPATH/pkgkatalogu.

Polecenia (pakiet main)

  • go build  buduje polecenie i pozostawia wynik w bieżącym katalogu roboczym .
  • go installbuduje polecenie w katalogu tymczasowym, a następnie przenosi je do $GOPATH/bin.

Co przekazać go build?

Możesz przekazywać pakiety do go buildpakietów, które chcesz zbudować. Możesz także przekazać listę .goplikó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 netpakietu 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.

Odnośnie modułów

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 gonarzędzie jest uruchamiane z folderu zawierającego go.modplik (lub jednego z elementów nadrzędnych bieżącego folderu), gonarzę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 gopolecenie 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 buildjako sprawdzenia, czy pakiety można zbudować (wraz z ich zależnościami), a go installtakż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 gonarzędzie instaluje pakiet lub plik binarny, instaluje również wszelkie posiadane zależności, więc uruchomienie go installspowoduje 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 gonarzę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 installusuwa 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 runkompiluje 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?

icza
źródło
1
wydaje się dziwne, że go install nie aktualizuje pliku wykonywalnego, jeśli jest identyczny z wcześniej zainstalowanym ... jakieś spostrzeżenia tutaj?
Scott Stensland
14

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 buildi go installbuild

Za 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 installzmieni się również z Go 1.10, oprócz nowej pamięci podręcznej:

Polecenie „ go installnie 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 nowa install what I saidsemantyka " " 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ści myprog, a także myprogsiebie, ale tylko myprogzostanie 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”, zainstalujemyprogzbudowany bez optymalizacji kompilatora, ale nie instaluje już ponownie pakietów myprogużywanych z biblioteki standardowej bez optymalizacji kompilatora.

VonC
źródło
Czy go buildtak 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ć?
ctrl-alt-delor
@ ctrl-alt-delor Z którą wersją Go? Czy Twój projekt zawiera go.modplik?
VonC,
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.
ctrl-alt-delor
@ ctrl-alt-delor, więc cobr jest sprzedawany na github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/… . Czy Twój GOPATH jest prawidłowo ustawiony?
VonC,
Odkryłem to, co już znalazłeś. Pakiet znajduje się w podkatalogu dostawcy: z tego powodu nie został zainstalowany. Jednak nie wiem, dlaczego nie instaluje go teraz w kompilacji. Albo jak korzystać z katalogu dostawcy (jeśli skopiuję go do mojego katalogu).
ctrl-alt-delor