프로그래밍/Clojure

[Brave Clojure #2] leiningen은 한 물 갔고, deps.edn을 쓰자

김재택 2023. 12. 14. 19:00

 

deps.edn

  1챕터에서 clojure 프로젝트를 생성하고, 실행하고, 빌드하는 과정은 leiningen이라는 외부 프로그램을 이용합니다. 부록에서는 추가적으로 boot라는 프로그램도 알려주고 있습니다. 책을 쓰던 당시에는 거의 대부분의 사람이 liningen을 사용했고, boot라는 프로그램이 점점 인기를 얻고 있었던 것 같습니다.

 

  그러나 liningen과 boot의 차이점을 알아보기 위해서 검색을 좀 해봤는데, 여전히 liningen은 많은 사람들이 쓰고 있었지만 사용비중이 점차 줄어들고 있는 상황이고, boot는 거의 사라져버렸습니다. 대신해서 많은 사람들이 쓰고있고, 줄어드는 liningen 사용량의 원인이 되는 것이 바로 deps.edn입니다. deps.edn은 clojure 언어를 유지보수하는 곳에서 만드는 것 같습니다. 공식 가이드에 설명이 포함되어있거든요.

https://clojure.org/guides/deps_and_cli

 

Clojure - Deps and CLI Guide

You might decide to move part of this application into a library. The clj tool uses local coordinates to support projects that exist only on your local disk. Let’s extract the java-time parts of this application out into a library in a parallel directory

clojure.org

 

귀찮은 것 못참는 누군가는 만든다 : deps-new

  그러나 명령어 한 줄로 프로젝트의 스켈레톤을 떡하니 만들어주는 lein과 달리, 해당 가이드에서는 일일이 수작업으로 하는 방법을 설명합니다. 그럼 누군가는 귀찮으니까 lein과 같은 일을 하는 걸 만들지 않았을까요? 바로 deps-new 입니다.

https://github.com/seancorfield/deps-new

 

GitHub - seancorfield/deps-new: A new, simpler alternative to clj-new

A new, simpler alternative to clj-new. Contribute to seancorfield/deps-new development by creating an account on GitHub.

github.com

 

  deps-new를 설치하고 사용했더니 lein으로 소개된 책에 나온 동작들을 수행할 수 있었습니다.

 

프로젝트 생성하기

clj -Tnew app :name clojure-noob

  책에 나와있는 lein 명령어에 대응하는 프로젝트 생성 명령어입니다. 거의 유사한 느낌입니다. 실행결과 폴더구조는 아래와 같았습니다.

생성된 프로젝트 폴더 구조

 

  반면 clojure_noob.clj 파일의 내용은 다소 달랐는데 main함수 하나만 있는 lein과는 달리 main함수의 동작을 greet이라는 함수로 별도로 빼놓은 것을 확인할 수 있었습니다.

(ns clojure-noob.clojure-noob
  (:gen-class))

(defn greet
  "Callable entry point to the application."
  [data]
  (println (str "Hello, " (or (:name data) "World") "!")))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (greet {:name (first args)}))

 

프로젝트 실행하기

clj -M:run-m

  책의 "lein run"과 같은 역할을 합니다.

 

프로젝트 빌드하기

clj -T:build ci

  이 명령어로 빌드를 하면, uberjar는 "target/net.clojars.clojure-noob/clojure-noob-0.1.0-SNAPSHOT.jar" 경로에 생성됩니다. jar 실행 명령어에서 경로 부분을 적절히 바꿔주시면 jar파일도 문제없이 실행됩니다.

 

REPL

  repl의 경우 커맨드라인에서 책처럼 바로 clojure-noob.clojure-noob으로 실행되는 명령어는 찾지 못했습니다. 하지만 커맨드라인에서 직접 사용하기보다는 개발환경에서 주로 사용하게 될 것이라 넘어가기로 했습니다. (-main) 실행은 할 수 없지만, 다른 코드들은 "clj"명령어만 사용해서 실행된 REPL에서도 사용 가능합니다.