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

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

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

3 ответа

Решение

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

Чтобы настроить глобальный каталог сборки, вам нужно добавить эти строки в ~ /.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 МБ ОЗУ)

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

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

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

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

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

И в настройках проекта. Gradle:

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

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

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

build.gradle:

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

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

  1. Удалить проект build папка
  2. mklink /d ...disk\path\to\project\build ...RAM\path\to\project (или же ln в Unix)
  3. Быстро построить

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

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

Другие вопросы по тегам