问题标签 [kotlin-dsl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
36 浏览

kotlin - Kotlin DSL:几个域和它们之间的引用

我学习 kotlin DSL 并尝试描述我的领域对象。例如,我在 github ( VillageDSL ) 上阅读了非常简单的示例,发现它们非常有用:

或者

和互联网上的其他例子。

所有这些示例都展示了如何在单个空间中描述单个域。但真正的域更复杂,它们之间有联系。我希望 DSL 用户能够通过自动完成、验证等从另一个 DSL 引用对象。

I. 例如,我有字典:

我想参考这些书:

我可以在运行时进行这样的验证:

整个模型将保持一致,但在设计时用户必须手动输入 ISBN ( $.shelf.book.isbn)。

二、另一种变体。我在字典中这样描述每一本书:

这个变体对管理这本词典的用户不太友好,但对参考这些书的用户更友好:

可以在设计时使用自动完成和验证工作。

三、我可以想象一些组合变体:字典像变体“I”($.books.book)一样管理,然后是代码生成的结构,如变体“II”(val book0321712943 = ... val book9781680507935 ...)。这种代码生成也是手动/中间操作,它不允许在没有项目构建等情况下立即使用字典实体。

所有这些变体都有明显的缺点......

所以我的问题是关于描述相关 DSL 的最佳实用方法和模板。

0 投票
0 回答
112 浏览

android - 如何在 AGP 7.x 中定义新的 sourceSet 类型

我正在尝试在build.gradle.ktsAGP 7.0.2 中实现这种结构buildSrc

就像内置的jniLibs.

经过一番研究,我从protobuf-gradle-plugin中找到了一个解决方案并转译为 Kotlin (buildSrc/src/main/kotlin/com/example/ExamplePlugin.kt):

但为了让 DSL 按预期工作,应将以下代码添加到buildSrc/src/main/kotlin/com/example/AndroidSourceSetExtension.kt

然后在app/build.gradle.kts

我还没有测试它是否真的有效。只需运行assembleDebug没有错误。但

  1. 它实际上创建了 aSourceDirectorySet而不是AndroidSourceDirectorySet, by project.objects.sourceDirectorySet。那么我该如何创建AndroidSourceDirectorySet呢?
  2. 虽然我已经应用了插件,但我必须导入com.example.pythonLibs,所以如何避免这种情况。
  3. 它仅适用于闭包语法 as pythonLibs { srcDir() },而不适用于val语法 aspythonLibs.srcDir()因为我不知道如何使用val类型成员扩展接口。
0 投票
0 回答
96 浏览

android - Android Studio 创建 buildSrc 但在 build.gradle.kts 实现中找不到

毕业版本

buildSrc/src/build.gradle.kts

implementation 没有找到

我克隆 github 线圈项目它可以运行并且可以找到实现

我需要帮助

0 投票
1 回答
60 浏览

kotlin - 在 kotlin 中,这种语法是什么:“fun ClassName.funcName(): (Type ) -> Type = {fun body}”

编辑:它是什么以及它是如何工作的?这是一种 kotlin dsl 语言。

嗯,这是我找到的实现之一,还可以查看此链接的具体语法:https ://dzone.com/articles/the-complete-custom-gradle-plugin-building-tutoria

如果您将其称为“ .filter(...)”中的参数,“(文件)”语法中会发生什么,它会自动接收参数吗?

0 投票
0 回答
31 浏览

android - Gradle Matching fallbacks 使构建速度变慢

构建 android 多模块项目时遇到问题。

我使用 kotlin 脚本进行构建,例如自爆。

这个模块是一个动态特性模块。该动态功能模块取决于应用程序模块。

当我在应用程序模块中选择 b 变体时,Gradle 也会运行“a”任务。

它使构建缓慢。这是正常的构建过程吗?(我认为应该只运行任务“b”)。

0 投票
1 回答
130 浏览

kotlin - grpc kotlin 插件不生成 dsl 代码

我有一个使用 gradle 和 kotlin DSL 的现有项目。我已经使用 gradle build 设置了 protobuf 代码自动生成。

生成了 Kotlin grpc 代码,我可以使用流和协程来实现我的后端。

但是没有生成 kotlin DSL 代码。所以我目前只剩下使用详细的样板驱动构建器模式来创建我的对象。

下面是我的 protobuf 插件设置。

我在这里错过了什么吗?

0 投票
0 回答
72 浏览

android - Android Studio:在创建新模块时添加 build.gradle.kts(Kotlin DSL 脚本)

最近我已将所有构建脚本迁移到 Kotlin DSL。

当我在 Android Studio 中添加一个新模块时,我得到了用 Groovy 编写的自动生成的构建脚本。

如何更新 Android Studio 新模块模板以使用用 Kotlin DSL 编写的自动生成的构建脚本?

谢谢

0 投票
1 回答
72 浏览

maven - 如何在 TeamCity 中为 Kotlin DSL 项目指定 Maven settings.xml

因此,您可以settings.xml在 TeamCity 中拥有 Maven 项目,Administration -> Project -> Maven Settings.

您还可以将项目配置存储为 Kotlin DSL,它基本上是存储.teamcity在 VCSROOT 下的 Maven 项目。它甚至可以使用外部库作为依赖项。

但是,这个 Maven 项目不会使用settings.xml上述任何内容,因此它不能进入​​受 HTTP auth 保护的内部 Maven 存储库。有没有办法settings.xml为 Kotlin DSL 配置项目指定文件?是否可以将该文件与 pom.xml 放在一起?在这种情况下,它会从相应的 TeamCity 选项卡中获取代币吗?

0 投票
0 回答
53 浏览

android - Android Jetpack Navigation Kotlin DSL 是否支持具有多个堆栈的底部导航?

我正在使用最新的 Jetpack 导航,并原生支持多堆栈进行底部导航:https ://medium.com/androiddevelopers/navigation-multiple-back-stacks-6c67ba41952f ,它工作正常。对我来说唯一的限制是我必须在 navigation.xml 中定义所有导航并且不能在运行时更改它。

显然我发现有一个 Kotlin DSL 用于以编程方式构建导航图:https ://developer.android.com/guide/navigation/navigation-kotlin-dsl

不幸的是,我找不到任何使用此 Kotlin DSL 进行多堆栈底部导航的示例。

0 投票
1 回答
52 浏览

gradle - gradle kotlindsl 将逻辑提取到外部脚本

将 gradle 构建代码块提取到外部脚本的推荐方法是什么?请注意,这些脚本应该支持对 gradle 项目、extra 等的引用。所以 - 在 buildSrc 中编译 kt 文件不是我想要的。

我尝试创建类似的文件logger.gradle.kts,这些文件似乎“知道”项目 ref / compile,但是fun我在其中编写的任何内容在主构建文件中都不可引用,尽管我这样应用:

apply (from = "logger.gradle.kts")

作为构建的一部分,我得到的错误是:

Unresolved reference: logInfo-在logInfo哪里。funlogger.gradle.kts

这是我正在使用的记录器文件:

以及 build.gradle.kts 中的用法:

并像这样调用:

该方法失败:

注意:如果我将函数添加到extra(这是我在 hos 某处看到的在脚本文件之间公开方法的建议):

然后它失败了: