Gradle / Android:使用项目的调试版本作为依赖项

时间:2014-09-30 05:04:38

标签: android unit-testing gradle spock robospock

背景

我正试图让 robospock (roboelectric + spock-framework)作为一个解决方案,因为android gradle插件是愚蠢的并且不让我{{1 }}

然而,robospock似乎不起作用......我试图覆盖apply plugin: 'groovy',但到目前为止我尝试的所有内容都是在android-library项目或android项目上工作但不是反之亦然。

我试过

在测试org.robospock.RobospockAction.metaClass.execute项目时,这两项工作都有效:(完整来源:http://pastebin.com/pbxr4vUJ

android-library

或:

org.robospock.RobospockAction.metaClass.execute = { Project project ->
    // Project under test
    def put = project.project( project.ext.robospock )

    // collect and extract compiled classes in library project
    def subProjects = getSubprojects( put ).unique()
    def allProjects = subProjects + put

    // separate android & normal projects from each other.
    def androidProjects = allProjects.findAll { isAndroid( it ) }
    def normalProjects  = allProjects.findAll { !isAndroid( it ) }

    // collect and forward all maven dependencies
    def mavenDependencies = collectMavenDependencies( allProjects ).unique()
    mavenDependencies.each { dep ->
        project.dependencies {
            compile group: dep.group, name: dep.name, version: dep.version
        }
    }

    // add normal projects to dependencies.
    normalProjects.each { proj ->
        project.dependencies { compile proj }
    }

    // add android projects to dependencies, in an odd way.
    def main   = project.sourceSets.main
    def ssJava = main.java.srcDirs
    def ssRes  = main.resources.srcDirs

    androidProjects.each { proj ->
        // Find generated dir.
        def variants = proj.plugins.hasPlugin( 'android-library' )
                     ? proj.android.libraryVariants
                     : proj.android.applicationVariants
        def genDir = variants.find { it.name == 'debug' }.dirName

        // Add resource sets.
        def androidMain = proj.android.sourceSets.main
        ssRes.addAll( androidMain.res.srcDirs )

        // Add source sets.
        ssJava.addAll( androidMain.java.srcDirs )
        def sourceDir =  proj.buildDir.path + "/generated/source/"
        ["r/", "buildConfig/"].each {
            ssJava.addAll( sourceDir + it + genDir )
        }
    }
    // ...
}

当我尝试将第一个版本用于普通org.robospock.RobospockAction.metaClass.execute = { Project project -> // Project under test def put = project.project( project.ext.robospock ) project.dependencies { compile ':' + put.name + ':debugVersion' } // ... } 项目时,构建失败并显示:http://pastebin.com/n3AZRMg0 这声称例如:android - 虽然它还声明package android.support.v4.app does not exist是一个依赖项(当我做gradle assembleDebug时一切正常)。

第二个版本抱怨没有以各种方式找到以com.android.support:support-v4:20.0.0为后缀的项目 - :debugVersion只是一个android-library?

将其更改为:debugVersion时,它可以正常运行,但也会发布一个版本,由于签名配置和构建时间过长,这是一个很大的禁忌。

TL; DR / Question

1)我如何让gradle只使用一个(android项目作为)依赖项与调试版本 - 或者我如何强制它至少跳过整个发布部分?

2)为什么神秘的错误输出会出现在第一个版本中?

3)我可以通过其他任何方式解决我的问题,即获得基于robospock或spock的测试,以便安卓工作吗?

0 个答案:

没有答案