2016-12-08 4 views
1

현재 작업 디렉토리 아래에있는 모든 html 파일을 처리 할 독립형 clojure 프로그램을 작성하려고합니다.clojure를 사용하여 독립 실행 형 jar를 개발하려면 처리 할 파일을 어디에 배치해야합니까?

(println file-seq (io/file ".")) 

위의 코드를 사용하면 병으로 포장했을 때 작동합니다. 그러나 개발 중에는 html 파일을 어디에 두어야합니까? src/../core.clj 폴더 안에 있습니까? 나는 파일들이 유효한지 검사하지 않을 것입니다. 그래서 만약 내가 src 아래에 위치한다면, 파일을 처리하려고 시도 할 것입니다. clj 파일들도 마찬가지입니다. 논리를 많이 바꾸지 않고 더 좋은 방법이 있습니까?

답변

2

Clojure 코드를 실행하는 Java 프로세스를 시작한 디렉토리에 따라 다릅니다.

빌드 도구 (예 : lein 또는 boot)를 사용하여 REPL 또는 코드를 실행하거나 테스트하는 경우 프로젝트의 최상위 디렉토리입니다 (예 : project.clj 또는 build.boot가있는 디렉토리).

"."의 절대 경로를 로깅하여 확인할 수도 있습니다. 파일 :

(println (.getAbsolutePath (io/file "."))) 

파일에서 작동하는가 (응용 프로그램으로 불리는 현재 디렉토리 (.)과 중 해당 기능을 기본 디렉토리 인수 함수를 parametrise 및 통화 할 수있는 좋은 방법입니다 코드의 테스트에 관해서 예 : -main 함수를 통해) 테스트를 위해 준비된 스텁 디렉토리를 전달합니다. 서로 다른 테스트 시나리오 (예 : 빈 디렉토리, 중첩 된 디렉토리 등)에 대해 프로젝트에서 test-resources 아래의 여러 테스트 디렉토리를 구성하고 특정 시나리오 디렉토리를 인수로 사용하여 함수를 호출 할 수 있습니다.

+0

예. 그러나 그것을 바꾸는 방법이 있습니까? 개발을 위해 다른 경로를 추가해야합니까? – boring

+0

이것을 처리하기 위해 환경 변수를 사용하는 것이 더 좋을 것이라고 생각합니다. dev에 대한 경로와 생산을위한 경로. 그리고 응답을 주셔서 감사합니다 – boring

+0

@ kadaj 제가 개발 및 생산 환경의 차이를 처리하는 방법을 제안하는 내 대답을 연장했습니다. –

2

명령 줄에서 "dir"을 사용하여 루트 디렉토리를 읽는 것이 좋습니다. 기본값 :

(ns clj.core 
    (:require 
    [clojure.java.io :as io] 
) 
    (:gen-class)) 

(defn -main [& args] 
    (let [search-path (or (first args) ".") 
     file-seq (file-seq (io/file search-path)) 
     ] 
    (doseq [curr-file file-seq] 
     (println curr-file)))) 

~/clj > lein run src  # search-path => "src" 
#object[java.io.File 0x5adc71e7 src] 
#object[java.io.File 0x7fc5a558 src/clj] 
#object[java.io.File 0x42fd8f2f src/clj/.core.clj.swp] 
#object[java.io.File 0x7eea934d src/clj/core.clj] 

~/clj > lein run  # search-path => "." 
#object[java.io.File 0x1fc4483f .] 
#object[java.io.File 0x1d7af82 ./README.md] 
#object[java.io.File 0x5adc71e7 ./.lein-failures] 
#object[java.io.File 0x7fc5a558 ./project.clj] 
.....