Martin
08/12/2025, 8:56 AMPhilip W
08/20/2025, 4:26 PMWin Naing
09/15/2025, 9:13 AMPratikshit singh
10/28/2025, 3:56 AMVampire
11/17/2025, 1:58 PMSettings.defaults something about DCL?
I wonder reading about it in the Upgrading from 8.13 and earlier section, and that there are changes from 8.10, while it was nowhere mentioned before, also not in the 8.10 release notes, and from looking at it, it seems related to DCL.
If so, maybe it should maybe be explicitly marked as DCL-related in the upgrade notes?Philip W
11/28/2025, 7:58 PMPhilip W
02/13/2026, 5:39 AMJendrik Johannes
03/19/2026, 11:52 AMBuildModel as entry point, what should I use to implement the structure of my DSL inside it? I basically already have the "grammar" and now I wand to "implement" it with DCL in the most idiomatic/minimal way possible. But I can't seem to find the answer to basic questions like:
• Do I use new or should I inject ObjectFactory (or should I never have to instantiate anything myself anymore?)
• Do I still need Property/Provider ? And if yes where (String vs Property<String>)
• When do I need which annotation (such as @Nested and @Adding )
• Is NamedDomainObjectContainer something like a standard that should be used? Or can/should I use my own clean data structures?
• What's managed by Gradle and what do need to implement "by hand". E.g. would I do action.execute(element) in my code or is that already a sign that I am doing something "wrong", because in DCL Gradle can do these things for me.
• ...
The problem might be that I am thinking too much in traditional Gradle terms. I am coming from the metal model where I design a DSL with traditional Gradle extensions. There I always follow certain patterns to have a "block" in the DSL - like public void blockName(Action<BlockType> action) . I have difficulties to understand what should be done different when doing the same with DCL.
Sorry if this is a stupid question. 🙂Philip W
04/28/2026, 5:26 AMmyMap += mapOf(„foo“ to providers.gradleProperty(„bar“))Sebastian Schuberth
04/30/2026, 12:20 PMsettings.gradle.dcl?
dependencyResolutionManagement {
versionCatalogs {
create("ktorLibs") {
from("io.ktor:ktor-version-catalog:3.4.2")
}
}
}Javi
05/02/2026, 12:36 AMdefaults is enough:
// settings.gradle.dcl
defaults {
semver {
tagPrefix = "v"
}
}
That will end up with a lot of empty lambdas (depending on the formatter, they can be expanded and wasting vertical space.
// build.gradle.dcl
semver { }
I think semver() or semver should be supported.
Indeed the default formatter is already changing it to
semver {
}Javi
05/03/2026, 1:34 PMimplementation(…) can be used but the APIs are internal).Philip W
05/05/2026, 7:59 AMJavi
05/05/2026, 1:13 PMPhilip W
05/06/2026, 6:28 AMinterface DependenciesExtension : Dependencies {
val api: DependencyCollector
val implementation: DependencyCollector
val myLibVersion: Property<String> // has a convention value
fun libA(): Provider<ExternalModuleDependency> {
return myLibVersion.map { dependencyFactory.create("org.example.foo:bar:$it") }
}
fun libB(): Provider<ExternalModuleDependency> {
return myLibVersion.map { dependencyFactory.create("org.example.foo:baz:$it") }
}
}Javi
05/06/2026, 10:05 AMdefaults is possible now?
Relatively unrelated to Gradle Declarative, but settings plugins helped to just aggregate all modules into one when you want to aggregate without having to manually put all those foo(implementation(...)) in that module (Dokka, etc).
Would we get some way to "auto aggregate" the relevant modules into one on those cases, or should we keep doing the wire in a settings plugin? If this is the case, some utility function that does the trick easily (and with project isolation support) would be really nice.Javi
05/07/2026, 9:07 AMkotlin
semver {
tagPrefix = "p"
}
kotlin {
semver {
mapVersion = Semver.Version_KotlinVersion
}
}
But maybe there is a better option to model this. Any suggestion?Philip W
05/07/2026, 12:58 PMapply method. Of course I could create an unsafe Definition but I would like not.
What about adding a default method to ProjectFeatureApplyAction called convention to add convention values to the definition before the script is evaluated?Javi
05/08/2026, 12:35 PM@Builder pattern in DCL cannot chain two function calls?
I am able to do
foo = bar
.baz(...)
But if I do
foo = bar
.baz(...)
.quux(...)
it fails with ValueFactoryCallWithComplexReceiverJavi
05/09/2026, 8:12 PMIgnore all red errors, the file is inside a resource folder and consumed in a functional test, so autocomplete does not work there.
Javi
05/11/2026, 8:46 AMproject.version using a lazy property as it is currently Any.
If the Android plugin support a Property<String> for the version name, I can't assign or reuse the project.version or expose a function that just return a lazy property to avoid using it in configuration phase.
Obviously, I can support all third party plugins implementations manually in my plugin, but that would be pretty annoying/not scalable. Any workaround for this?Javi
05/12/2026, 8:44 AMplugins {
id("org.jetbrains.kotlin.ecosystem")
id("com.example.kotlin.***")
}
Would it have that structure? *** can be feature or features?Philip W
05/15/2026, 1:28 PMpackages {
package("Foo") {}
}
functions {
function("Bar") {
package = ???
package = packages.named("Foo")
}
In Kotlin, I would assign Foo to a variable. But both of them, variable or named is not supported.Javi
05/17/2026, 9:34 AMPhilip W
05/19/2026, 4:12 AMTaskRegistrar, you can easily get the attached project instance in a safe ApplyAction:
var project: Project? = null
taskRegistrar.register("hack") {
project = this.project
}.get()
project!!
Will this hack be "supported" due to Task.getProject or do you plan to introduce a safe Task super interface (maybe without antBuilder and property method too)?Jendrik Johannes
05/26/2026, 12:31 PMgradle.kts files does still not seem to be available.Javi
05/28/2026, 1:14 PMJavi
06/03/2026, 10:28 AMDev Ops
06/03/2026, 2:29 PMPhilip W
07/14/2026, 7:46 AM