15

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

  • 在我定义 gradle 应该.jar为我的所有模块构建一个并重用它们的地方设置一些东西
  • 如果需要,我只需禁用此设置并构建我的项目(完全干净的构建就可以了)
  • 我希望能够在项目中编辑我的模块,这就是为什么我不想将它们直接作为.jar文件包含在内。

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

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

4

2 回答 2

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 缓存位置收集文件的脚本。并将它们复制到新位置,我们可以在其中使用构建风味。这确实很快(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<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
        }
    }
}
于 2016-11-10T14:54:28.263 回答
3

我认为Continuous build从 Gradle 2.5 引入的功能正在尝试解决您遇到的问题,尽管它并不完全是您所需要的。通过-t--continuousgradlew命令使用它,下面是-t选项的描述。

-t, --continuous 启用连续构建。Gradle 不会退出,并且会在任务文件输入更改时重新执行任务。[孵化]

并从文件中引用:

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

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

于 2016-11-11T13:48:20.147 回答