web-dev-qa-db-fra.com

Un moyen facile de se débarrasser de * tout * généré par SBT?

Existe-t-il un moyen facile de se débarrasser de tout ce qui est généré suite à l'exécution d'une build SBT? Il s'avère qu'il crée des répertoires cibles partout. Performing

sbt clean clean-cache clean-lib clean-plugins

... ne se débarrasse pas de tout.

76
Wilfred Springer

Sur mon système (Ubuntu Linux) avec SBT 0.13.5 et certains projets du cours de programmation fonctionnelle Coursera, j'ai trouvé que les dossiers totalisaient jusqu'à 2,1 Go pour 12 projets en raison de tous les fichiers de cache et des téléchargements Scala dupliqués.

Les commandes SBT actuelles qui fonctionnent et obtiennent presque tout ce qui est nettoyé est:

sbt clean clean-files

Cela supprime les dossiers de niveau supérieur "cible" et "lib_managed" (23 Mo à 3,2 Mo dans ce cas) mais laisse certains dossiers cible sous projet:

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

C'est là que la commande Linux find (également publiée par @ jack-oconnor) est très utile:

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

Cela nous ramène à seulement 444 Ko pour l'un de mes propres projets et le 2,1 Go descend à 5,0 Mo!

Dans Windows, vous n'aurez pas autant d'options de ligne de commande utiles, par exemple aucun caractère générique d'étoile dans les noms de chemin, mais vous pouvez toujours essayer de le forcer avec:

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

Le mieux que je puisse faire pour trouver automatiquement est une commande DIR:

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

Évidemment, cela est très important pour les builds reproductibles sur un serveur d'intégration tel que Jenkins!

Assurez-vous que tous les fichiers, y compris le cache ivy, sont stockés dans l'espace de travail du serveur d'intégration, en fournissant des arguments de ligne de commande tels que celui-ci à sbt:

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

puis cliquez sur le bouton Wipe Out Workspace dans Jenkins, ou l'équivalent dans d'autres serveurs d'intégration. Cela devrait certainement le faire!

Ou si vous utilisez une version récente du script du lanceur sbt, vous pouvez simplement ajouter -no-share au lieu.

6
Robin Green

Sous Linux ou similaire, c'est mieux que find -name, car il ne supprimera pas accidentellement tout répertoire nommé target qui pourrait exister dans votre code source:

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

Si vous exécutez cette commande dans un shell, vous devrez citer l'expression régulière, par exemple, pour bash:

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

Avec BSD find (par exemple sur Mac OS X), la commande sera:

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

Je suis d'accord avec les très bonnes solutions suggérées, personnellement j'inclus une légère variation en tant que tâche gnu make.

contenu du Makefile:

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

puis exécutez:

make clean

J'aime utiliser Makefiles comme code comme documentation.

2
Jose Miguel