¿Una manera fácil de deshacerse de * todo * generado por SBT?

81

¿Existe una manera fácil de deshacerse de todo lo que se genera como resultado de realizar una compilación SBT? Resulta que crea directorios de destino por todas partes. Ejecutando

sbt clean clean-cache clean-lib clean-plugins

... no se deshace de todo.

Wilfred Springer
fuente
También me gustaría ver esto y he enviado un ticket: code.google.com/p/simple-build-tool/issues/detail?id=166
Landon Kuhn
Ese rastreador de problemas ya no está en uso, así que lo he vuelto a enviar aquí: github.com/sbt/sbt/issues/896
Robin Green

Respuestas:

69

En mi sistema (Ubuntu Linux) con SBT 0.13.5 y algunos proyectos del curso de Programación funcional de Coursera, encontré que las carpetas totalizaban hasta 2.1GB para 12 proyectos debido a todos los archivos de caché y descargas de Scala duplicadas.

Los comandos SBT actuales que funcionan y limpian casi todo son:

sbt clean clean-files

Esto elimina las carpetas de nivel superior "target" y "lib_managed" (23 MB hasta 3,2 MB en este caso) pero deja algunas carpetas de destino en el proyecto:

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

Aquí es donde el comando de búsqueda de Linux (también publicado por @ jack-oconnor) es muy útil:

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

¡Esto nos lleva de nuevo a 444 KB para uno de mis propios proyectos y los 2,1 GB se reducen a 5,0 MB!

En Windows, no tendrá tantas opciones útiles en la línea de comandos, por ejemplo, sin comodines de estrella en los nombres de las rutas, pero siempre puede intentar forzarlo con:

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

Lo mejor que puedo hacer para buscar automáticamente es un comando DIR:

dir /ad /s /b | find "target"
RudeDude
fuente
¿Es necesario tener la -fbandera cuando se usa el comando de búsqueda? Parece innecesario y potencialmente inseguro.
unjankify
Esto funcionó bien para mí:find . -name target -type d -exec rm -r {} \;
unjankify
La parte "-f" del comando 'rm' no debería ser necesaria, pero en algunos sistemas podría ser preferible a una larga lista de confirmaciones de eliminación.
RudeDude
3
@AlbertBikeev: tal vez sbt clean cleanFilesfuncione para usted
serv-inc
2
sbt clean cleanFiles
frostcs
6

Obviamente, esto es muy importante para compilaciones reproducibles en un servidor de integración como Jenkins.

Asegúrese de que todos los archivos, incluida la caché de Ivy , se almacenen dentro del espacio de trabajo del servidor de integración, proporcionando argumentos de línea de comando como este a sbt:

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

y luego haga clic en el botón Wipe Out Workspace en Jenkins, o el equivalente en otros servidores de integración. ¡Eso definitivamente debería hacerlo!

O si está utilizando una versión reciente del script de inicio de sbt, simplemente puede agregar -no-share.

Robin Green
fuente
Si ya está usando Jenkins, entonces el complemento de limpieza es una excelente alternativa para asegurarse de que el espacio de trabajo esté despejado
ecoe
5

En Linux o similar, esto es mejor que find -name, ya que no eliminará accidentalmente ningún directorio nombrado targetque pueda existir en su código fuente:

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

Si está ejecutando este comando dentro de un shell, deberá citar la expresión regular, por ejemplo, para bash:

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

Con BSD find (por ejemplo, en Mac OS X), el comando será:

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

Estoy de acuerdo con las muy buenas soluciones sugeridas, personalmente incluyo una ligera variación como tarea de gnu make.

contenido de Makefile:

clean:
    find . -name target | xargs rm -fr

y luego ejecuta:

make clean

Me gusta usar Makefiles como código como documentación.

Jose miguel
fuente