2016-08-15 5 views
1

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

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

Следующие действия не работают, поскольку 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, которая содержит скомпилированные версии всех открытых файлов проекта.

+0

boot использует собственную файловую систему абстракции. Вы не должны использовать стандартные функции для обработки файлов. Взгляните на задачу 'sift'. –

+0

Хороший совет, просеивание выглядит как правильный инструмент здесь. –

ответ

1

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"}) 

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

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

+0

Как вы тестируете эти функции? На данный момент я всегда составлял весь ClojureScript для каждого крошечного изменения функций. Может быть, задача, которая занимает содержимое папки (например, целевую папку после одной начальной компиляции) в качестве ввода для набора файлов ...? –

+0

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

+0

Я попробую в следующий раз! –

1

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

(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, те, которые я пытался использовать прежде, приходят из задач сообщества (загрузки копии & boot-files), однако похоже, что встроенный sift в сочетании с target гораздо более общий и идеальный для этого случая.

 Смежные вопросы

  • Нет связанных вопросов^_^