2010-03-06 4 views
46

저는 Clojure를 처음 사용하고 있으며 응용 프로그램 구축을 실험하기 시작했습니다.Clojure 응용 프로그램 빌드 및 배포 모범 사례 : 좋은 자습서?

지금까지 Clojure 프로그램을 컴파일하는 방법에 대한 튜토리얼에 대한 모든 내용은 대화식 기능을 포함하고 있습니다. 예를 들어, "REPL을로드하고 실행하려면 (로드 파일"this-or-that ") 입력하십시오.이게 충분하지는 않지만 충분하지 않습니다.

저는 편집 편집 이디엄에 익숙합니다. C 또는 Delphi와 같은 언어를 사용하여 본능적으로 편집을 시작한 다음 "Mx compile"을 누르십시오.

"lein uberjar"는 "make"에 해당하는 것이 고통스럽게 느린 것입니다. 안녕하세요 세상에서도 실행할 수 있습니다. 따라서이 "대화 형 개발"기능이 어떻게 작동하는지 파악하고, 빠른 작성과 같이 uberjar 사용을 중단하고 하루가 끝날 때까지 저장해야합니다.

건물을 짓고있는 동안 눈치 채었던 또 다른 것은 (lein uberjar를 사용하여) 쇼핑몰 GUI 애플 리케이션 컴파일하는 동안 실행하는 것처럼 나는 컴파일 과정에서 프레임을 팝업에 일하고 있습니다. 그것은 나에게 조금 어긋나는 것 같습니다. 내가 생각했던 것처럼 "만드는"것과 상당히 유사하지는 않습니다.

저는 개발하는 Lisp 방식이 REPL에서 대화식으로 작동한다는 것을 알고 있습니다. 나는 그것을 바꾸려고하지 않고 있습니다. 나는이 삶의 방식에 적응하고 싶습니다. 불행히도, 나는 그렇게하는 방법에 대한 문서의 형태로 거의 보지 못했습니다. 예를 들어, 기계의 현재 상태를 재설정하는 방법. 일종의 재설정을 수행하지 않고도 개별 스 니펫을 즉석에서 컴파일하는 것은 지저분 해 보입니다.

일반적으로 Clojure (및 Lisp)에서 본 튜토리얼 대부분은 REPL의 해킹에 초점을 맞추는 것처럼 보입니다. 응용 프로그램 배포에 대한 모범 사례는 여전히 나에게 수수께끼입니다. 내 사용자는 단지 사용자가 될 것입니다. 그들은 REPL에 파일을로드 할 개발자가 될 수 없습니다.

그래서 여기 내 질문이 있습니다. 배포를 포함하여 Clojure 응용 프로그램을 빌드하는 전체 과정에 대한 유용한 정보 또는 자습서를 제공하는 리소스는 무엇입니까?

(참고 : 모든 필수 구성 요소가 설치되어 작동하고 있습니다 (예 : Emacs, Slime, Leiningen 등).이 점에 대해서는 질문하지 않습니다.)

답변

25

빠른 힌트, 다음 몇 가지 링크의 몇 :

개발하는 동안 lein uberjar를 사용하지 마십시오; lein jar을 선호합니다. 차이점은 lein uberjar은 모든 종속성을 생성 된 jar (Clojure 자체 포함)에 넣음으로써 단일 항아리가 내부에 앱이 포함 된 완전히 자체 포함 된 패키지라는 점입니다. lein jar은 자신의 코드 만 jar합니다. uberjar 접근 방식은 배포에 대한 명백한 이점이 있지만 개발을 위해서는 응용 프로그램을 실행할 때 적절한 클래스 경로를 사용하여 uberjar를 준비하는 데 필요한 시간을 절약 할 수 있어야합니다. 테스트 실행을 위해 클래스 경로를 직접 관리하지 않으려면 lein run plugin을 확인하십시오.

또한 대부분의 코드는 실제로 AOT로 컴파일되지 않아야합니다. AOT는 일부 Java interop 시나리오에서는 필요하지만 대부분의 경우 시작 속도가 약간 향상되고 Clojure의 다른 릴리스와의 바이너리 호환성 문제가 발생합니다. 후자의 문제는 uberjar -ed 독립 실행 형 응용 프로그램 종류와 관련이 없다고 생각되지만 모든 라이브러리 코드는 적어도 가능한 경우 JIT 화되도록 남겨 두어야합니다.Leiningen을 사용하면 :namespaces 절을 defproject 양식에 넣고 project.clj에 어떤 네임 스페이스를 컴파일할지 결정할 수 있습니다. 제외하는 항목은 현재 기본적으로 JIT 처리됩니다. Leiningen의 이전 버전은 기본적으로 모든 것을 컴파일하는 데 사용되었습니다. 실제로 업그레이드하는 것이 좋습니다!

