Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

An easy way to get rid of *everything* generated by SBT?

Tags:

scala

sbt

Is there an easy way to get rid of everything getting generated as a result of performing an SBT build? It turns out it creates target directories all over the place. Performing

sbt clean clean-cache clean-lib clean-plugins 

... doesn't get rid of all.

like image 464
Wilfred Springer Avatar asked Dec 19 '10 13:12

Wilfred Springer


People also ask

How do I clear my sbt cache?

You can use Pretty Clean to clean the all of dev tools caches including SBT. PrettyClean also cleans the SBT project's target folder.

What is sbt update?

update resolves dependencies according to the settings in a build file, such as libraryDependencies and resolvers . Other tasks use the output of update (an UpdateReport ) to form various classpaths. Tasks that in turn use these classpaths, such as compile or run , thus indirectly depend on update .


2 Answers

On my system (Ubuntu Linux) with SBT 0.13.5 and some projects from the Coursera Functional Programming course I found the folders all totalled up to 2.1GB for 12 projects due to all the cache files and duplicated Scala downloads.

The current SBT commands that work and get almost everything cleaned is:

sbt clean clean-files 

This removes the top level "target" and "lib_managed" folders (23MB down to 3.2MB in this case) but leaves some target folders under project:

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

This is where the Linux find command (also posted by @jack-oconnor) is very helpful:

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

This gets us back down to a mere 444KB for one of my own projects and the 2.1GB goes down to 5.0MB !

In windows you won't have as many useful command line options, e.g. no star wildcards in path names, but you can always try and force it with:

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

The best I can do on automatically finding is a DIR command:

dir /ad /s /b | find "target" 
like image 78
RudeDude Avatar answered Oct 05 '22 21:10

RudeDude


Obviously this is very important for reproducible builds on an integration server such as Jenkins!

Ensure that all files, including the ivy cache, are stored within the integration server workspace, by supplying command line arguments such as this to sbt:

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

and then click the Wipe Out Workspace button in Jenkins, or the equivalent in other integration servers. That should definitely do it!

Or if you are using a recent version of the sbt launcher script, you can simply add -no-share instead.

like image 44
Robin Green Avatar answered Oct 05 '22 23:10

Robin Green