考虑一个带有资源文件夹的Clojure项目,其中包含一些文件和另一个名为"public"的文件夹,其中包含一些web内容。
我正在寻找一个启动任务,它编译ClojureScript,然后将公共目录移动到全局文件系统中的另一个目录。最后将文件夹重命名为project-version。
下面的命令不起作用,因为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
,其中包含项目所有公共文件的编译版本。
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构建本身之外做它可能是错误的。
受到评论和回答的启发,我将在这里发布我的方法:
(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
更通用,更适合这种情况。