一个简单的方法来摆脱由SBT产生的*一切*

有没有一种简单的方法来摆脱由于执行SBT构build而生成的所有东西? 事实certificate,它创build目标目录到处都是。 表演

sbt clean clean-cache clean-lib clean-plugins 

…并没有摆脱一切。

如果你使用git:

 git clean -f -d -x 

这将删除每个没有被git跟踪的文件。

在我使用SBT 0.13.5的系统(Ubuntu Linux)以及Coursera函数编程课程中的一些项目中,我发现由于所有的caching文件和Scala下载的重复,所有的文件夹总计高达2.1GB。

目前的SBT命令工作并得到几乎所有的清理是:

 sbt clean clean-files 

这将删除顶级“目标”和“lib_managed”文件夹(在这种情况下,从23MB下降到3.2MB),但在项目下留下了一些目标文件夹:

 ./project/project/project/target ./project/project/target ./project/target 

这是Linux find命令(也是由@ jack-oconnor发布)非常有用的地方:

 find . -name target -type d -exec rm -rf {} \; 

这使我们回到了我自己的项目中仅有的444KB,2.1GB降到了5.0MB!

在Windows中,你不会有许多有用的命令行选项,例如path名中没有星号通配符,但是你可以随时尝试强制:

 rmdir /s /q target project/target project/project/target 

我能做的最好的自动发现是一个DIR命令:

 dir /ad /s /b | find "target" 

显然,这对于在Jenkins等集成服务器上进行可重复构build非常重要!

确保所有文件( 包括常青藤高速caching )都存储在集成服务器工作区中,方法是将以下命令行参数提供给sbt:

 -Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy 

然后单击Jenkins中的“擦除工作区”button或其他集成服务器中的等效工具。 这绝对应该做到这一点!

或者,如果您使用的是sbt启动脚本的最新版本,则可以简单地添加-no-share

在Linux或类似的地方,这比find -name更好,因为它不会意外地删除可能存在于源代码中的任何名为target目录:

 find . -regextype posix-awk -regex \.(/project)*/target -exec rm -r {} + 

如果您在shell中运行此命令,则需要引用正则expression式,例如,对于bash:

 find . -regextype posix-awk -regex '\.(/project)*/target' -exec rm -r {} + 

findBSD(例如在Mac OS X上)命令将是:

 find -E . -regex \.(/project)*/target -exec rm -r {} +