여러 파일로 구성된 Go 프로그램을 컴파일하는 방법은 무엇입니까?


88

3 개의 파일로 구성된 작은 프로그램이 있는데 모두 같은 패키지 (main)에 속해 있지만 "go build main.go"를 수행하면 빌드가 성공하지 못합니다. 하나의 파일 (main.go)이었을 때 모든 것이 잘 작동했습니다. 이제 코드를 분리하기 위해 약간의 노력을 기울 였으므로 컴파일러가 main.go에서 가져온 항목을 찾아서이 두 개의 다른 파일 (main.go와 동일한 디렉토리에 있음)에 넣을 수없는 것 같습니다. . "정의되지 않은 '유형'"오류가 발생합니다.

여러 파일로 구성된이 프로그램을 어떻게 컴파일합니까?

답변:


86

새로운 방식 ( 권장 ) :

이 답변을 살펴보십시오 .

이전 방식 :

myprog라는 프로그램을 작성한다고 가정합니다.

다음과 같은 디렉토리에 모든 파일을 넣으십시오.

myproject/go/src/myprog/xxx.go

그런 다음 myproject/goGOPATH에 추가

그리고 실행

go install myprog

이렇게하면 원하는 경우 myproject / go / src에 다른 패키지와 프로그램을 추가 할 수 있습니다.

참조 : http://golang.org/doc/code.html

(이 문서는 신입생들이 항상 놓치고 있으며 처음에는 잘 이해하지 못하는 경우가 많습니다. Go 팀 IMO의 가장 큰 관심을 받아야합니다)


5
/ go /를 제거하고 myproject / src를 수행하는 이유는 무엇입니까?
Alexander Mills

또한 "go install myprog"가 어떻게 든 $ GOPATH 위치에 프로젝트 소스를 씁니까? 맞습니까? 그렇다면,뿐만 아니라 해답의 한 부분으로 그 설명을 가지고 좋은 것
알렉산더 밀스

1
@AlexanderMills 소규모 프로젝트에서만 하나의 기술 만 사용합니다.
Denys Séguret

2
@ DenysSéguret은 내가 그것에 동의하는지 확신하지 못하지만 어쨌든 이것은 간단한 프로젝트를위한 것입니다. 당신은 그냥 이동 부분을 떨어 뜨릴 수 있습니다. 좀 더 간단하다고 말씀해 주시겠습니까? :)
Alexander Mills

1
왜이 폴더 구조를 이해하지 못합니까?
Madeo

67

main.go예를 들어 에서 로 코드를 분리 할 때 more.go해당 파일을 go build/ go run/ go install로 전달하기 만하면 됩니다.

따라서 이전에 실행 한 경우

go build main.go

당신은 이제 단순히

go build main.go more.go

추가 정보 :

go build --help

상태 :

인수가 .go 파일 목록 인 경우 build는이를 단일 패키지를 지정하는 소스 파일 목록으로 취급합니다.


처음 두 상태는 패키지 이름 을 인수 로 예상 하는 반면 후자는 go files 를 기대한다는 점 go buildgo install다릅니다 . 그러나 처음 두 개는 go install과 마찬가지로 go 파일도 허용합니다.go run

궁금한 점이 있다면 빌드는 build패키지 / 파일 만 install생성하고 GOPATH에 개체 및 바이너리 파일을 생성 run하며 프로그램을 컴파일하고 실행합니다.


6
더 많은 파일을 계속 추가하지 않으려면 다음과 같이 정규식을 사용하십시오. go run *
.go

좋습니다. Go는 항상 실행 파일을 하나만 작성합니까? Java와 같이 실행 파일을 분리하여 보관하지 않습니까?
Alexander Mills

@AlexanderMills는 창 때문에 nix를 사용한다고 생각합니다. 또는 최소한 mingw.
Sergey Gorlanov 2011

네, 저는 MacOS를 사용하고 있었지만 Bash 버전 3이 망할 수도 있습니다. Bash 4로 업그레이드해야합니다.
Alexander Mills

30

당신은 또한 실행할 수 있습니다

go build

프로젝트 폴더 myproject / go / src / myprog

그런 다음 입력 할 수 있습니다.

./myprog

앱을 실행하려면


3
출력은 실행 파일이 아니라 go 객체입니다.
user2284570

user2284570 단지 추가 @ chmod +x해당 파일에 대한 권한은 그것을 실행
dalmate

19

Go 1.11 이상부터 GOPATH는 더 이상 권장되지 않으며 새로운 방법은 Go 모듈을 사용하는 것입니다.

다음과 같은 프로그램을 작성한다고 가정 해 보겠습니다 simple.

  1. 디렉토리 생성 :

    mkdir simple
    cd simple
    
  2. 새 모듈을 만듭니다.

    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. 모든 파일을 해당 디렉토리에 넣으십시오.

  4. 마지막으로 다음을 실행하십시오.

    go run .
    
  5. 또는 다음과 같이 빌드하여 실행 가능한 프로그램을 만들 수 있습니다.

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

더 많은 정보를 위해, 당신은 이것을 읽을 수 있습니다 .

Go는 1.11부터 여기에 제안 된 버전 모듈에 대한 지원을 포함했습니다. 초기 프로토 타입 vgo는 2018 년 2 월에 발표되었습니다. 2018 년 7 월에 버전이 지정된 모듈이 기본 Go 저장소에 저장되었습니다. Go 1.14에서 모듈 지원은 프로덕션 용으로 준비된 것으로 간주되며 모든 사용자는 다른 종속성 관리 시스템에서 모듈로 마이그레이션하는 것이 좋습니다.


7

당신이 사용할 수있는

go build *.go 
go run *.go

둘 다 작동합니다.

go build .
go run .

5

프로젝트 구조에 따라 다릅니다. 그러나 가장 간단합니다.

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

그런 다음 ./myproject.

프로젝트 구조가 다음과 같다고 가정합니다.

- hello
|- main.go

그런 다음 프로젝트 디렉토리로 이동하여

go build -o ./myproject

그런 다음 실행 ./myproject 쉘에서 .

또는

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

주 파일이 다음과 같은 하위 디렉토리에 중첩되어 있다고 가정합니다. cmd

- hello
|- cmd
 |- main.go

그럼 너는 달릴거야

go run cmd/main.go

3

예! 그것은 매우 간단하며 패키지 전략이 작동하는 곳입니다. 내 지식에는 세 가지 방법이 있습니다. 폴더 구조 :

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 경고 : 어댑터는 패키지 주 전용 및 sun 디렉토리를 포함 할 수 있습니다.

  1. "어댑터"폴더로 이동합니다. 운영:
    go build main.go
  1. "어댑터"폴더로 이동합니다. 운영:
    go build main.go
  1. GOPATH / src로 이동하여 main 패키지의 상대 경로를 인식합니다 (여기서는 "myproject / adapter"). 운영:
    go build myproject/adapter

exe 파일은 현재있는 디렉토리에 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.