## Go가 패키지를 관리하는 방법 (GOROOT / GOPATH)
### `GOROOT`
다음의 코드에서, `fmt` 패키지는 어디에서 가져오고 있는걸까?
```
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
```
정답은 GOROOT 아래의 `src` 디렉토리이다.
`go env` 명령어로 GOROOT 위치를 알 수 있으며,
이곳에는 fmt 외에도 log, net과 같이 기본적으로 제공하는 모듈들이 위치해 있다.
![go의 기본 모듈들](image/go-basic-module.png)
`import` 명령어는 지정된 디렉토리 내부에서 패키지를 찾는 명령어로, 그중에 `GOROOT/src`가 포함된다.
물론 `GOROOT`는 단순히 패키지 관리만을 하는 곳은 아니다. 오히려 일종의 SDK에 가깝다.
go를 실행하는 바이너리 파일과, 다른 환경(가령, [javascript와 같이 다른 언어로 된 프로젝트의 모듈로](https://m.blog.naver.com/sory1008/221794436126))에서 동작할 수 있게 하는 등의 다양한 라이브러리 등을 함께 포함한다. 그러므로 패키지를 추가하고 싶다고 해서 모든 go 프로젝트를 관할하는 `GOROOT/src`에 내가 원하는 패키지를 넣는 것은 그다지 바람직하지 않은 방법이다.
그렇다면 외부 패키지를 저장할 경로를 필요로 하는데, 그곳이 `GOPATH`이다.
---
### `GOPATH`
써드파티 패키지를 통해 `GOPATH`가 어떻게 동작하는지 확인해보도록 하자.
간단히 `HTTP status`에 따른 log를 출력하는 프로그램을 만들어볼 것이며,
[프로젝트](example/without-modules/main.go)
실행 방법
1. `go get -d "github.com/sirupsen/logrus"`로 logrus 모듈을 `GOPATH/src`에 설치한다.
## 그래서 왜 `go.mod`를 만들지 않으면 읽지 못하는 걸까?
여기에 서술할 내용
1. 일반적으로 상대 경로의 모듈은 어떻게 읽히는가?
2. Go에서는 패키지를 어떻게 읽는가?
3. Go.mod를 쓰지 않으면 어떻게 해결할 수 있는가?
4. 여기서 간단한 써드파티 패키지를 쓸 수 있는 프로젝트를 예시로 들어보자.
```
1. 의존성들을 추가함
2. 이 웹사이트가 몇 버전으로 유지되는지 확인함
3. spring에서 swagger 3.0이랑 2.x 버전 예시를 들기(ㅋㅋ)
```
---
1. url을 기준으로 패키지를 받아오는 go의 특성 (deno에서도 씀)
2. 다른 언어들은 어떤 식으로 패키지를 관리하는가?
3. go의 `bin`/`pkg`/`src` 디렉토리에 관하여
4. 이 방법의 문제점
5. 이거 어떻게 관리하는지
6. 그래서 어떤 식으로 써야하는지
## Go-modules의 이점
1. 버전 관리가 가능해짐
2. 모두가 동일한 환경에서 개발을 할 수 있어짐(가령 프로젝트를 github에 올렸을 때)
3. 위에서 나온 프로젝트를 go-modules로 개발해보기
4. 그리고 어떤 이점이 있는지 알아내기
---
## 참고 자료
'DEVELOPMENT > GO' 카테고리의 다른 글
Go 내장 함수 (0) | 2022.01.13 |
---|---|
go에서 외부 함수를 호출하는 방법 (0) | 2022.01.06 |