컴파일하는 동안 윈도우가 튀어 나오는 것과 마찬가지로 매크로 확장 시간 동안 또는 함수 정의 나 이와 유사한 구조 외부에서 창 아웃 코드가 실행되고있는 것 같아요. (최상위 수준 인 (println "Foo!")과 같은 것입니다.) 스크립트로 코드를 실행할 계획이 아니라면 그렇게해서는 안되는 것입니다. 문제가 발생하지 않도록하려면 함수 정의에서 부작용 코드를 래핑하고 project.clj:main 절을 사용하여 응용 프로그램의 진입 점을 제공하십시오. (:main foo라고 말하면 foo 네임 스페이스의 -main 함수가 앱의 진입 점으로 사용됩니다. 어쨌든 기본적으로 위에 언급 한 lein run은 이름이 하드 코드 된 것 같습니다. 자체).

REPL의 상태를 재설정하는 방법은 다시 시작할 수 있습니다. SLIME을 사용하면 M-x slime-restart-inferior-lisp는 Emacs 세션의 다른 모든 상태를 유지하면서 그 작업을 수행 할 것입니다.

는 Clojure의 구글 그룹에 대한 이러한 논의 참조 :

  1. Clojure for system administration
  2. Prepping clojure for packaging (was: Re: Clojure for system administration)
  3. Leiningen, Clojure and libraries: what am I missing?
+0

정보 및 링크 주셔서 감사합니다! 그것이 도움이 될 것 같은 lein 실행 플러그인이 보인다. 물론 이것은 또 다른 질문으로 연결됩니다 : http://stackoverflow.com/questions/2393705/how-to-install-a-leiningen-plugin – kes

+0

여러분을 환영합니다! 그냥 새로운 질문에 너무 대답했다. :-) –

13

아니, 당신이 REPL에 기능을 입력하지 마십시오.

평소대로 소스 파일을 편집하십시오. Lisp의 장점은 시스템을 백그라운드에서 동시에 실행하는 것입니다. 따라서 소스 파일에서 개별 기능을 컴파일하여 실행중인 시스템에 넣거나 심지어 거기에 바꿀 수 있습니다.

점액을 사용하는 경우 소스 파일에서 C-c C-c을 눌러 지점에서 함수를 컴파일하고로드하십시오. 그런 다음 REPL로 전환하여 테스트하고 탐색 할 수 있지만 원본으로 유지하려는 것이면 소스 파일에 넣을 수 있습니다.

자습서는 일반적으로 REPL에 입력하는 것으로 시작합니다.이 설정을 많이 할 필요가 없기 때문에 실행중인 시스템과 소스 파일 관리를 통합해야합니다.


그냥 (나는 커먼 리스프를 사용하고 있지만, Clojure의이 유사하다), 내 일반적인 워크 플로우를 설명하기 위해 다음과 같이이다 :

  • 시작 이맥스
  • M-x slime 점액, 리스프 시스템을 시작, Swank via
  • , (명령) load-systemfoo 현재 프로젝트 (필요한 경우에만 컴파일)를로드하려면
  • 소스 버퍼
  • C-c ~-3210
  • C-x b 스위치 내 시스템은 백그라운드에서 실행으로 설정하고있어, 이제 소스 디렉토리 현재 디렉토리와 소스 패키지 REPL

의 현재 패키지합니다. 작업은 다음과 같습니다

  • 변경 또는 REPL에
  • 스위치를 컴파일하고 이미지에로드하는 함수 또는 클래스 정의
  • C-c C-c를 추가, 테스트
  • 디버그

이 있습니다 의미있는 컴파일이 멈추지 않습니다. 왜냐하면 결코 모든 것을 한 번에 컴파일하지 않고 개별 정의 만 작성하기 때문입니다.

+2

Lisp 소스 버퍼에서 REPL 버퍼로 전환하기위한'C-c C-z '도 있습니다. 일반적으로 SLIME 및 Paredit을 적절하게 활용하는 방법을 배우는 것이 최우선 과제입니다. 그런 다음 몇 가지 중요성은 있지만 여전히 중요하지만 유용한 것들이 많이 있습니다. ido-mode (또는 유사한 목적을 달성하기위한 것, 아마도 고드름이나 뭐든지). (Thanks for the edit, BTW!) –

+0

나는 slime selector를'C-c s '에 설정했는데, 이것은 좀 더 많은 버퍼 전환 옵션을 제공한다. – Svante