2016-11-03 6 views
15

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

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

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

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

+0

Является ли это только чистый Java библиотеки или вы отъехать андроид библиотек, а? – tynn

+0

в основном андроидные библиотеки ... – prom85

+0

Так что, собственно, файлы '.aar'? – tynn

ответ

6

Позвольте мне подумать о библиотеках проверки, которые существуют в .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') 

} 

| ОБНОВЛЕНИЕ |

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

На данный момент я написал сценарий для сбора файлов из местоположения кеша 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 
     } 
    } 
} 
+0

Это означало бы, что мне придется вручную создавать банки один раз и помещать их в папку libs, правильно? Это ваше предложение? И затем я могу решить использовать банки через 'fastDegubCompile' или получить обновленные версии моих зависимостей через' regularDegubCompile' – prom85

+0

@ prom85 Да, как вы описали в вопросе. – GensaGames

+0

Я хотел иметь возможность создавать jars direclty через сценарий градации, чтобы не использовать банки ... Может быть, у вас есть идея и для этого? – prom85

3

Я думаю, что 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's 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

+0

Я думал, что андроид-студия поддерживает gradle 2.14.1 только в настоящее время, но я был неправ. Он поддерживает> = 2.14.1 с текущим плагином gradle 2.2.0. Знаете ли вы, где я могу дефинировать параметры gradlew в андроид-студии? Я знаю только, где перейти в параметрах gradle ... – prom85

+0

@ prom85 Вы ​​можете определить это из 'Preferences-> Build, Execution, Deployment-> Compiler-> Параметры командной строки' – xfdai

+0

Не те флаги для команды' gradle' а не для команды «gradlew»? – prom85