![](/img/trans.png)
[英]how to add test dependency with android gradle plugin experimental 0.1.0
[英]Add Android Gradle plugin as a runtime dependency
我正在编写适用于Android的Gradle插件,该插件使用新的Transform API 。 不幸的是,我在将Android插件添加为插件的依赖项时遇到了问题。 我的插件的简化Gradle配置如下所示:
plugin / build.gradle :
apply plugin: "groovy"
dependencies {
compile gradleApi()
compile localGroovy()
compile "com.android.tools.build:gradle:1.4.0-beta2"
}
这是使用我的Gradle插件的应用程序项目的简化配置:
application / build.gradle :
buildscript {
dependencies {
classpath "com.android.tools.build:gradle:1.4.0-beta2"
classpath "my-plugin:my-plugin:1.0.0"
}
}
apply plugin: "com.android.application"
apply plugin: "my-plugin"
android {
compileSdkVersion 23
buildToolsVersion '23.0.1'
defaultConfig {
applicationId 'com.myapplication'
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName version
}
}
使用此配置,一切正常,但我也希望我的插件能够与使用早期版本的Android插件的项目正常工作。 因此,我尝试在应用程序的配置文件中更改Android插件版本:
application / build.gradle(带有Android插件1.3.1) :
buildscript {
dependencies {
classpath "com.android.tools.build:gradle:1.3.1"
classpath "my-plugin:my-plugin:1.0.0"
}
}
/* Everything else is the same. */
但在这种情况下,仍将使用Android插件1.4.0-beta2
。 我相信这是因为Gradle解决了类路径依赖关系时,它比1.3.1
更喜欢1.4.0-beta2
,因此整个项目开始使用Android插件的1.4.0-beta2
版本。
我还尝试将Android插件添加为runtime
依赖项,但是在进行此更改后,由于“无法解决”这样的错误,我的插件停止了编译:
Unable to resolve class com.android.build.gradle.api.BaseVariant @ line 19, column 1.
import com.android.build.gradle.api.BaseVariant
有没有一种方法可以针对最新版本的Android插件构建我的插件,但在运行时使用由构建环境提供的Android插件版本?
最后,我设法通过手动添加provided
范围来解决此问题。 这是一篇有关将provided
范围添加到Gradle的很好的文章: http : //www.sinking.in/blog/provided-scope-in-gradle/ 。 不幸的是,它没有说明如何使maven-publish
插件处理provided
范围。 因此,我将解释如何做到这一点。
在我的项目中,我在buildSrc
中有一个小插件,负责发布到Maven。 我将所有provided
相关代码添加到了此插件,但可以将其添加到build.gradle
文件中。
插件框架如下所示:
class PublishPlugin implements Plugin<Project> {
private static final PROVIDED_CONFIGURATION_NAME = "provided"
private Project project
@Override
void apply(final Project project) {
project.apply plugin: 'java'
project.apply plugin: 'maven-publish'
project.apply plugin: 'com.jfrog.bintray'
project.apply plugin: 'idea'
addProvidedConfiguration()
configureIdeaModule()
project.afterEvaluate {
modifyPomDependencyScopes()
}
}
然后,我们创建一个provided
范围。 可以在编译期间使用添加到此范围的依赖项。 在生成的pom.xml
文件中,这些依赖项将provided
作用域。
private void addProvidedConfiguration() {
final Configuration provided =
addConfiguration(project.configurations,
PROVIDED_CONFIGURATION_NAME)
final Javadoc javadoc =
project.tasks.getByName(JavaPlugin.JAVADOC_TASK_NAME) as Javadoc
javadoc.classpath = javadoc.classpath.plus(provided)
}
private static Configuration addConfiguration(
final ConfigurationContainer configurations, final String name) {
final Configuration compile =
configurations.getByName(JavaPlugin.COMPILE_CONFIGURATION_NAME)
final Configuration configuration = configurations.create(name)
compile.extendsFrom(configuration)
configuration.visible = false
configuration.transitive = false
configuration.allDependencies.all { final dependency ->
configurations.default.exclude(
group: dependency.group, module: dependency.name)
}
return configuration
}
我使用IntelliJ IDEA,因此需要使其“了解”所provided
范围。 如果使用Eclipse,则必须执行相同的操作。
private void configureIdeaModule() {
project.idea.module {
scopes.PROVIDED.plus += [project.configurations.provided]
}
}
最后,我们需要在生成的pom.xml
文件中更改范围。 默认情况下,Gradle将所有依赖项的作用域设置为runtime
。 并且以下代码将它们更改为可compile
或在必要时provided
。
private void modifyPomDependencyScopes() {
modifyPomDependencyScope(JavaPlugin.COMPILE_CONFIGURATION_NAME)
modifyPomDependencyScope(PROVIDED_CONFIGURATION_NAME)
}
private void modifyPomDependencyScope(final String scope) {
project.publishing.publications.all {
pom.withXml {
final DependencySet dependencies =
project.configurations.getByName(scope).allDependencies
asNode().dependencies.'*'.findAll() {
dependencies.find { it.name == node.artifactId.text()
}.each { it.scope*.value = scope }
}
}
}
}
而已。 然后,您只需要将此插件应用于需要发布到Maven的项目,并将依赖项类型从compile
更改为provided
:
apply plugin: "groovy"
apply plugin: "my-publish-plugin"
dependencies {
compile gradleApi()
compile localGroovy()
provided "com.android.tools.build:gradle:1.4.0-beta2"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.