How to Uninstall Old GHC
How to Uninstall Old GHC
내문서에 `stack new my-haskell`이라고 입력하여 Haskell project를 생성하였다. 그러면 시스템 환경변수에 설정하였던 `STACK_ROOT`에 있는 `config.yaml` 파일에 미리 정해놓은 것처럼 `local-programs-path: D:\HaskellStack\programs` 폴더에 뭔가 잔뜩 오랜 시간에 걸쳐 설치가 된다. Emacs를 설치하고 Intero까지 설치하였다면, 꽤 오랫동안 멈추어 있는 Emacs 창에 당황스럽기까지 하다. 뭔가 화면에 출력되면서, 설치되는 progress라도 보여주면 좋을 텐데.
이렇게 내문서에 stack new 명령으로 만든 haskell project는 local project이다. 만일 그렇게 만든 Haskell project folder에서 stack build 명령을 실행하면, 이는 local project에 대한 haskell ghc등이 환경을 설치하는 것이다. Global 하게 설치하는 것이 아니다.
그러나 만일 stack new my-haskell 명령으로 새로운 haskell local project를 생성하지 않은 채, 그냥 도스창에서 stack ghci 라는 명령을 입력하였다고 어떻게 될까? 그런 경우에는 ghc를 비롯한 여러 가지를 global하게 설치를 해버리게 된다. 여기서 좀 성가신 문제가 생겨버린 경험에서 이 글을 쓰게 되었다.
처음 시스템 환경변수에 `STACK_ROOT` 항목을 만들고 그 내용으로 `D:\HaskellStack` 이라고 설정하였다. 그리고 그 폴더에 stack을 설치하였고, `D:\HaskellStack` 폴더에 `config.yaml` 파일을 새로 만들고 그 내용으로 `local-programs-path: D:\HaskellStack\program`이라고 입력한 후에 저장하였다 했다. 그 다음에 `stack ghci`를 실행하였더니, 시간이 꽤 오래 걸리면서 `D:\HaskellStack\program` 폴더에 gch를 비롯하여 mysys 등의 대용량 파일이 설치되었다. 좋다. 그리고 나서 도스창에서 `stack ghci`를 실행해보니 Haskell ghci repl이 잘 뜬다. 그리고 이는 global한 것임을 이미 알고 있다.
그런데 그 이후에 내문서에 Haskell project를 새로 생성하였다. `stack new my-haskell` 명령으로 말이다. 그런데 이 local project는 이미 설치한 global한 ghc를 사용하지 않고, 따로 ghc 버전을 설치하였다. global한 ghc는 8.0.2임에 반하여, 새로 local project를 만드니 새로 설치되는 ghc 버전은 8.4.2였던 것이다. 결국 `D:\HaskellStack\program` 폴더에는 두 가지 종류의 ghc가 쓸데없이 설치된 셈이 되었고, 그 용량은 거의 6기가에 달하게 된 거다. 이게 뭐란 말인가?
1. 이미 설치했던 global ghc를 local project에서도 그대로 사용할 수는 없는가? 굳이 버전이 다른 ghc를 globally and locally 하게 중복해서 깔아서 용량 6기가를 넘어버릴 이유가 있을까? 프로젝트에 특화된 버전의 ghc가 있다고는 하지만, 설치자가 뭘 선택할 수 있게 해놓아야 하지 않을까? global ghc가 최신 것이라면 그냥 그거 사용하고, 따로 local 설치하지 않으면 안 되나?
=> `stack new` command 로 새로운 project 를 만들 때, 가장 최신의 snapshot 을 설치하게 된다. 그러니 과거에 설치한 snapshot 의 버전이 현재 project 를 생성할 때보다 낮다면, 이제 두 가지 snapshot 모두가 설치되게 된다. 이는 하드 드라이브 낭비요, 불필요한 일이다. 이 문제는 쉽게 해결이 가능하다. 아예 새로운 project 를 생성할 때 snapshot 을 정해주는 방식으로 중복으로 여러 snapshot 이 PC 에 설치되는 것을 막을 수 있다. `stack.yaml` 파일을 열어보면 `resolver: lts-14.20` 부분이 나온다. 이게 바로 특정 snapshot 의 버전이다. 그러니 일단 `stack new` command 로 새로운 project 를 만들고, 그 `stack.yaml` 파일을 열어 원하는 버전의 snapshot 을 정해준 후에 `stack setup` 등의 명령으로 그 버전의 snapshot 을 설치하면 된다.
=> project 를 새롭게 만들 때, `stack new` command 에 option 을 주어 해결하는 방법도 있다. `stack new projectName --resolver lts-14.20` 명령으로 특정 버전의 snapshot 으로 새로운 project 를 생성하는 것이다. 또는 `stack build --resolver lts-14.20` 등으로 빌드할 때 특정 버전의 snapshot 을 사용할 수도 있다.
=> 그런데 이렇게 해도 Haskell 이 설치된 폴더에 여러 snapshot 들이 설치되어 있거나, 설치될 뻔 했던 흔적이 보일 수 있다. 무작위의 숫자와 문자로 만들어진 폴더들이다. 이는 `stack install hlint stylish-haskell` 처럼 새로운 module 을 설치할 때 발생하는 문제다. 마치 `stack new` 가 그랬듯이, `stack install` 명령 역시도 최신 버전의 module 을 설치하게 된다. 그런데 최신 버전이 PC 에 이미 설치된 Haskell snapshot 가 포함하는 버전의 module 과 다른 버전일 때다. 그러니 새로운 module 을 설치할 때도 내가 이미 PC 에 설치했던 Haskell snapshot 이 포함하는 버전의 module 이 무엇인지 버전 정보를 찾아서 그걸 설치해주어야 한다. `stack install hlin-0.0.0.0` 이렇게 해도 되겠지만, `stack.yaml` 파일의 `extra-deps` 부분에 필요한 module 들을 명시하여 한꺼번에 설치해주는 편이 편리하다.
2. 만일 Local project에서 보다 새로운 버전의 ghc를 설치하고자 한다면, 예전에 설치했던 global한 ghc를 지울 수는 없는가?
=> 지워도 되지만, 지우면 project 외의 폴더에서 GHCi 창을 띄우거나 하면, 다시 global-project 가 설치되게 된다. 아니면 깨끗하게 Haskell 이 설치된 폴더 모두를 지워버리고 다시 설치하는 방법이 있다. 시간이 꽤 오래 걸리지만.