Tag Archives: leiningen

Clojure 프로젝트 공유하기 (Gorilla REPL)

파이썬에 Jupyter가 있다면, 클로저에는 Gorilla REPL이 있다. 물론 Jupyter에도 클로저 커널을 올려서 사용할 수 있지만, 기본 REPL을 띄워서 연습하는 경우면 몰라도   project.clj에 dependencies나 기타 세팅을 포함한 프로젝트를 테스트하는데는 무리가 있다. 파이썬의 경우에는 virtual env에 세팅을 해버리면 그만이지만 클로저는 프로젝트 세팅을 참조해서 Leiningen REPL을 올려야 하기 때문이다.

물론 동적으로 의존성을 추가할 수 있는 라이브러리도 존재하긴 하지만 여전히 번거로운 작업이고, Jupyter나 Gorilla REPL과 같은 노트북 스타일을 사용하는 목적은 스크립트와 그 실행 결과를 Markdown 기반의 설명과 함께 공유하기 위함인데 노트북에 프로젝트 세팅하는 코드가 난무하는 것도 그리 바람직하지 못하다. 이런 면에서 클로저 프로젝트를 위해선 Jupyter보다는 Gorilla REPL을 사용하는 것이 그 목적에 더 부합하는 것 같다.

Gorilla REPL도 Jupyter와 유사하게 웹 UI상에서 클로저 코드를 실행하고 그 결과를 동적으로 렌더링해주며, Markdown 문법을 사용한 설명을 덧붙여 저장할 수 있는 기능을 제공한다.

이렇게 작성한 결과는 클로저 파일로 저장된다.

웹 UI 상에서 실행했던 코드와 결과들을 Gorilla REPL에서 정의한 notation들이 포함된 주석으로 감싸고 있다. 그런데 앞서 언급했듯이, 노트북 스타일의 결과물은 공유 기능이 상당히 중요한 부분 중 하나인데, Gorilla REPL의 웹 UI와 같이 HTML로 렌더링된 결과물을 공유하고자 할 때는 해당 프로젝트를 통째로 공유한 다음 다른 사용자가 Gorilla REPL을 띄워 확인하도록 해야 하는데 상당히 번거롭다. 공유 대상이 클로저 개발자라면 Gorilla REPL이 저장한 클로저 파일을 공유할 수도 있겠지만, 번잡스러운 주석이 걸리적거리는 것을 감수해야 한다.

Github에 프로젝트를 공개하는 경우 Jupyter 노트북의 저장 결과물인 ‘.ipynb’는 자동으로 렌더링되어 Markdown 형식으로 살펴볼 수 있지만 Gorilla REPL의 결과 클로저 파일은 렌더링되지 않기 때문에 변환과정을 거치는 수 밖에 없다. 다행히도 Gist에 Timothy Renner가 작성해둔 변환 코드가 공개되어 있길래, 이걸 조금 다듬어서 변환 프로젝트를 배포했는데, Gorilla REPL 기반의 프로젝트에 포함된 모든 노트북들을 한 번에 Markdown으로 변환해주는 프로젝트가 있으면 편리할 것 같아 아예 Leiningen 플러그인으로 배포해 보았다.

Gorilla REPL을 사용하는 프로젝트에  lein-gorildown 플러그인을 세팅하고 터미널에서   $ lein gorildown 을 실행해주면 Gorilla REPL 노트북만 골라내어 Markdown으로 변환해준다. 변환된 파일을 Github에 공유하거나 Markdown 뷰어를 사용하여 확인하면 되니 공유하기에도 편리하다.

Maven으로 Leiningen 프로젝트 패키징하기

클로저 프로젝트를 작성할 때 Leiningen을 사용할 때 느끼는 불편함은 일단 ‘느리다’가 첫번째 직면하게 되는 문제이고, 두번째는 아직 널리 사용되는 프로젝트 관리 모델이 아니다보니 클라우드 배포시에 Leiningen이 지원되지 않을 수 있다는 점이다.

결국 Leiningen이 참조하는 project.clj를 Maven용으로 pom.xml로 변환하는 작업이 필요한데, Leiningen은  lein pom 과 같은 옵션을 제공하고 있다. 그러나 필자가 테스트해본 결과에 의하면 그 결과가 썩 만족스럽지 않다. dependencies를 자동으로 작성해주고, project.clj에  :pom-plugins 를 추가해주면 해당 maven 플러그인 세팅을 해주는 정도의 노위 노가다 대체용 정도가 아니라면 결국 pom.xml을 직접 컨트롤 해줘야 하는 것 같다.

다양한 설정에 대해 테스트해 본 것은 아니지만 필자의 경우를 예로 들어보면, Luminus가 자동으로 생성해 준 project.clj를 대상으로 한   lein pom 결과로 얻은 pom.xml로 패키징( mvn package)을 해보면 (  :pom-plugins 를 설정하거나 pom.xml을 직접 수정하여 추가한 이후) jar파일이 성공적으로 생성되는 듯 하지만 다음과 같은 에러를 뱉어 버린다.

처음에는 executable jar 생성에 많이 사용되는 maven-share-plugin을 사용했는데 플러그인 세팅의 문제로 진입점을 찾지 못하는 것으로 생각하여 여러가지로 시도해보았지만 실패하고, maven-assembly-plugin도 사용하는 방법도 써봤지만 재미를 보지 못하다 결국 방법을 찾았다. (참고링크: http://www.elangocheran.com/blog/2015/12/compiling-a-leiningen-project-from-maven/)

exec-maven-plugin을 사용하여  lein uberjar 를 직접 실행하는 것처럼 강제하는 것. 당연히 배포 서버에는 Leiningen이 설치되어 있지 않은 것을 가정하고 있으니,  dependency에 Leiningen 라이브러리를 추가해주어야 한다.

플러그인 세팅은 다음과 같다.

가까스로 방법을 찾긴 했는데,   lein pom 에서 좀 깔끔하게 지원해줬으면 어땠을까 하는 아쉬움이 남는다.