Jaka jest różnica między Zarażenie i Zakażenie?

83

Po dłuższej zabawie z gonarzędziem wygląda to tak go get:

  1. (opcjonalnie) pliki do pobrania,
  2. kompiluje,
  3. i instaluje

kawałek oprogramowania, a jednocześnie go installpo prostu

  1. kompiluje
  2. i instaluje

to. W takim przypadku, dlaczego go installpolecenie istnieje, skoro go getje zastępuje?

thiagowfx
źródło

Odpowiedzi:

79

go installjest częścią przepływu pracy podczas pracy lokalnej. Załóżmy, że chcesz skorzystać z biblioteki, ale z jakiegoś powodu wymagana jest zmiana. Ty byś zrobił:

  • go get -d library, który tylko go pobiera;
  • wprowadzić zmiany w pobranym pakiecie;
  • go install library aby zainstalować wersję lokalną.

O ile wiem, go getnie ma flag wskazujących, że nie powinien pobierać, więc nie można go go installtutaj zastąpić .

Ten sam przepływ pracy jest używany podczas tworzenia nowego pakietu od podstaw.

BoppreH
źródło
1
Świetnie, myślę, że teraz rozumiem dzięki twojemu pierwszemu przykładowi. Jednak w twoim drugim (tworzenie nowego pakietu od podstaw) też bym mógł użyć go get ./path/to/local_packagei zachowywałby się tak samo, jak gdybym używał go install ./path/to/local_package, prawda? Ponieważ w tym przypadku nie ma procesu pobierania.
thiagowfx
go installsprawia, że ​​twój cel jest bardziej wyraźny, ale przypuszczam, że oba osiągną to samo. Testowałem z kilkoma pakietami, w tym zadeklarowanymi jako maini wydawały się równoważne. W dokumentach bardzo brakuje tego polecenia.
BoppreH
Tutaj jest napisane, że potrzebujesz gcc, go getale nie go install. Jak to się ma do tego opisu?
AndreKR
3
Nie zgadzam się z tą odpowiedzią. Możesz użyć go getzamiast go installw trzecim punkcie, ponieważ go getnie spowoduje to ponownego pobrania biblioteki (chyba że dodasz -u). Możesz również użyć go getpodczas pisania biblioteki od zera. go installwydaje się całkowicie zbędny.
Simon
34

go get wykonuje dwie główne czynności w tej kolejności:

  • pobiera i zapisuje w $GOPATH/src/<import-path>pakietach (kod źródłowy) nazwanych w ścieżkach importu, wraz z ich zależnościami, a następnie

  • wykonuje go install

-dFlag ( go get -d) nakazuje go get, aby zatrzymać po pobraniu pakietów; to znaczy nakazuje, go getaby tego nie robićgo install


różnica:

go get // sprawdź, czy pakiety muszą zostać pobrane, w razie potrzeby pobierz, a następnie skompiluj

go install // pomiń część z pobieraniem pakietów, po prostu skompiluj (spowoduje to błąd, jeśli brakuje jakichkolwiek pakietów)


o GOPATHzmiennej środowiskowej

GOPATHZmienna jest używana przez narzędzia Go. To musi być ustawiony, aby móc get, buildi installopakowań, a to określa położenie obszaru roboczego. Jest to prawdopodobnie jedyna zmienna środowiskowa, którą musisz ustawić podczas tworzenia kodu Go.

Ponownie, GOPATHnie powinno wskazywać na instalację Go, ale raczej na twój obszar roboczy.

Na przykład w systemie Windows, jeśli zdecydujesz, że twój obszar roboczy jest c:\gowork\ustawiony na , będziesz musiał ustawić GOPATHwartość jakoc:\gowork

wprowadź opis obrazu tutaj

Twój kod źródłowy powinien znajdować się w, c:\gowork\src\<some project folder>\a po uruchomieniu go getw wierszu polecenia z wewnątrz c:\gowork\src\<some project folder>\zobaczysz c:\gowork\bin\i c:\gowork\pkg\zostanie utworzony.

Alex Baban
źródło
go installpobiera pakiet w konfiguracji uwzględniającej moduły.
Berkant Ipek
2

Zwróć uwagę, że wersja 1.16 (Q1 2021) sprawi, że różnica będzie wyraźniejsza, zaimplementowana w CL 266360 jako część wydania 40276 :

go installteraz akceptuje argumenty z sufiksami wersji (na przykład go install example.com/[email protected]).
Powoduje go installto budowanie i instalowanie pakietów w trybie obsługi modułów , ignorując go.modplik w katalogu bieżącym lub w dowolnym katalogu nadrzędnym, jeśli taki istnieje.
Jest to przydatne do instalowania plików wykonywalnych bez wpływu na zależności modułu głównego .

go install, z przyrostkiem wersji lub bez (jak opisano powyżej), jest teraz zalecanym sposobem budowania i instalowania pakietów w trybie modułu.

go getpowinien być używany z -dflagą, aby dostosować zależności bieżącego modułu bez budowania pakietów, a używanie go getdo budowania i instalowania pakietów jest przestarzałe .
W przyszłej wersji -dflaga będzie zawsze włączona .

VonC
źródło
może po prostu nie znam powodu tego ... ale nie rozumiem, dlaczego miałbyś chcieć wyłączyć pojedyncze polecenie kompilacji / instalacji. różni się od innych menedżerów pakietów, których widziałem
Trevor Jex
@TrevorJex ponownego czytania github.com/golang/go/issues/40276 , nadal jest pojedynczą build / polecenie install: go install. I robi to, instalując pakiety w określonych wersjach, niezależnie od bieżącego kontekstu modułu. To poprawka w porównaniu do starego go get.
VonC