gpt4 book ai didi

kotlin - 在 Gradle 中使用自定义 SourceSet

转载 作者:行者123 更新时间:2023-12-02 12:49:58 27 4
gpt4 key购买 nike

根据this from the official docsthis SO answer ,定义一个新的源集应该像(在 kotlin 中)一样简单:

sourceSets {
create("demo") {
compileClasspath += sourceSets.main.get().output
}
}

第二个引用文献还明确声称现在可以将其用于构建 jar。然而,虽然上面没有抛出错误,但实际上尝试在任何地方使用新的源集确实会。最小示例(使用 gradle init -> "kotlin application"和项目名称 "foobar"生成):
plugins {
id("org.jetbrains.kotlin.jvm").version("1.3.21")
application
}

repositories {
jcenter()
}

dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}

application {
mainClassName = "foobar.AppKt"
}

sourceSets {
create("demo") {
compileClasspath += sourceSets.main.get().output
}
}

我删除了 test 的配置源集,因为它在这里不相关。 src目录看起来像这样(这有点不标准,但我认为可以讨论):
src
├── demo
│   └── Demo.kt
└── main
└── foobar
└── App.kt

理想情况下,我希望拥有完全独立的源代码树(但这个问题并不是专门针对这个问题的)。相对于上面的配置,这个构建是有意义的,但这并不是真正的目标。为此,我想添加一个或两个自定义 jar.1

不幸的是, demo无法在 gradle 脚本中引用源集。
val jar by tasks.getting(Jar::class) {
manifest { attributes["Main-Class"] = "DemoKt" }

// HERE IS THE PROBLEM:
from(sourceSets["demo"].get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}

这个 fat jar 子任务定义是 taken from the gradle docs而且我以前用过很多。
照原样,gradle 扼流圈:
Script compilation errors:


Line 28: from(sourceSets["demo"].get().output)
^ Unresolved reference.

如果我将该行更改为:
from(sourceSets.demo.get().output)
sourceSets.main 使用的语法是什么? ,则错误变为:
 Line 28:      from(sourceSets.demo.get().output)
^ Unresolved reference: demo

我应该如何使用自定义源集?

  • 我知道 gradle subproject模式并用它来做很多相同的事情,但我更喜欢简单的单独源集解决方案,我认为这符合上述 in that doc 的所有三个标准.
  • 最佳答案

    sourceSets属性(Project 的扩展属性)返回 SourceSetContainer扩展 NamedDomainObjectContainer<SourceSet> .后一个接口(interface)定义了 get(String) (运算符(operator)扩展功能),它允许您使用 ["..."]句法。该方法返回 T直接,这意味着您应该只使用:

    from(sourceSets["demo"].output)

    您必须使用 get() 的原因使用 sourceSets.main 时是因为你得到一个 NamedDomainObjectProvider<SourceSet>它包装了源集。

    您还可以通过委托(delegate)获取自定义源集
  • 创建时:

    val demo by sourceSets.creating { /* configure */ }
  • 或者在创建它之后的一段时间:

    val demo by sourceSets
  • 关于kotlin - 在 Gradle 中使用自定义 SourceSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62265372/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com