web-dev-qa-db-fra.com

Gradle répertoire de construction global

Je souhaite savoir s'il est possible de configurer Gradle pour utiliser un répertoire global build pour tous les projets. J'ai besoin de cela car je stocke tous mes projets dans le dossier Google Drive (pour la sauvegarde et l'accès rapide depuis d'autres appareils) et lorsque je construis le projet, Google Drive charge le processeur lors de la synchronisation du répertoire du projet build. Je souhaite donc déplacer les répertoires build en dehors de Google Drive.

Cette option sera également utile pour ceux qui souhaitent construire des projets en utilisant le disque RAM comme stockage pour le répertoire build.

22
mixel

Merci à Peter Niederwieser. J'ai décidé de poster ma propre réponse en raison de détails supplémentaires.

Pour configurer le répertoire de construction global vous devez ajouter ces lignes à ~/.gradle/init.gradle :

gradle.projectsLoaded {
    rootProject.allprojects {
        buildDir = "/path/to/build/${rootProject.name}/${project.name}"
    }
}

Belle option pour avoir le répertoire global build sur le disque RAM .

Si vous êtes un utilisateur macOS (OS X), vous pouvez le faire avec:

diskutil erasevolume HFS+ 'RAMDiskName' `hdiutil attach -nomount ram://XXXXXX`

XXXXXX est un nombre de blocs de 512 octets (par exemple, 262114 pour 128 Mo de disque RAM)

Et la ligne buildDir sera:

buildDir = "/Volumes/RAMDiskName/${rootProject.name}/${project.name}"

Aussi, vous pouvez étendre la configuration à:

  1. récupère le chemin de construction global depuis la variable d'environnement ou le repli vers le répertoire build dans le répertoire du projet;
  2. inclure un groupe de projets dans chemin, cela rend le chemin plus unique, en particulier si vous avez plusieurs projets portant le même nom.

~/.gradle/init.gradle :

def configProject(p, buildDir) {
    p.buildDir = "${buildDir}/${p.name}"  
    p.subprojects { s ->
        configProject(s, "${p.buildDir}")
    }
}

def buildDir = System.env.GRADLE_GLOBAL_BUILD_PATH
if (!buildDir?.trim()) {
    buildDir = "build"
}

gradle.projectsLoaded {
    if (ext.has("group")) {
        buildDir += "/${ext.group}"
    }
    configProject(rootProject, buildDir)
}

Et dans le projet settings.gradle :

gradle.ext.group = 'com.example.yourproject'

Vous pouvez également utiliser ce paramètre dans le projet build.gradle pour définir le groupe de projets, mais cela est facultatif:

allprojects {
    ...
    group gradle.ext.group
}
44
mixel

build.gradle:

def baseDir = "/global/build/dir/$project.name"
buildDir = baseDir + "/root"
subprojects {
    buildDir = baseDir + project.path.replaceFirst(":", "/").replace(":", ".")
}
2
Peter Niederwieser

Vous pouvez aussi aller dans le sens opposé. Remplacez le dossier build par un dossier global.

  1. Supprimer le dossier build du projet
  2. mklink /d ...disk\path\to\project\build ...RAM\path\to\project (ou ln sous Unix)
  3. Construire vite

Vous pouvez automatiser cela dans la tâche clean. Un gradlew clean nettoie le contenu du dossier et recrée le lien.

Après quelques tests rapides, il semble que Google Drive ne reconnaisse pas les répertoires dans les liens de jonction sous Windows. Cela synchronisera les dossiers, mais pas le contenu. Bizarrement, si je télécharge des fichiers sur Drive dans ces dossiers, ils sont synchronisés dans la copie locale. Mais, si je supprime le fichier synchronisé du disque, la suppression n'est pas synchronisée. Il semble que les liens font que Drive soit un moyen.

0
TWiStErRob