Jak skompilować program Go składający się z wielu plików?


88

Mam mały program składający się z trzech plików, wszystkie należące do tego samego pakietu (głównego), ale kiedy robię „przejdź do budowania main.go”, kompilacja się nie powiedzie. Gdy był to tylko jeden plik (main.go), wszystko działało dobrze. Teraz, gdy podjąłem trochę wysiłku, aby oddzielić kod, wygląda na to, że kompilator nie jest w stanie znaleźć rzeczy, które zostały wyjęte z main.go i umieszczone w tych dwóch innych plikach (które znajdują się w tym samym katalogu co main.go) . Co powoduje błędy „niezdefiniowanego typu”.

Jak skompilować ten program, który składa się z wielu plików?

Odpowiedzi:


86

Nowy sposób ( zalecane ):

Proszę spojrzeć na tę odpowiedź .

Stara droga:

Przypuśćmy, że piszesz program o nazwie myprog:

Umieść wszystkie swoje pliki w takim katalogu

myproject/go/src/myprog/xxx.go

Następnie dodaj myproject/godo GOPATH

I biegnij

go install myprog

W ten sposób będziesz mógł dodać inne pakiety i programy w myproject / go / src, jeśli chcesz.

Źródła: http://golang.org/doc/code.html

(ten dokument jest zawsze pomijany przez nowicjuszy i często początkowo źle rozumiany. Powinien otrzymać największą uwagę zespołu Go IMO)


5
dlaczego nie pozbyć się / go / i po prostu zrobić mójproject / src?
Alexander Mills,

zakładam również, że "go install myprog" w jakiś sposób zapisuje źródło projektu w lokalizacji $ GOPATH? Czy to prawda? jeśli tak, byłoby miło mieć to wyjaśnienie również jako część odpowiedzi
Alexander Mills,

1
@AlexanderMills Tylko małe projekty wykorzystują tylko jedną technologię.
Denys Séguret

2
@ DenysSéguret nie jestem pewien, czy się z tym zgadzam, ale i tak jest to dla prostych projektów, możesz po prostu zrezygnować z części do startu - ludzie mogą założyć, że coś jest konieczne, a tak nie jest. Mówisz mi, co jest prostsze, iść czy nie? :)
Alexander Mills

1
Nadal nie rozumiem, dlaczego ta struktura folderów?
Madeo

67

Na main.goprzykład more.go, gdy oddzielasz kod z do , po prostu przekazujesz ten plik do go build/ go run/ go install.

Więc jeśli wcześniej biegałeś

go build main.go

teraz po prostu

go build main.go more.go

Jako dalsze informacje:

go build --help

stwierdza:

Jeśli argumentami są lista plików .go, build traktuje je jako listę plików źródłowych określających pojedynczy pakiet.


Zauważ, że go buildi go installróżnią się od go runtego, że pierwsze dwa stany oczekują nazw pakietów jako argumentów, podczas gdy drugi oczekuje plików go . Jednak pierwsze dwa będą również akceptować pliki go, tak jak robi to go install.

Jeśli się zastanawiasz: build zrobi tylko buildpakiety / pliki, installutworzy obiekty i pliki binarne w twoim GOPATH, a także runskompiluje i uruchomi twój program.


6
Jeśli nie chcesz dodawać coraz więcej plików, użyj wyrażenia regularnego, z: go run * .go
NateW

ok dzięki, czy Go zawsze zapisuje tylko jeden plik wykonywalny? Czy nie oddziela plików wykonywalnych (jak w Javie)?
Alexander Mills,

@AlexanderMills, myślę, że z powodu okien używaj nix. lub przynajmniej mingw.
Sergey Gorlanov

tak, używałem MacOS, ale może to kurwa Bash w wersji 3, powinienem zaktualizować do Bash 4.
Alexander Mills,

30

Możesz też po prostu biec

go build

w folderze twojego projektu myproject / go / src / myprog

Następnie możesz po prostu wpisać

./myprog

do uruchamiania aplikacji


3
wynikiem jest obiekt go, a nie plik wykonywalny.
user2284570

@ user2284570 po prostu dodaj chmod +xuprawnienia do tego pliku, aby go uruchomić
dalmate

19

Od wersji 1.11+ GOPATH nie jest już zalecany, nowy sposób polega na wykorzystaniu modułów Go.

Powiedzmy, że piszesz program o nazwie simple:

  1. Utwórz katalog:

    mkdir simple
    cd simple
    
  2. Utwórz nowy moduł:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Umieść wszystkie swoje pliki w tym katalogu.

  4. Na koniec uruchom:

    go run .
    
  5. Alternatywnie możesz utworzyć program wykonywalny, budując go:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Aby uzyskać więcej informacji, możesz przeczytać to .

Go zawiera obsługę wersjonowanych modułów, jak zaproponowano tutaj od 1.11. Wstępny prototyp vgo został ogłoszony w lutym 2018 r. W lipcu 2018 r. Wersjonowane moduły wylądowały w głównym repozytorium Go. W Go 1.14 obsługa modułów jest uważana za gotową do użytku produkcyjnego, a wszyscy użytkownicy są zachęcani do migracji do modułów z innych systemów zarządzania zależnościami.


7

Możesz użyć

go build *.go 
go run *.go

oba będą działać również możesz użyć

go build .
go run .

5

To zależy od struktury Twojego projektu. Ale najprostsze jest:

go build ./... -o ./myproject

następnie biegnij ./myproject.

Załóżmy, że struktura projektu wygląda następująco

- hello
|- main.go

następnie po prostu przejdź do katalogu projektu i uruchom

go build -o ./myproject

następnie uruchom ./myprojectna powłoce.

lub

# most easiest; builds and run simultaneously
go run main.go

załóżmy, że twój główny plik jest zagnieżdżony w podkatalogu, takim jak cmd

- hello
|- cmd
 |- main.go

wtedy będziesz biec

go run cmd/main.go

3

Tak! To bardzo proste i właśnie wtedy do gry wkracza strategia pakietu. istnieją trzy sposoby, aby poznać moją wiedzę. struktura folderów:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 ostrzeżenie: adapter może zawierać tylko katalog główny pakietu i katalog Sun

  1. przejdź do folderu „adapter”. Biegać:
    go build main.go
  1. przejdź do folderu „adapter”. Biegać:
    go build main.go
  1. przejdź do GOPATH / src rozpoznaj ścieżkę względną do głównego pakietu, tutaj „mójproject / adapter”. Biegać:
    go build myproject/adapter

Plik exe zostanie utworzony w katalogu, w którym obecnie się znajdujesz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.