2016-12-08 3 views
1

Я хочу написать автономную программу clojure, которая будет обрабатывать все html-файлы в текущем рабочем каталоге.Где разместить файлы для обработки, если я хочу разработать автономную банку с clojure?

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

Если я использую вышеуказанный код, он работает, когда он упаковывается в виде банки. Но во время разработки, где я помещаю html-файлы? Внутри папки src/../core.clj? Я не проверяю, действительны ли файлы и т. Д. Поэтому, если я помещаю под src, он попытается также обработать файлы clj. Есть ли лучший способ без особых изменений в логике?

ответ

2

Это зависит от каталога, с которого вы запустили Java-процесс, выполнив код Clojure.

В случае выполнения REPL или кода или тестов с использованием инструмента построения (например, lein или boot) это верхний каталог вашего проекта (например, проект с project.clj или build.boot).

Вы также можете проверить его, зарегистрировав абсолютный путь "." Файл:

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

Как тестирования коды, работающие с файлами, это хорошая практика, чтобы параметризовать вашу функцию с аргументом базы каталогов и вызвать эту функцию либо с текущим каталогом (.) при вызове в качестве приложения (например, через функцию -main) или путем передачи каталога заглушки, подготовленного для тестирования. Вы можете настроить несколько тестовых каталогов, например, под test-resources в вашем проекте для разных тестовых сценариев (например, пустая директория, вложенные каталоги и т. Д.) И вызвать вашу функцию с помощью конкретной директории сценария в качестве аргумента.

+0

Да. Но есть ли способ изменить это? Должен ли я добавить другой путь, если он предназначен для разработки? – boring

+0

Я думаю, что лучше использовать переменную среды для обработки этого. Один путь для dev и другой для производства. И спасибо за ответ – boring

+0

@kadaj Я расширил свой ответ, чтобы предложить, как обрабатывать разницу в среде разработки и производства. –

2

Я бы предложил прочитать корневой каталог из командной строки с помощью.. в качестве значения по умолчанию:

(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] 
.....