Hoplon 시작 - Part1: Boot 버전

Hoplon은 Clojure와 ClojureScript로 작성할 수있는 풀 스택 웹 프레임 워크입니다. Clojure의 빌드 도구에는 Boot를 사용합니다. Boot에는 1.x계2.x계이 있지만 불행히도 역 호환되지 않습니다. 현재 Hoplon은 Boot 1에서 작동합니다. 버전 문제로 조금 끼워지지만 Clojure는 Scala만큼 소모되지 않습니다.

프로젝트



적절한 디렉토리에 Hoplon 용 프로젝트를 만듭니다.
$ cd ~/clojure_apps/
$ tree -L 1
.
├── Dockerfile
├── docker-compose.yml
└── m2

Dockerfile



빌드 도구는 Leiningen과 Boot의 1.x 시스템과 2.X 시스템을 설치합니다. Boot 명령은 각각 boot1boot2입니다. 기본적으로 Boot는 루트가 아닌 사용자가 권장하므로 Docker는 작업 사용자의 docker를 만듭니다.

~/clojure_apps/Dockerfile
FROM clojure
MAINTAINER Masato Shimizu <[email protected]>

WORKDIR /usr/src/app

ADD https://github.com/boot-clj/boot/releases/download/2.0.0/boot.sh /tmp/
RUN mv /tmp/boot.sh /usr/local/bin/boot2 && \
    chmod 755 /usr/local/bin/boot2

ADD https://clojars.org/repo/tailrecursion/boot/1.1.1/boot-1.1.1.jar /tmp/
RUN mv /tmp/boot-1.1.1.jar /usr/local/bin/boot1 && \
    chmod 755 /usr/local/bin/boot1

RUN adduser --disabled-password --gecos '' --uid 1000 docker && \
  mkdir /home/docker/.m2 && \
  chown -R docker:docker /usr/src/app /home/docker/.m2

VOLUME /home/docker/.m2
USER docker
RUN lein

Hoplon에서 사용하는 Boot 정보



Hoplon은 현재 Boot 1에서 작동합니다. Runtime Exception #41에 issue가 있습니다. 불행히도 Boot는 역 호환되지 않습니다. Boot2를 사용하면 java.lang.RuntimeException가 발생합니다.

docker-compose.yml



Docker Compose 설정 파일입니다. boot1 서비스는 Hoplon의 기본 8000 포트를 pots 지시문으로 지정합니다.

~/clojure_apps/docker-compose.yml
lein: &defaults
  image: clojure
  volumes:
    - .:/usr/src/app
    - ./m2:/home/docker/.m2
boot1:
  <<: *defaults
  entrypoint: ["boot1"]
  ports:
    - "8000:8000"

앱 만들기



Hoplon 앱의 빌드 도구는 Boot이지만 템플릿은 Leiningen을 사용합니다. 앱 이름은 spike-hoplon입니다.
$ lein new hoplon spike-hoplon

Docker Compose를 사용하는 경우 다음을 수행합니다.
$ docker-compose run --rm lein new hoplon spike-hoplon

Getting Started 설명과 구성이 다르지만 다음 디렉터리 구조가 만들어졌습니다.
$ cd ~/clojure_apps/spike-hoplon/
$ tree 
.
├── README.md
├── build.boot
└── src
    ├── index.cljs.hl
    └── main.inc.css

작성한 프로젝트는 docker-compose.yml의 working_dir에 지정합니다.

~/clojure_apps/docker-compose.yml
lein: &defaults
  image: clojure
  volumes:
    - .:/usr/src/app
    - ./m2:/home/docker/.m2
  working_dir: /usr/src/app/spike-hoplon
boot1:
  <<: *defaults
  entrypoint: ["boot1"]
  ports:
    - "8000:8000"

앱 시작



build.boot 파일에서 hoplon 버전은 6.0.0-alpha2입니다. 이 상태로 부팅하면 java.io.FileNotFoundException가 발생합니다. The getting started example doesn't seem to work. #64의 issue처럼 버전을 5.10.25로 낮춥니다.

~/clojure_apps/spike-hoplon/build.boot
...
  :dependencies '[[tailrecursion/boot.task   "2.2.4"]
                  [tailrecursion/hoplon      "5.10.25"]]
5.10.25project.clj은 다음과 같습니다.
(defproject tailrecursion/hoplon "5.10.25"
  :description  "Hoplon web development environment."
  :url          "http://github.com/tailrecursion/hoplon"
  :license      {:name "Eclipse Public License"
                 :url "http://www.eclipse.org/legal/epl-v10.html"}
  :plugins      [[lein-marginalia            "0.7.1"]]
  :dependencies [[io.hoplon.vendor/jquery    "1.8.2-0"]
                 [org.clojure/tools.reader   "0.8.5"]
                 [tailrecursion/javelin      "3.6.3"]
                 [tailrecursion/castra       "2.2.2"]
                 [clj-tagsoup                "0.3.0"]
                 [org.clojure/core.incubator "0.1.2"]
                 [org.clojure/clojurescript  "0.0-2234"]])

lein hoplon-template hoplon.clj을 읽고 build.boot 파일을 생성 할 때 tailrecursion/hoplon 버전을 설정합니다. 버전은 ancient-clj을 사용하여 Maven 리포지토리에서 최신 버전을 검색하는 것 같습니다.

hoplon.clj
(def deps
  '[tailrecursion/boot.core
    tailrecursion/boot.task
    tailrecursion/hoplon])

(defn latest-deps-strs [deps]
  (mapv #(latest-version-string! % {:snapshots? false}) deps))

Hoplon은 6.0.0-alpha1 에서 Boot 2 가 되어 새로운 형식의 build.boot 에 맞추어 디렉토리 구조도 바뀌고 있습니다. hoplon-template이 생성하는 build.boot는 Boot 1 형식이므로 빌드에 실패했습니다. lein의 hoplon-template을 사용하지 않는 것이 좋을 것 같습니다만, 처음이므로 이대로 Boot의 development 태스크를 실행해 Jetty를 기동해 보겠습니다.
$ boot1 development

Docker Compose run 명령을 사용하는 경우 --service-ports 플래그로 시작합니다.
$ docker-compose run --rm --service-ports boot1 development
Compiling Hoplon dependencies...
Jetty server stored in atom here: #'tailrecursion.boot.task.ring/server...
Compiling Hoplon pages...
• src/index.cljs.hl
Compiling ClojureScript...
2015-06-19 01:56:49.296:INFO:oejs.Server:jetty-7.6.8.v20121106
2015-06-19 01:56:49.369:INFO:oejs.AbstractConnector:Started [email protected]:8000
↳ Elapsed time: 27.392 sec › 00:01:19

브라우저에서 시작을 확인합니다.

좋은 웹페이지 즐겨찾기