2

我使用通用 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

谢谢

4

2 回答 2

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

于 2014-11-12T12:28:42.347 回答
0

不幸的是,顶级目录的名称看起来与可分发 zip 的名称相同(请查看GitHub 上ZipHelper 源代码的第 24 行)。

因此,除非您想使其可配置并提交拉取请求,否则在命令行上修改生成的 zip 可能会更容易(假设某种 UNIX 风格):

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

这将new.zip与现有的 zipfile 一起创建 -mv如果您愿意,您可以将它放在顶部。

于 2014-11-12T00:17:19.843 回答