File 如何将特定文件拉入文件集中?

File 如何将特定文件拉入文件集中?,file,clojure,boot-clj,File,Clojure,Boot Clj,我正在编写一个库,该库使用GitHub存储库中我不拥有的文件: git init foo cd-foo git子模块添加https://github.com/KhronosGroup/Vulkan-Docs.git github/KhronosGroup/Vulkan Docs mkdir-p src/com/example/foo resources/com/example/foo 以下是foo中的另外两个相关文件 build.boot: (set-env! :resource-paths

我正在编写一个库,该库使用GitHub存储库中我不拥有的文件:

git init foo
cd-foo
git子模块添加https://github.com/KhronosGroup/Vulkan-Docs.git github/KhronosGroup/Vulkan Docs
mkdir-p src/com/example/foo resources/com/example/foo
以下是
foo
中的另外两个相关文件

build.boot

(set-env!
 :resource-paths #{"src" "resources"}
 :dependencies '[[adzerk/bootlaces "0.1.13" :scope "test"]])

(require '[adzerk.bootlaces :refer :all])

(deftask run [f function SYM sym]
  (with-pass-thru _
    (require (symbol (namespace function)))
    ((resolve function))))

(def +version+ "0.1.0-SNAPSHOT")

(bootlaces! +version+ :dont-modify-paths? true)

(task-options!
 pom {:project 'com.example/foo
      :version +version+})
src/com/example/foo/core.clj

(ns com.example.foo.core
  (:require [clojure.java.io :as io]))

(defn bar []
  (some-> "com/example/foo/spec.xml" io/resource slurp count prn))
我想要的是某种
add
任务,它允许我执行以下操作:

boot add--resource--从github/KhronosGroup/vukan Docs/src/spec/vk.xml--到com/example/foo/spec.xml run-f com.example.foo.core/bar
585128
我尝试使用的
-R
选项,但在我的用例中有两个问题:

  • 文件集中包含的文件比我想要的多得多(
    vk.xml
    ),这会使我的JAR变得太大
  • 因为
    -R
    只是简单地将目录添加到资源路径集中,所以它的所有内容都添加到顶层的文件集,这很容易破坏我自己的资源
  • 本质上,我想要的是与以下三个命令具有相同效果的命令,但实际上不涉及
    resources
    目录:

    cp github/KhronosGroup/Vulkan Docs/src/spec/vk.xml resources/com/example/foo/spec.xml
    启动构建jar
    rm resources/com/example/foo/spec.xml
    
    换句话说,
    com.example/foo
    JAR应该包含该XML文件作为资源,这样当我使用另一个项目中的
    com.example/foo
    时,该资源应该可用:

    boot-dcom.example/foo:0.1.0-SNAPSHOT repl
    

    如何将特定文件(例如,从Git子模块)作为资源拉入文件集中的特定位置,而不触及文件集中已有的任何文件?

    您不能将
    github/KhronosGroup/Vulkan Docs/src
    也作为资源路径吗?还是有很多无用的东西?@cfrick的问题与sift-R的问题完全相同:JAR膨胀和资源消耗。不难想象,在这种情况下,我希望从一个包含数十或数百兆字节其他内容的文件夹中获得一个资源。您是否尝试使用
    sift-R
    --include
    标志来指定与您的文件路径匹配的正则表达式?@PiotrekBzdyl,这将有相同的问题,即关闭现有资源,如果我没有弄错的话,
    --include
    将过滤掉除一个文件之外的所有内容,包括我的所有其他资源。@SamEstep我认为您将
    --include
    --invert
    混淆了。请看我的答案了解详情。
    (require '[com.example.foo.core :as foo])
    ;;=> nil
    
    (foo/bar)
    ;; 585128
    ;;=> nil