Gradle Global build directory

Chcę wiedzieć, czy możliwe jest skonfigurowanie Gradle tak, aby używał jednego globalnego katalogu build dla wszystkich projektów? Potrzebuję tego, ponieważ przechowuję wszystkie moje projekty w folderze dysku Google (do tworzenia kopii zapasowych i szybkiego dostępu z innych urządzeń) i kiedy buduję projekt Dysk Google ładuje procesor podczas synchronizacji katalogu project build. Chcę więc przenieść build katalogi poza Dysk Google.

Również ta opcja będzie przydatna dla tych, którzy chcą budować projekty z użyciem pamięci RAM jako magazynu dla build katalog.

Author: mixel, 2014-04-28

3 answers

Dzięki Peter Niederwieser. Postanowiłem opublikować własną odpowiedź ze względu na dodatkowe szczegóły.

Aby skonfigurować globalny katalog budowania musisz dodać te linie do ~/.gradle/init.gradle :

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

Fajna opcja aby mieć globalny katalog build na dysku RAM.

Jeśli jesteś użytkownikiem macOS (OS X) możesz to zrobić za pomocą:

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

Gdzie XXXXXX jest liczbą 512-bajtowych bloków (na przykład, jest to 262114 dla 128MB RAM dysk)

I buildDir linia będzie:

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

Możesz również rozszerzyć konfigurację do:

  1. get global build path from environment variable or fallback to build directory inside project directory;
  2. Dołącz grupę projektów w path, to sprawia, że ścieżka jest bardziej unikalna, zwłaszcza jeśli masz kilka projektów o tej samej nazwie.

~/.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)
}

I w projekcie ustawienia.gradle :

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

Możesz również użyć tego ustawienia w projekcie build.gradle aby ustawić grupę projektu, ale jest to opcjonalne:

allprojects {
    ...
    group gradle.ext.group
}
 41
Author: mixel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 13:27:41

Zbuduj."gradle": {]}

def baseDir = "/global/build/dir/$project.name"
buildDir = baseDir + "/root"
subprojects {
    buildDir = baseDir + project.path.replaceFirst(":", "/").replace(":", ".")
}
 2
Author: Peter Niederwieser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 15:45:52

Możesz też pójść w odwrotną stronę. Zastąp folder build folderem globalnym.

  1. Usuń folder projektu build
  2. mklink /d ...disk\path\to\project\build ...RAM\path\to\project (lub ln w Unixie)
  3. Build fast

Można to zautomatyzować w zadaniu clean, więc gradlew clean czyści zawartość folderu i odtwarza łącze.

Po kilku szybkich testach wydaje się, że Dysk Google nie rozpoznaje katalogu w łączach w systemie Windows. Zsynchronizuje foldery, ale nie zawartość. Dziwne, że prześlij pliki na dysk do tych folderów, zostaną zsynchronizowane z lokalną kopią. Ale jeśli usunę zsynchronizowany Plik z dysku, usunięcie nie zostanie zsynchronizowane z powrotem. Wygląda na to, że linki powodują, że napęd jest jednokierunkowy.

 0
Author: TWiStErRob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-06 17:44:26