【问题标题】:boot-clj: task to extract only certain folder from fileset + rename itboot-clj:从文件集中仅提取某些文件夹的任务+重命名它
【发布时间】:2016-08-15 20:00:48
【问题描述】:

考虑一个具有资源文件夹的 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,里面包含了项目所有公共文件的编译版本。

【问题讨论】:

  • boot 使用自己的文件系统抽象。您不应该使用标准函数来处理文件。看看是sift任务。
  • 好建议,这里的 sift 工具看起来很合适。

标签: clojure boot-clj


【解决方案1】:

sifttarget 可能会对您有所帮助 (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 构建本身之外执行它可能是票。

【讨论】:

  • 如何测试这些功能?目前,我总是为函数中的每一个微小变化编译整个 ClojureScript。是否有一项任务将文件夹的内容(例如,初始编译后的目标文件夹)作为文件集的输入...?
  • 我认为您可以将文件放在资源目录中您希望 cljs 为文件集构建它们的路径下并注释掉 cljs 任务。
  • 我下次试试这个!
【解决方案2】:

受到cmets和answers的启发,我将我采取的方式贴在这里:

(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-filescopy来自社区任务(引导复制和引导文件),但它看起来像内置的sift,结合@ 987654325@ 更通用,更适合这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多