我使用通用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
由于
答案 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
将其覆盖在顶部。