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?
Odpowiedzi:
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.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.
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?
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 buildigo installbuildZa 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 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 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ścimyprog, a takżemyprogsiebie, ale tylkomyprogzostanie 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ówmyprogużywanych z biblioteki standardowej bez optymalizacji kompilatora.
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ć?
go.modplik?
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.