loading...

Mac, Linux 에서 vscode 하스켈 개발환경 세팅하기 업데이트(2020-04-22)

ingun37 profile image Ingun 전인건 Updated on ・2 min read

Haskell-Ide-Engine (이하 hie) 이라는 language server를 이용한 Visual studio code 에서의 haskell 개발환경 구축 방법을 알려드릴게요.

해당 깃헙 페이지의 README를 보시면 아시겠지만 가독성이 좋지 않아요. 독자들이 Nix, Ghc, language server 컨셉 등을 이미 안다고 가정하고 쓰여진 것 같아요. 따라서 제가 필요한 부분만 간추려서 정리해 보려고 해요.

HIE 가 무엇?

haskell-ide-engine 의 약자에요. Visual studio code, atom, emacs 등의 많은 에디터에서 하스켈 IntelliSense를 쓸 수 있게 해줘요.

왜 HIE 를 써야 하나?

표준이 정해지지 않은 현재 하스켈 세상에서 가장 큰 커뮤니티와 완성도를 자랑하는 IntelliSense 이기 때문이에요.

HIE 설치가 그렇게 어려워? 그냥 Visual studio code 플러그인 깔면 되는거 아니야?

현재 Visual studio code 마켓에 올라와 있는 hie 는 이미 language server 가 외부에 구축돼있다는 가정하에 쓰는 플러그인이에요. language client 역할이라고 볼 수 있죠. 고로 서버는 직접 설치해야 해요.

다른방법?

오픈소스 중에선 IntelliJ 플러그인 이 있어요. 설치가 복잡한 hie 에 비해 설치가 매우 간단하다는 장점이 있죠. 만약 IntelliJ 를 선호한다면 좋은 차선책이에요.

설치

hie 깃헙 페이지 README 를 보시면 세가지 설치 방법을 안내하고있어요.

  • Nix 패키지 매니저를 이용한 설치 – 우리가 사용할 방법이에요
  • ArchLinux 유저를 위한 설치 – 생략
  • source-code 에서 바로 빌드 – 비추천이에요. source-code 에서 바로 빌드해서 설치해보시면 알겠지만 반나절이 걸려요. 용량도 굉장히 많이 차지해요. 게다가 괜히 패키지 매니저를 이용하는게 아니죠. 빌드가 완료되면 ~/.cargo 라는 stack 의 binary path 에 빌드가 되는데 이거땜에또 PATH관리하는것도 일이고, 업데이트 한번 하려면 또다시 반나절동안 빌드하고 앉아있어야 하잖아요?고로 우리는 Nix 라는 패키지 매니저를 이용해서 빌드할거에요.

Nix란?

Nix를 못들어보셨다면 homebrew, apt와 같은 패키지 매니저라고만 알고 넘어가도 돼요.

Nix 로 hie 설치하기

linux나 Mac OS 기준으로 설명할게요. 윈도우즈는 따로 Nix 홈페이지에서 설치 가이드를 참조하세요.

Nix 설치 스크립트에요

curl https://nixos.org/nix/install | sh

이제 Cachix 를 설치할거에요

Cachix 는 또 뭐야?

개발자가 만든 Nix 패키지 빌드 캐시를 호스팅하는 사이트에요. 설치 시간을 단축시켜줄거에요.

Cachix 설치

nix-env -iA cachix -f https://cachix.org/api/v1/install

hie cache 인덱스 추가

cachix use all-hies

GHC 버전 알아놓기

진행하기전에 stack 이 안깔려있다면 먼저 깔아주세요.

hie를 설치할 때 하나 이상의 ghc 버전을 알려줘야 해요. 모든 ghc 버전과 호환되게 설치할 수도 있지만 용량이 30GB(압축하면 10GB) 를 차지해요. 어차피 ghc는 일반적으로 하나의 버전만 사용하므로 버전을 알려주는게 좋아요.

일반적으로 GHC는 Stack(이하 스택) 으로 관리되고 있어요. 스택 으로 생성된 기존 하스켈 프로젝트가 있다면 터미널상에서 해당 프로젝트 경로로 가서 다음 명령어로 알 수 있어요

stack ghc -- --version

여기서 주의할점이 몇가지 있어요. 바로 업데이트 주기에요. GHC 가 가장 빠르게 업데이트 되고, 그다음으로 최신 GHC를 지원하는 스택이 업데이트 되고, 가장 느리게 HIE가 업데이트 돼요. 예를들어 글을 쓰고있는 현재 최신 GHC는 8.8.3 이고, 스택도 8.8.3 을 지원하지만 HIE는 8.8.2 까지만 지원하고 있어요. 그래서 만약 이런 상황에서 최신 스택을 쓰고 있다면 단순히 stack new <project name> 로 만든 프로젝트엔 HIE 를 쓸 수 없겠죠? 이런 상황에서는 스택 프로젝트의 resolver 를 통해 프로젝트를 만들때, 혹은 만든 후에 GHC 버전을 바꿔줘야 해요. Stackage를 참고해서 알맞는 버전을 알 수 있어요. 예를들어 GHC 8.8.2 쓰고싶다면 이 버전으로 컴파일 된 가장 최신 LTS 하스켈 패키지 15.3 를 프로젝트를 만드는 시점에 명시해주거나

stack new --resolver=lts-15.3

기존 프로젝트의 stack.yaml 에서 바꿔줘야해요.

Nix 를 이용한 hie 설치

다음 명령어로 설치해요.

nix-env -iA selection --arg selector 'p: { inherit (p) ghc882 ghc865; }' -f https://github.com/infinisil/all-hies/tarball/master

ghc882, ghc865 처럼 ghc 버전을 명시해주는것에 주의해주세요. 뒤에 붙는 깃헙 주소는 Nix package 명세에요. 이제 위에서 설정한 Cachix 에서 호스팅되는 language server 바이너리 캐시들이 Nix 의 PATH 에 설치가 될거에요.

Visual studio code 와 연결하기

Visual studio code로 하스켈 프로젝트를 열어봅시다. 하스켈 프로젝트가 없다면 새로 만듭시다.

stack new hie-test

hie 플러그인을 설치하세요.

플러그인 설정으로 들어가세요.(Command⌘ + ,)

Hie Executable Path 에 hie 경로를 입력하세요. 위 단계를 잘 따랐다면 자동으로 .nix-profile/bin/hie로 등록이 돼있을거에요.

Alt Text

아무것도 써져있지 않더라도 자동으로 PATH 에 있는 hie 를 쓰므로 which hie같은 명령어로 확인 한번만 해주시면 돼요.

hie 와 ghc의 버전이 일치하지 않으면 The Haskell HIE server crashed 5 times in the last 3 minutes 라는 에러가 날 수도 있어요.

Could not obtain flags for: "test/Spec.hs"와같은 에러가 날 수도 있어요 관련 thread1 관련 thread2 를 보시면 아시겠지만 최초 빌드 관련 문제니 stack build --test --no-run-tests 명령어 한번 실행시켜 주고 vscode 를 reload 한번 해주세요. 만약 이 방법으로도 해결이 안되면 hie.yaml 로 프로젝트 구조를 직접 명시를 해주는 방법이 있어요. 2번째 쓰레드를 보시면 방법이 나와 있어요.

이제 putStrLn 에 마우스를 올려보면 다음과같이 IntelliSense 가 작동하는것을 확인할 수 있습니다.

Alt Text

Posted on by:

ingun37 profile

Ingun 전인건

@ingun37

🇰🇷Developer/Mathematics Enthusiast

Discussion

markdown guide