Gradle – 选择模块编译(否则重用jar)

我在我的项目中使用了很多模块(本地和在线的模块,大多数时候都是20个),我可以说通常不检查也不重新编译它们。 我可以将它们全部包含为.jar文件,这会加快构建时间,但我更喜欢以下内容:

  • 设置我定义gradle应为我的所有模块构建.jar并重用它们的东西
  • 如果需要我只是禁用此设置并构建我的项目(完美的干净构建会这样做)
  • 我希望能够在项目中编辑我的模块,这就是为什么我不想将它们直接包含在.jar文件中。

我想要更快的构建时间,但我不想构建.jar文件并手动将它们添加到我的项目中。

关于如何以及如果可能的任何想法? 我可以通过一些设置或通过gradle任务或类似的方式来实现吗?

    让我考虑一下validation库,它存在于.jar中,我们应该下载它们。 在其他情况下,您可以提供多种types的产品口味。 在此之后,只需为您的工作选择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将库收集到一些缓存中,在那里我可以看到源代码。 但我仍然在寻找具有项目配置的正确validation库的方法。

    现在我编写了用于从Gradle缓存位置收集文件的脚本。 并将它们复制到新的位置,我们可以使用构建口味。 这非常快(200个库的时间少于7秒),但仍需要改进(见上文)。

    如果我没有时间,请在下次更新时随意填写解决方案。 感谢您的理解。

     // 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 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 } } } 

    我认为Gradle 2.5引入的Continuous buildfunction正在尝试解决您遇到的问题,尽管它并不完全符合您的需求。 传递-t--continuousgradlew命令以使用它,以下是-t选项的描述。

     -t, -  continuuous启用连续构建。 当任务文件输入发生更改时,Gradle不会退出并将重新执行任务。  [孵育]
    

    并引用该文件:

     Gradle的增量构建支持确保仅执行实际受更改影响的任务。
    

    请参阅: https : //docs.gradle.org/current/userguide/continuous_build.html