Gradle:如何指定库的两个源集并在项目中添加依赖项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle:如何指定库的两个源集并在项目中添加依赖项相关的知识,希望对你有一定的参考价值。

我尝试指定gradle库的两个不同的源集,并在项目中添加源集特定的依赖项。

enter image description here

我的想法是做这样的事情:

库build.gradle文件:

apply plugin: 'com.android.library'

android {
   ...
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'

            java {
                srcDir 'src'
            }
            res {
                srcDir 'res'
            }
        }

        exclude_fr_it{
            manifest.srcFile 'AndroidManifest.xml'

            java {
                srcDir 'src'
            }
            res {
                srcDir 'res'
                exclude 'res/values/values-fr'
                exclude 'res/values/values-it'
            }
        }
    }
...
}
...

在项目A中,我想包含主要的源集:

dependencies {
    compile project(':explore_layout')
}

在项目B中,我想要包含使用sourceset exclude_fr_it的构建。

dependencies {
    compile project(':explore_layout') library 'exclude_fr_it'
}

我试着理解文档。但我不知道如何做到这一点......

Question 1

Doc

Question 2

答案

这不是sourceSets问题的直接答案。但您可能根本不需要使用sourceSets功能。

如果您只是希望您的应用程序在自定义安卓库中包含一部分资源,则可以使用应用程序build.gradle中的配置块来实现。 (实际上,库根本不需要'main'和'exclude_fr_it'sourceSets的特殊配置块。)

这是可能的,因为'resConfigs'属性。

特别是,假设您的库具有三种语言的资源配置:'en','fr'和'it'。

然后,在包含库中所有语言的项目A中,您只需在build.gradle中使用它:

dependencies {
    compile project(':explore_layout')
}

但是,在项目B中,您想要排除自定义库的'fr'和'it'资源,您可以在配置闭包中使用'resConfigs'属性,只包含这样的资源子集:

dependencies {
    compile project(':explore_layout') {
        android {
            defaultConfig {
                resConfigs 'en'
            }
        }
    }
}
另一答案

我已经使用特定源规范的mavenLocal分发实现了这一点。我有一个库项目,有一些我想省略的java.awt代码,所以我可以将项目作为依赖项包含在android项目中(不支持java.awt)

在您的图书馆中,您将拥有以下内容:

apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'maven-publish'

sourceSets {
    main {
        java {
            srcDirs = [ 'src' ]
        }
    }

    // android source set excludes portion of source that 
    // references java.awt
    android {
        java {
            srcDirs = [ 'src' ]
            excludes = ['**/skunkworks/**', '**/awt/**']
        }
    }
}

// this task compiles sources defined by custom sourceSet 'android'
task androidJar(type: Jar) {
    from sourceSets.find {'android'}.output
}

publishing {
    publications {
        myLibrary(MavenPublication) {
            groupId = 'foo.bar'
            artifactId = 'mylib-android'
            version = '1.0'

            artifact androidJar
        }
    }

}

然后使用tasks-> publishing-> publishToMavenLocal目标将自定义jar编译到〜/ .m2 / repository。

现在在android项目中我引用如下:

repositories {
    mavenLocal()
}

dependencies {
    implementation 'foo.bar:mylib-android:1.0'
}

以上是关于Gradle:如何指定库的两个源集并在项目中添加依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android gradle.kts 中定义自定义源集?

将 sqldelight 的“未解决的参考:NativeSqliteDriver”添加到 ios 源集

如何比较两个二进制文件或文件集并在 Python 中显示它们之间的差异?

如何合并两个查询集并在 django 中创建新的查询集

Gradle with Eclipse - 多个源集时不完整的.classpath

无法从 Gradle 中的替代测试源集访问 Kotlin 内部成员