我正在尝试编写一个插件,project.dependencies根据插件扩展对象中收集的信息添加依赖项.但这似乎是不可能的.
实际上,来自扩展对象的数据仅在新任务或project.afterEvaluate闭包中可用,但忽略在这些位置添加的依赖项.
以下代码尝试添加依赖项,afterEvaluate但忽略依赖项:
apply plugin: MyPlugin
myplugin {
version '1.0'
}
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create('myplugin', MyPluginExtension)
project.afterEvaluate {
def version = project.myplugin.version
project.dependencies.add("compile", "org.foo:bar:$version") // --> ignored
}
}
}
class MyPluginExtension {
def version
}
Run Code Online (Sandbox Code Playgroud)
在以下代码中,依赖项注入有效但我无权访问扩展对象:
apply plugin: MyPlugin
myplugin {
version '1.0'
}
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create('myplugin', MyPluginExtension)
def version = project.myplugin.version // == null
project.dependencies.add("compile", "org.foo:bar:$version") // --> fail because $version is null
}
}
class MyPluginExtension {
def version
}
Run Code Online (Sandbox Code Playgroud)
有解决方案吗?
Saa*_*ooq 19
更新:自从我的原始答案以来,我设法解决了这个问题.这样做的方法是添加一个DependencyResolutionListener在其中添加依赖项,然后删除侦听器,以便它不会尝试在以后的解决步骤中添加它们.
compileDeps = project.getConfigurations().getByName("compile").getDependencies()
project.getGradle().addListener(new DependencyResolutionListener() {
@Override
void beforeResolve(ResolvableDependencies resolvableDependencies) {
compileDeps.add(project.getDependencies().create("org.foo:bar:$version"))
project.getGradle().removeListener(this)
}
@Override
void afterResolve(ResolvableDependencies resolvableDependencies) {}
})
Run Code Online (Sandbox Code Playgroud)
我有一个插件的工作示例,在这里使用它
原答案:
这也是迟到的,但对于任何人来说都是如此.使用最新的gradle(2.6在编写本文时),您可以DependencyResolutionListener在解析依赖关系之前添加并添加任何依赖项.
project.getGradle().addListener(new DependencyResolutionListener() {
@Override
void beforeResolve(ResolvableDependencies resolvableDependencies) {
depsToAdd.each { dep ->
compileConfig.getDependencies()
.add(project.getDependencies().create(dep))
}
}
@Override
void afterResolve(ResolvableDependencies resolvableDependencies) {
}
})
Run Code Online (Sandbox Code Playgroud)
但是,在撰写本文时,我遇到了一些与Android Studio IDE兼容的问题.我的问题在这里跟踪了这个问题
我最初使用DependencyResolutionListenerSaad 的方法实现了这个解决方案。但是,仅当某些内容迭代与 dependency 关联的配置时,才会调用侦听器本身。例如,如果您想动态添加依赖项compile,则必须确保稍后执行以下操作:
project.configurations.compile.each {
...
}
Run Code Online (Sandbox Code Playgroud)
但这是理所当然的事情,因为这compile是使用 java 插件的任何项目的已知配置。但是,如果您使用自定义配置(就像我一样),那么侦听器方法将不起作用,除非您显式迭代自定义配置。
我能够找到一种更好的方法来做到这一点,并且按照afterEvaluateOP最初想要的那样。我在这里使用自定义配置,但我没有看到它不起作用的原因compile:
project.afterEvaluate {
def version = project.myPlugin.version
project.configurations.myConfig.dependencies.add(
project.dependencies.add("myConfig", "org.foo:bar:$version")
)
}
Run Code Online (Sandbox Code Playgroud)
当然,在某些时候仍然需要迭代依赖项才能真正解决它们。
不知道这是否仍然相关,但您可以通过将编译配置显式添加到 doFirst 中的 Java 类路径来解决此问题:
variant.javaCompile.doFirst {
variant.javaCompile.classpath += project.configurations.myconfiguration
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7297 次 |
| 最近记录: |