在gradle中使用依赖项解析时,通常会看到如下内容:
configurations {
optional
compile
runtime.extendsFrom compile
testCompile.extendsFrom runtime
}
我想知道optional
或compile
的类型是什么?是班级吗?一个字符串?我可以用什么方法打电话呢?
除此之外,有没有办法自动找出这些东西,类似于ctrl+space
在日食时的东西?
答案 0 :(得分:3)
我不是Gradle专家,但这似乎是一个简单的getter以DSL方式委托给另一个对象。你可以写这样的东西:
class MyDsl {
def config = [:].withDefault { false }
void configure(closure) {
closure.delegate = this
closure()
}
def getOptional() { config.optional = true }
def getCompile() { config.compile = true }
def getTest() { config.test = true }
}
dsl = new MyDsl()
dsl.configure {
optional
compile
}
dsl.config.with {
assert optional
assert compile
assert !test
}
您可以返回一些特定对象以传递给runtime.extendsFrom()
方法。
对于自动完成,IIRC是什么groovy-eclipse DSLD (DSL descriptors)。您可以尝试this gradle DSLD插件中的eclipse-integration-gradle。
根据this ticket,很久以前就已经完成了。
答案 1 :(得分:2)
它们是实现org.gradle.api.artifacts.Configuration的类。 Gradle DSL doc还包含有关configuration DSL core type。
的更多信息要查找有关内部类等的更多信息,这在查询Gradle javadoc中的类和方法时非常有用,它通常只是打印出类名来简单。但很多时候,您最终会得到一些内部实现类而不是您感兴趣的API接口,但无论如何,这都是开始搜索内容的一种方式。我倾向于保留IDE中可用的所有开源项目的源代码。这样很容易跳进正确的类(即使它不能通过上下文快捷方式获得)并环顾四周。
要获得有关您的案例中的配置的更多信息,您可以添加一个只打印出相关信息的任务。例如。类似的东西:
task configInfo << {
println "configurations.class: ${configurations.class}"
println "configurations.compile class: ${configurations.compile.class}"
println "implements ${Configuration} interface? ${configurations.compile instanceof Configuration}"
}
在我的情况下导致以下输出
$ gradle configInfo
:configInfo
configurations.class: class org.gradle.api.internal.artifacts.configurations.DefaultConfigurationContainer_Decorated
configurations.compile class: class org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated
implements interface org.gradle.api.artifacts.Configuration interface? true
答案 2 :(得分:1)
“什么类型是可选的或编译”这个问题并不真正有效。这有点像询问“instanceof”具有什么类型。 keywword的instanceof没有类型。
在编写您所引用的代码时,您正在利用DSL。将compile
和optional
等字词视为该DSL中的关键字。除非您正在编写自己的DSL(而不是利用现有的DSL,这就是这个问题所针对的),所以不要认为类型与这些事物有关。
关于ctrl+space
的问题,除非你使用的是一个支持它的插件,否则Eclipse在这个上下文中不会做任何特别的事情。即使有插件支持,仍然会有限制,因为您可以定义自己的配置。如果您要定义名为“jeffrey”的配置并键入“jeff”后跟ctrl+space
,则IDE无法知道您是否希望将其转换为“jeffrey”。
我希望有所帮助。