使用SBT从外部git存储库管理XML资源(在运行时需要)

时间:2017-06-06 15:48:01

标签: git scala resources sbt

我在SBT中有一个Scala项目,在运行时它需要访问一些XML文件,我想从git中获取并在构建时放入类路径。这些XML来自我无法控制的外部git存储库,因此我无法合并这两个存储库。

我看到SBT允许你添加unmanagedResourceDirectoriesmanagedResoureDirectories(不确定区别是什么),这允许你指示SBT将目录添加到类路径,但我不确定如何从git repo获取目录,而不是磁盘上的实际目录。

1 个答案:

答案 0 :(得分:1)

您可以使用JGit library在本地克隆repo,并使用archive命令将文件复制到repo之外。作为示例,请参阅sbt-hackling插件如何实现此目的。

如果您不需要平台独立性,可以通过调用命令行git命令并组合clone / fetch来更新依赖项,archive来提取文件

将一些路径复制出本地存储库的代码部分:

// needed for installSource
// maybe implement some archiver to go directly to files?
org.eclipse.jgit.archive.ArchiveFormats.registerAll()

def installSource(cachedRepo: Git, paths: Seq[String], revision: ObjectId, target: File): Set[File] =
    IO.withTemporaryFile(target.getName, ".zip") { tmp =>
    val out = new BufferedOutputStream(new FileOutputStream(tmp))

    cachedRepo
        .archive()
        .setFormat("zip")
        .setTree(revision)
        .setPaths(paths :_*)
        .setOutputStream(out)
        .call()

    IO.unzip(tmp, target)
    }

在本地克隆repo的部分代码:

def downloadGitRepo(local: File)(repo: URI): File = {

    val clone = Git
        .cloneRepository()
        .setURI(repo.toString)
        .setDirectory(local)
        .setBare(true)
        .call()

    assert(local.exists())

    local
}