Подтвердить что ты не робот

Gradle каталог глобальной сборки

Я хочу знать, можно ли настроить Gradle для использования одного глобального каталога build для всех проектов? Мне нужно это, потому что я храню все свои проекты в папке Google Диска (для резервного копирования и быстрого доступа с других устройств), и когда я создаю проект, Google Диск загружает ЦП при синхронизации проекта build. Поэтому я хочу переместить каталоги build за пределы Google Диска.

Также этот параметр будет полезен тем, кто хочет создавать проекты с использованием RAM-диска в качестве хранилища для каталога build.

4b9b3361

Ответ 1

Спасибо Питеру Нидерризеру. Я решил опубликовать свой собственный ответ из-за дополнительной информации.

Чтобы настроить глобальный каталог сборки, вам нужно добавить эти строки в ~/.gradle/init.gradle:

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

Хорошая опция иметь глобальный каталог build на диске RAM.

Если вы являетесь пользователем macOS (OS X), вы можете сделать это с помощью

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

где XXXXXX - количество 512-байтовых блоков (например, это 262114 для 128 МБ RAM-диска)

И строка buildDir будет:

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

Также вы можете расширить конфигурацию до:

  • получить глобальный путь сборки из переменной окружения или вернуться в каталог build внутри каталога проекта;
  • включить группу проектов в путь, это делает путь более уникальным, особенно если у вас несколько проектов с тем же именем.

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

И в проекте settings.gradle:

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

Также вы можете использовать этот параметр в проекте build.gradle для установки группы проектов, но это необязательно:

allprojects {
    ...
    group gradle.ext.group
}

Ответ 2

build.gradle:

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

Ответ 3

Вы также можете пойти наоборот. Замените папку build глобальной папкой.

  • Удалить папку build
  • mklink /d ...disk\path\to\project\build ...RAM\path\to\project (или ln в Unix)
  • Построить быстро

Вы можете автоматизировать это в задаче clean, поэтому gradlew clean очищает содержимое папки и воссоздает ссылку.

При небольшом быстром тестировании кажется, что Google Диск не распознает каталог в соединениях в Windows. Он синхронизирует папки, но не содержимое. Если я загружаю файлы на диск в эти папки, они синхронизируются с локальной копией. Но если я удалю синхронизированный файл с диска, удаление не будет синхронизировано. Кажется, что ссылки заставляют Drive быть одним из способов.