Gradle - выборочная компиляция модуля (в противном случае используется барабан повторного использования)

Я использую много модулей в своем проекте (локальные и онлайн-теги, 20 в большинстве случаев), и я могу сказать, что обычно их нельзя проверять и перекомпилировать. Я мог бы включить их как файлы .jar, которые ускорили бы время сборки, но я бы предпочел следующее:

  • установите что-то, где я определяю, что gradle должен построить .jar для всех моих модулей и повторно использовать их
  • При необходимости я просто отключу эту настройку и создаю свой проект (совершенно чистая сборка сделает это)
  • Я хочу иметь возможность редактировать свои модули в проекте, поэтому я не хочу включать их непосредственно в качестве файлов .jar.

Я хочу быстрее создавать время сборки, но мне не нужно создавать файлы .jar и добавлять их вручную в мой проект.

Любые идеи о том, как и если это возможно? Могу ли я понять, что с помощью какой-либо установки или с помощью задачи gradle или аналогичного?

Ответ 1

Позвольте мне подумать о библиотеках верификации, которые существуют в .jar и которые мы должны скачать. В другом случае вы можете предоставить несколько типов продуктов. И после этого просто выберите Build Flavors для вашей работы.

productFlavors {
        fastDebug {
            applicationIdSuffix ".jar"
        }
        regularDegub {
            applicationIdSuffix ".regular"
        }
        ....
        // Other Configuration
    }

dependencies {
    ...
    // Jar Debug by adding only Jar
    fastDegubCompile fileTree(dir: 'libs', include: '*.jar')
    fastDegubCompile 'com.android.support:support-v4:23.1.1'

    ...
    // Regular Debug with downloading all libraries
    // Including only specific from project files
    regularDegubCompile 'com.squareup.picasso:picasso:2.5.2'
    regularDegubCompile 'com.android.support:support-v4:23.1.1'
    regularDegubCompile files('libs/specific1.jar', 'libs/specific2.jar')

} 

| UPDATE |

Итак, после некоторого обходного пути я вижу, что Gradle собирает библиотеки в некоторый кеш, где я вижу источник. Но я все еще ищу путь к правильной библиотеке проверки с конфигурацией проекта.

На данный момент я написал script для сбора файлов из Gradle местоположения кеша. И копирование их в новое место, где мы можем использовать ароматы сборки. Это работает очень быстро (менее 7 секунд для 200 библиотек), но все равно нуждаются в улучшениях (см. Выше).

Если у меня нет времени, для следующего обновления, пожалуйста, заполните бесплатное решение. Спасибо за понимание.

// Task for calling from Gradle Scripts
// -----------------------------------

task gatheringJarFilesTask << {
    println("Gathering Jars Start...")
    gatheringJarFiles(gradleCacheLocation, foundedJarsList)
    println("------------------------------")
    println("Gathering Jars End! Start copying!")
    copyFiles(projectJarsLocation, foundedJarsList)

}


// Constants, which might be optimized too
// -----------------------------------

def gradleCacheLocation = '/home/kasyangenka/.gradle/caches/modules-2/files-2.1'
def projectJarsLocation = '/home/kasyangenka/Projects/GradleScriptsTest/app/libs'
List<String> foundedJarsList = []

// Main Script Methods
// -----------------------------------

def gatheringJarFiles(baseDirPath, gatheredList) {
    new File(baseDirPath).eachFile {file ->
        println("-> Current file: " + file.getName())
        if (file.isDirectory()) {
            gatheringJarFiles(file.getAbsolutePath(), gatheredList)
        }
        def containsLib = (file.getName().contains(".jar")
                || file.getName().contains(".aar"));

        if (containsLib)  {
            println("->> Adding Jar file: " + file.getAbsolutePath())
            gatheredList.add(file.getAbsolutePath())
        }
    }
}

def copyFiles (destiny, List sourceList) {
    sourceList.each {filePath ->
        copy {
            from filePath
            into destiny
        }
    }
}

Ответ 2

Я думаю, что функция Continuous build, введенная из Gradle 2.5, пытается решить проблему, что вы встречаете, хотя это не совсем что вам нужно. Передайте команду -t или --continuous в gradlew, чтобы использовать ее, следующее описание для параметра -t.

-t, --continuous        Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change. [incubating]

И цитируется в документе:

Gradle incremental build support ensures that only the tasks that are actually affected by the change are executed.

Смотрите: https://docs.gradle.org/current/userguide/continuous_build.html