我正在尝试使用本地打包程序插件构建rpm,该插件包含由使用sbt 1.2.7的自定义文件处理任务生成的文件。
最初执行此操作的方式是在我的linuxPackageMapping更新之一中进行processFiles.value
调用
Rpm / linuxPackageMappings += {
val postDir = (Compile / processFiles / target).value
val pfiles = (Compile / processFiles).value
val profile = profileData.value
val myDir = postDir / "tango"
val files = myDir * "*" filter { _.isFile }
// Create packageMapping here
}
那很好,但是我注意到我实际上并没有使用pfiles
。我担心它已经运行了,所以填充了postDir
,但是由于我正在执行文件搜索以实际拉出所需的文件,因此在该位置(以及其他多个位置)似乎是多余的重复此模式的代码)。因此,我决定变得聪明,并将其重构为一个整体。更高级别的设置。
linuxPackageMappings := (linuxPackageMappings.dependsOn(Compile / processFiles)).value,
Rpm / linuxPackageMappings := ((Rpm / linuxPackageMappings).dependsOn(Compile / processFiles)).value,
根据我对文档的理解,这应该导致(Compile / processFiles)
在linuxPackageMappings
中发生任何事情之前运行。
我已经通过打印语句验证了这没有发生。在rpm:packageBin
之后运行clean
会导致生成RPM,但其中没有processFiles任务的输出。以上代码段中的files
变量为空。如果我随后重新运行同一任务,则新的RPM将具有输出。在rpm:packageBin
的第一次运行之后,手动检查进程输出目录会发现文件在那里。因此它被触发了,只是在过程中还不够快。
processFiles
任务确实使用FileFunction.cached
来防止它不必要地重新运行,但是其中没有任何显式线程(这可能导致它并行执行)。
我可以通过将对(Compile / processFiles).value
的调用重新粘贴到需要输出的所有linuxPackageMapping
调用中来解决此问题,但我希望任务图能够正常工作。