본문 바로가기
코딩

Golang cmd 오류 $GOPATH/go.mod exists but should not

by 흥뷰자 2022. 7. 23.

go.mod exists but should not 에러 발생

git 에서 외부 패키지를 가져오려고 

go get 을 하는데 GOPATH/go.mod exists but should not 에러가 발생했다 

.mod 파일이 생성되어있어서 삭제도 해보았지만 동일 문제가 발생

 

문제 원인

구글링 결과 고패스와 동일한 곳에 mod파일이 생성되면 안된는 것

결국 고패스 설정이 잘못되어있어서 그런것이었고 

해결

폴더 생성부터 많이 꼬였기 때문에 그냥 작업파일을 새로 하나 만들고 환경변수 설정을 다시 해주었다.

gogo폴더 내부에 src pkg bin 

src 내부가 도메인이 되니까 거기 안에 다운로드 파일이나 나의 작업 폴더를 만들어서 쓰면 된다~~~ 

 

환경변수 고패스와 고루트

사용자 변수는 개별 사용자가 접근할 수 있는 고패스. - 사용자변수에는 내가 진행할 프로젝트 폴더 까지만 경로를 설정한다. 그 경로 안에는 패키지,빈,소스 폴더가 위치하게 된다. src 폴더 내에 프로젝트 폴더들이 위치한다. 폴더이름은 무엇이든 상관없지만 컴파일하려는 목적의 프로젝트인 경우 main.go 진입부가 꼭 있어야 한다. 

 

아래 시스템 변수는 모든 유저가 공통으로사용하는 고루트를 설정한다.

시스템 변수에는 프로그램이 설치된 경로에서 bin 까지 기입되어야 한다. ✍️✍️

bin directory :

유닉스같은 OS에서/ 시스템부팅,리페어등의 목적으로 최소의 기능을 얻기위해 실행프로그램을 포함하는 / 루트폴더의 표준 서브디렉토리

라고 되어있다. 프로그램이 운영체제에서 돌아가려면 루트내부에 빈까지 들어가야 한다는말로 이해하면 되나보다.

 

윈도우에서 zip으로 원하는 경로 (bin)폴더 내부에서 실행하면 거기가 루트경로가 되어야 하는것이고

MSI 로 설치하면 자동으로 경로설정이 된다고 (Program Files) 하는데 환경설정으로 가서 직접 확인해서 설정을 해야한다. 

환경변수 설정이 다 끝나면 명령프롬프트 창을 다시 시작해야 반영된다. 

 

 

폴더를 새로 만들고  VS Code로 해당 gogo폴더를 열어서  

go mod init github.com/lecture 초기화 

go get 깃허브패키지주소

깃허브에서 필요한 다른 패키지들도 다운하니까  

이렇게 하니까 go.mod 파일과 go.sum 파일이 src 아래에 생성된다

이게 맞는거갖다 

내가 애초에 원한건 github폴더 별로 정리하는 것이었는데  일단 프로그램이 잘 돌아가긴 한다. 😭😭

노드js나 파이썬은 내가 원하는 폴더 어디든지 프로젝트 만들어 실행할 수 있다. 원하는 패키지들을 아무 폴더에나 받고 그걸 package.json에서 적기만 하면 되는데 고는 그렇지 않다. 

고는 무조건 고패스 디렉토리에 위치해야 한다! 

고는 워크스페이스가 하나고 그 밑에 프로젝트들이 들어가게 된다.

 

go.mod 파일 : 외부 패키지파일을 관리하는 파일

 

고에서 폴더별로 관리 필요성

노드js 는 npm에서만 다운로드 받고 그걸 package.json 에서 정리하는데

파이썬은 pypi에서만 다운로드 받는데

 

고는 원하는 어디서든지 코드를 받을 수 있음 그래서 받은 코드 정리하는 파일별도로 없어서 폴더별로 보기 좋기 정리하는게 필요 (go modules라는게 있다는데 그게뭐? ..)

github

golang.org

google.golang.org

이런 분류를 해주고 내가 작업할 폴더는 깃허브 폴더 내 내 이름 내부에서 생성하고.

작업폴더 내에서 main.go 파일을 생성하고

내가 작업할 폴더에서 vs code 실행한다.

(폴더 이름이 main일 필요는 없군)

 

main.go라는 파일명은  프로젝트를 컴파일하려면 필수사항

package명이 main이라면 컴파일할거고, 서버를 시작하고, 사용할 수 있게 됨

라이브러리나 오픈소스의 경우 main.go를 쓰지않아도 됨 - package이름이 다른경우라면 컴파일되지 않음. 기능묶음이 되거나 

메인은 엔트리포인트다. - 컴파일러가 패키지 이름이 main와 그 내부에 func main을 찾음 

 

결론 

폴더별로 관리하는 작업과 go mod init은 충돌이 날 수 있는거같다. 폴더는 폴더별로 관리하려는거고, mod파일은 파일 내에서 패키지들을 관리하는거니까 당연한거가 싶기도하다. (정답은 못찾겠다)

내가 작업중인 폴더 경로까지 들어와서 go get을 하면 해당 부분에 pks src가 또 생성되고 src와 동등한 곳에 .mod 가 생성되더라. 이러면 pkg 내부에 또 pkg가 생성되는거고 문제가 발생하는것으로 보인다.

go init은 최상단 고루트 bin있는 곳직전에서 해주자. (폴더정리는 포기하는 방식)

 

go get명령전에 수행하는 go mod init은 내가 작업하는 src 내부가 아니라 src를 감싸고 있는 그 바로 윗폴더 경로에서 해주어야 한다고 느꼈다. 

그리고 go get은 폴더 경로를 정리한 경우라면 그냥 작업중인 폴더 경로에서 해도 되는 것이고, 

init을 한 경우라면 (== 폴더 경로를 정리하지 않은 상태로 ) go get은 폴더를 정리할 목적으로 만들었어도 해당 폴더로 다운로드 파일들이 들어가지 않더라. 

 

댓글