gradle - Gradle Kotlin DSL:获取另一个项目的 sourceSet
问题描述
目前,我们正在尝试将现有build.gradle
脚本迁移到新的 Kotlin DSL。现在,我们正在为jar
任务配置而苦苦挣扎。
我们的项目是一个简单的多项目。假设我们已经Core
和使用Plugin
了. 现在,在构建时,目标 jar 应该包含来自.Plugin
Core
Plugin
Core
这是它之前的样子:
jar {
from sourceSets.main.output
from project(':Core').sourceSets.main.output
}
这是我们目前使用 Kotlin DSL 的解决方案:
val jar: Jar by tasks
jar.apply {
from(java.sourceSets["main"].allSource)
from(project(":Core").the<SourceSetContainer>()["main"].allSource)
}
然而,上面的例子只是给了我一个Extension of type 'SourceSetContainer' does not exist. Currently registered extension types: [ExtraPropertiesExtension]
错误。我还尝试了我发现的其他代码片段,但到目前为止它们都没有工作。
我也试过这个(就像第一个答案中建议的那样):
val jar: Jar by tasks
jar.apply {
from(java.sourceSets["main"].allSource)
from(project(":Core").sourceSets.getByName("main").allSource)
}
但随后 IDE(以及jar
任务)认为sourceSets
不可用:Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public val KotlinJvmProjectExtension.sourceSets: NamedDomainObjectContainer<DefaultKotlinSourceSet> defined in org.gradle.kotlin.dsl
.
我希望有人可以帮助我们,因为花费数小时进行配置而不是编写任何有用的代码非常令人沮丧。
非常感谢您提前。
解决方案
您可以SourceSetContainer
通过
project(":Core").extensions.getByType(SourceSetContainer::class)
它似乎<T : Any> Project.the(extensionType: KClass<T>): T
在convention
项目中,而在项目中val Project.sourceSets: SourceSetContainer get()
看起来extensions
ExtensionContaier
。这有点奇怪,因为文档中the
说“返回指定类型的插件约定或扩展”。
请注意,您可能需要在 中进行 sourceSet 操作gradle.projectsEvaluated
,否则如果尚未评估相应的项目,则可能尚未配置有问题的 sourceSet。
推荐阅读
- python - 在 python 中使用日期和时间存储 OHLC 数据
- python-3.x - Python session.get 响应使用“latin-1”而不是“utf-8”编码
- jquery - Jquery Mobile:listview 远程自动完成官方演示不起作用
- c++ - gtkmm 多点触控设备无法识别 (Windows)
- powerbi - PowerBI:使用表中各个列的 SelectedValue 创建表
- javascript - Angular + Firebase - 组件在页面刷新时不保持身份验证状态
- flutter - 无法使用 HttpClient 从 Flutter Web 发布
- reactjs - Promise.all 错误 - 类型 '(Video | undefined)[]' 不可分配给类型 'Video[]'
- python - UnicodeEncodeError:“latin-1”编解码器无法在位置 14 编码字符“\u2013”:序数不在范围内(256)
- cpu - 当指令间的取指周期不同时,如何知道控制信号?