Radosław Panuszewski
05/31/2024, 8:03 PMRadosław Panuszewski
05/31/2024, 8:03 PMapplication
plugin to be deployable apps, while those with java-library
to be libraries. In the CI pipeline, we inject a init.gradle.kts
script which detects the “software type” and configures the Maven publications accordingly.
As an experiment, I would love to try out how the Declarative Gradle fits into our configuration and share some feedback with you. I managed to set up a simple build with the javaApplication
software type, but my issue is that it works only when the buildscript file is named build.gradle.dcl
. During your KotlinConf talk, you mentioned that the new DSL will be usable also in traditional build.gradle.kts
files for easier migration. In my case, it’s also about the IDE support - if the org.gradle.experimental.jvm-ecosystem
plugin registered the javaApplication
extension to be available in traditional kts
buildscripts, I would get a basic IDE support basically for free. Would you consider introducing such a change? IMO it would make the early adopter expierience a lot smoother. I know your current top priority is Android, but I can offer my contribution in case that’s ok for you 😉
Alternatively, maybe I could install some SNAPSHOT version of the Declarative Gradle IntelliJ Plugin?Sterling
As an experiment, I would love to try out how the Declarative Gradle fits into our configuration and share some feedback with you.Your init script would still work. Are you looking for how your init script would be replaced or how users would change their project build scripts?
During your KotlinConf talk, you mentioned that the new DSL will be usable also in traditional build.gradle.kts files for easier migration. In my case, it’s also about the IDE support - if the org.gradle.experimental.jvm-ecosystem plugin registered the javaApplication extension to be available in traditional kts buildscripts, I would get a basic IDE support basically for free.This should be possible today, but you need to apply the appropriate plugin yourself. IOW, you can't rely on Gradle to automatically apply the right plugin by just referencing the software type. We're going to be doing more in this area over the next couple of weeks so that reusable conventions declared in a settings.gradle.dcl work for declarative and non-declarative files.
Alternatively, maybe I could install some SNAPSHOT version of the Declarative Gradle IntelliJ Plugin?Unfortunately, I think everything is baked deep into Android Studio right now. You can get some syntax highlighting by associating .dcl to Kotlin scripts, but none of the auto-complete will work.
Radosław Panuszewski
06/03/2024, 12:05 AMorg.gradle.experimental.java-application
plugin in my build.gradle.kts
did the trick and the javaApplication
extension is now available 🙂
Though there is a similar problem with the settings.gradle.kts
file. The conventions
block is usable only in the dcl
version of the settings script. After digging into the code I see that conventions
is not registered as Settings extension and it is only recognised in the dcl
file due to presence of the ConventionsInterpretationSequenceStep
in the interpretation sequence. It seems the conventions
extension (together with nested extensions per software type) could be registered in the SoftwareTypeRegistrationPluginTarget
via applying the visitor like below:
class SoftwareTypeConventionRegisteringVisitor implements StaticMetadataVisitor {
@Override
public void visitRoot(...) {
if (extensions.findByName("conventions") == null) {
extensions.create("conventions", ConventionsExtension.class);
}
}
@Override
public void visitNested(...) {
propertyMetadata.getAnnotation(SoftwareType.class).ifPresent(softwareType -> {
ExtensionAware conventions = (ExtensionAware) extensions.findByName("conventions");
conventions.getExtensions().create(softwareType.name(), softwareType.modelPublicType());
});
}
}
Actually, on branch gh/declarative/dependencies-conventions
this visitor already exists but it only adds the software type extensions as top-level Settings extensions. Is there any reason not to have this visitor?
A bunch of my additional observations:
• among the published declarative-gradle plugins, one is missing: org.gradle.experimental.declarative-common
. It effectively makes the published plugins unusable, forcing users to clone the declarative-gradle repo and connect it via includeBuild
. Is the declarative-common
plugin not published on purpose? If not, then you could consider publishing it 😉
• mavenLocal()
is not accepted in pluginManagement.repositories
for the settings.gradle.dcl
file - it would be helpful to have it there as an alternative to includeBuild