如何在“sbt dist”在目标/通用内部生成的脚本文件夹中包含一个附加文件?

Posted

技术标签:

【中文标题】如何在“sbt dist”在目标/通用内部生成的脚本文件夹中包含一个附加文件?【英文标题】:How can I include an additional file in the scripts folder that "sbt dist" generates inside target/universal? 【发布时间】:2018-09-08 23:30:52 【问题描述】:

运行 sbt dist 会产生如下所示的输出:

    project_dir 
  | 
  |--- target/universal
          |
          |
          |
          | --- scripts
          |        |
          |        |--- blah.bat
          |        |--- blah (.sh file)
          |
          | --- blah-1.0-SNAPSHOT.zip (entire package zipped)

如何复制文件以使其最终位于 target/universal/scripts 文件夹中?我尝试的任何“通用映射”技巧都会导致我复制的文件最终进入 zip。

一个不起作用的例子:

mappings in Universal ++=(baseDirectory.value / "scripts" * "*" get) map (x => x ->  x.setExecutable(true); baseDirectory.value.toString + "/test/" +  x.getName; )

【问题讨论】:

【参考方案1】:

如果我正确理解您的问题,您有两个问题。首先

我如何去复制一个文件,以便它在 target/universal/scripts 文件夹中结束

这很可能不是您想要的。 target/universal/scripts 文件夹只是一个临时文件夹,脚本是在压缩之前生成的。

你可以用几行scala在任意目录中创建文件

lazy val writeSomeFiles = taskKey[Seq[File]]("Creates some files")
writeSomeFiles := 
  // `target/universal` folder
  val universalTarget = (target in Universal).value

  val sourceFiles = (baseDirectory.value ** AllPassFilter).get
  val destFiles = sourceFiles.map(file =>  universalTarget / file.getNamae)

  IO.copy(sourceFiles.zipWith(destFiles))

  destFiles

见:https://www.scala-sbt.org/1.x/api/sbt/io/AllPassFilter$.html 见:https://www.scala-sbt.org/1.x/api/sbt/io/IO$.html

第二:

我尝试的任何“通用映射”技巧都会导致我正在复制的文件最终以 zip 结尾

这正是mappings in Universal 的含义。您创建的包的内容(在本例中为 zip 文件)。 dist(或universal:packageBin)任务只返回一个文件,即创建的zip文件。

如果您打算运送包裹,那么这是处理事情的正确方法。

希望有帮助, 渚

【讨论】:

感谢 Muki - 我尝试将其他脚本复制到脚本文件夹的原因是因为我需要一个脚本来解压缩包、更新符号链接并执行一些部署后活动。我希望这个脚本也受到源代码控制,并作为项目的一部分进行部署。

以上是关于如何在“sbt dist”在目标/通用内部生成的脚本文件夹中包含一个附加文件?的主要内容,如果未能解决你的问题,请参考以下文章

sbt dist在终端中工作但不与Jenkins一起作为shell脚本

从源文件生成目标文件的通用“make”规则

如何在while循环spritekit内部生成之前等待

多个子目录中目标文件的通用生成文件目标

通用生成文件显示没有生成目标错误的规则

Javascript如何实现GPU加速?