使用通用sbt-native-packager创建一个没有根目录的zip

时间:2014-11-11 12:03:15

标签: scala playframework sbt sbt-native-packager

我使用通用sbt-native-packager生成zip文件分发。

sbt universal:packageBin

生成的zip文件一旦被解压缩,就会包含名为我的zip文件的主目录中的所有内容:

unzip my-project-0.0.1.zip

my-project-0.0.1/bin
my-project-0.0.1/lib
my-project-0.0.1/conf
...

如何创建没有根文件夹的zip,以便在提取时它会有类似的结构?

bin
lib
conf

由于

2 个答案:

答案 0 :(得分:1)

我对sbt和scala没有足够的信心来提交拉取请求。 现在必须排除bash脚本,因此我现在(并且丑陋)的解决方案就是这个:

packageBin in Universal := { val originalFileName = (packageBin in Universal).value val (base, ext) = originalFileName.baseAndExt val newFileName = file(originalFileName.getParent) / (base + "_dist." + ext) val extractedFiles = IO.unzip(originalFileName,file(originalFileName.getParent)) val mappings: Set[(File, String)] = extractedFiles.map( f => (f, f.getAbsolutePath.substring(originalFileName.getParent.size + base.size + 2))) val binFiles = mappings.filter{ case (file, path) => path.startsWith("bin/")} for (f <- binFiles) f._1.setExecutable(true) ZipHelper.zip(mappings,newFileName) IO.move(newFileName, originalFileName) IO.delete(file(originalFileName.getParent + "/" + originalFileName.base)) originalFileName }

在github上提出的解决方案似乎比我更好,即使它对我来说也不起作用: https://github.com/sbt/sbt-native-packager/issues/276

答案 1 :(得分:0)

不幸的是,看起来该顶级目录的名称被修改为与可分发zip的名称相同(在GitHub上查看the ZipHelper source的第24行)。

因此,除非您想让它可配置并提交拉取请求,否则在命令行上修改生成的zip可能更容易(假设有一些UNIX版本):

unzip my-project-0.0.1.zip && cd my-project-0.0.1 && zip -r ../new.zip * && cd -

这将在现有的zipfile旁边创建new.zip - 如果愿意,您可以mv将其覆盖在顶部。