boot-clj: задача извлечь из набора файлов только определенную папку + переименовать ее

Рассмотрим проект Clojure с папкой ресурсов, которая содержит несколько файлов, и еще одну папку с именем «public», содержащую некоторый веб-контент.

Я ищу задачу загрузки, которая компилирует ClojureScript, а затем перемещает только общий каталог в другой каталог в глобальной файловой системе. Наконец, папку следует переименовать в «проект-версия».

Следующее не работает, так как move-files работает только с файлами, а не с каталогами. Тем не менее, я думаю, это проясняет идею:

(def project-name "My")
(def project-version "0.1.0")

(deftask store-web-dir []
  (let [dir-name (format "%s-%s" project-name project-version)]
    (comp
     (cljs :optimizations :advanced)
     (move-files :files {"public" dir-name})  ;; should rename the dir public to ..
     (copy :output-dir "/some/path/web_dirs"
           :matching #{(re-pattern (str "^" dir-name  "$"))}))))

После этого должна быть папка /some/path/web_dirs/My-0.1.0, в которой находится скомпилированная версия всех публичных файлов проекта.


person Anton Harald    schedule 15.08.2016    source источник
comment
boot использует собственную абстракцию файловой системы. Вы не должны использовать стандартные функции для работы с файлами. Взгляните на это sift задание.   -  person Piotrek Bzdyl    schedule 15.08.2016
comment
хороший совет, просеять выглядит как правильный инструмент здесь.   -  person Anton Harald    schedule 16.08.2016


Ответы (2)


sift и target могут вам помочь (boot sift -h).

Я делаю что-то похожее на то, что вы описываете здесь: https://github.com/timothypratley/voterx/blob/master/build.boot

(sift :invert true :include #{#"js/devcards.out" #"js/app\.out" #"\S+\.cljs\.edn"})
(target :dir #{"public"})

target помещает файлы в определенный выходной каталог, я уверен, что вы можете изменить его в зависимости от версии. Что-то вроде (str "public" +version+)

Таким образом, выполнение этого за пределами самой сборки cljs, вероятно, является билетом.

person Timothy Pratley    schedule 15.08.2016
comment
Как вы тестируете эти функции? На данный момент я всегда компилировал весь ClojureScript для каждого крошечного изменения в функциях. Может быть, есть задача, которая принимает содержимое папки (например, целевую папку после одной начальной компиляции) в качестве входных данных для набора файлов...? - person Anton Harald; 16.08.2016
comment
Я думаю, вы могли бы поместить файлы в каталог ресурсов по путям, которые, как вы ожидаете, cljs построили бы для набора файлов, и закомментировать задачу cljs. - person Timothy Pratley; 16.08.2016
comment
Я попробую это в следующий раз! - person Anton Harald; 16.08.2016

Вдохновленный комментариями и ответами, я опубликую то, что я сделал здесь:

(deftask only-public []
  (comp 
   (sift :include #{#"^public"})
   (sift :move {#"^public/(.*)$" "$1"})))


(deftask store-web-dir []
  (comp
   (cljs :optimizations :advanced)
   (only-public)
   (target :dir #{(format "/some/path/web_dirs/%s-%s"
                          project-name project-version)})))

Функции move-files и copy, которые я пытался использовать ранее, взяты из задач сообщества (загрузочное копирование и загрузочные файлы), однако похоже, что встроенная sift в сочетании с target гораздо более универсальна и идеально подходит для этого случая. .

person Anton Harald    schedule 15.08.2016