SBT的IO.zip方法存在潜在缺陷?

时间:2012-01-25 13:57:09

标签: scala sbt

我正在制作一个SBT插件,我想要压缩一个目录。由于IO中的以下方法,这是可能的:

def zip(sources: Traversable[(File,String)], outputZip: File): Unit

在修改此方法之后,似乎只是简单地传递一个目录并期望生成的zip文件具有相同的文件&文件夹结构错误。传递目录(空或其他)会导致以下结果:

[error]...:zipper: java.util.zip.ZipException: ZIP file must have at least one entry

因此,似乎使用zip方法的方法是逐步浏览目录并将每个文件单独添加到Traversable对象。

假设我的理解是正确的,这让我觉得非常奇怪 - 很少用户需要选择要添加到档案中的内容。

对此有何想法?

3 个答案:

答案 0 :(得分:1)

好像你可以使用它来编写一个包含来自多个地方的文件的zip。我可以在构建系统中看到它的使用。

答案 1 :(得分:0)

聚会有点晚了,但这应该可以满足您的需求:

      val parentFolder: File = ???
      val folderName: String = ???
      val src: File = parentFolder / folderName
      val tgt: File = parentFolder / s"$folderName.zip"

      IO.zip(allSubpaths(src), tgt)

答案 2 :(得分:-1)

以下是使用sbt的IO类压缩目录的一些代码:

 IO.withTemporaryDirectory(base => {
    val dirToZip = new File(base, "lib")
    IO.createDirectory(dirToZip)
    IO.write(dirToZip / "test1", "test")
    IO.write(dirToZip / "test2", "test")

    val zip: File = base / ("test.zip")
    IO.zip(allSubpaths(dirToZip), zip)

    val out: File = base / "out"
    IO.createDirectory(out)
    IO.unzip(zip,out) mustEqual(Set(out /"test1", out  / "test2"))
    IO.delete((out **  "*").get)
    //Create  a  zip containing this  lib  directory but  under  a  different directory in the zip
    val finder: PathFinder = dirToZip ** "*" --- dirToZip //Remove dirToZip as you  can't  rebase a directory  to  itself
    IO.zip(finder x rebase(dirToZip, "newlib"), base / "rebased.zip")

    IO.createDirectory(out)
    IO.unzip(base  /  "rebased.zip",out) mustEqual(Set(out /"newlib"/"test1", out  / "newlib"/ "test2"))
  })

参见文档

http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Mapping-Files.html

http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Paths.html

有关创建要传递给IO.zip的Traversable对象的提示