有没有一种简单的方法可以摆脱由于执行 SBT 构建而生成的所有内容?事实证明,它会在各处创建目标目录。表演
sbt clean clean-cache clean-lib clean-plugins
......并没有摆脱所有。
在我的 SBT 0.13.5 系统(Ubuntu Linux)和 Coursera 函数式编程课程中的一些项目上,由于所有缓存文件和重复的 Scala 下载,我发现 12 个项目的文件夹总计高达 2.1GB。
当前可以工作并清理几乎所有内容的 SBT 命令是:
sbt clean clean-files
这将删除顶级“target”和“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 中,您不会有那么多有用的命令行选项,例如路径名中没有星号通配符,但您始终可以尝试使用以下命令强制它:
rmdir /s /q target project/target project/project/target
我能做的最好的自动查找是一个 DIR 命令:
dir /ad /s /b | find "target"
显然,这对于在 Jenkins 等集成服务器上的可重现构建非常重要!
通过向 sbt 提供如下命令行参数,确保所有文件(包括 ivy 缓存)都存储在集成服务器工作区中:
-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy
然后单击 Jenkins 中的清除工作区按钮,或其他集成服务器中的等效项。那绝对应该这样做!
或者,如果您使用的是最新版本的 sbt 启动器脚本,您可以简单地添加-no-share
。
在 Linux 或类似系统上,这比 更好find -name
,因为它不会意外删除target
源代码中可能存在的任何名为的目录:
find . -regextype posix-awk -regex \.(/project)*/target -exec rm -r {} +
如果您在 shell 中运行此命令,则需要引用正则表达式,例如,对于 bash:
find . -regextype posix-awk -regex '\.(/project)*/target' -exec rm -r {} +
使用 BSD find(例如在 Mac OS X 上),命令将是:
find -E . -regex \.(/project)*/target -exec rm -r {} +
我同意建议的非常好的解决方案,我个人在 gnu make 任务中包含了一些细微的变化。
Makefile的内容:
clean:
find . -name target | xargs rm -fr
然后运行:
make clean
我喜欢使用 Makefiles 作为代码作为文档。