Steve Ebersole
06/08/2022, 3:00 PMProperty#convention
and Property#map
... (I think I may have a general misunderstanding of convention and atempting to access its value). I have this:
hibernateVersionProperty = project.getObjects().property( String.class );
hibernateVersionProperty.convention( "N/A" );
...
project.getDependencies().add(
"implementation",
ormDsl.getHibernateVersionProperty().map( (ormVersion) -> Character.isDigit( ormVersion.charAt( 0 ) )
? "org.hibernate.orm:hibernate-core:" + ormVersion
: null
)
);
But this continually gives me a complaint when the build does not explicitly set this hibernate-version :
Caused by: org.gradle.api.internal.provider.MissingValueException: Cannot query the value of this provider because it has no value available.
Steve Ebersole
06/08/2022, 3:03 PMChris Lee
06/08/2022, 3:08 PMadd()
is eagerly evaluating that provider. See if addLater
works.Steve Ebersole
06/08/2022, 3:11 PMSteve Ebersole
06/08/2022, 3:11 PMproject.getDependencies().addProvider(
"implementation",
ormDsl.getHibernateVersionProperty().map( (ormVersion) -> Character.isDigit( ormVersion.charAt( 0 ) )
? "org.hibernate.orm:hibernate-core:" + ormVersion
: null
)
);
Steve Ebersole
06/08/2022, 3:12 PMSteve Ebersole
06/08/2022, 3:14 PMChris Lee
06/08/2022, 3:14 PMaddLater
is on the configuration:
implenentation.dependencies.addLater
…unsure how that relates to addProvider.
Yea, have seen the null
as wellSteve Ebersole
06/08/2022, 3:14 PMSteve Ebersole
06/08/2022, 3:15 PMSteve Ebersole
06/08/2022, 3:16 PMproject.getConfigurations().getByName( "implementation" ).addLater()
Chris Lee
06/08/2022, 3:16 PM// lazy initialize dependencies from packaging extension
packagingScripts.dependencies.addLater(packaging.packagingScript.map { dependencies.create("${it}@zip") })
Chris Lee
06/08/2022, 3:17 PMproject.getConfigurations().getByName( "implementation" ).get().addLater()
Steve Ebersole
06/08/2022, 3:18 PMSteve Ebersole
06/08/2022, 3:18 PMSteve Ebersole
06/08/2022, 3:18 PMSteve Ebersole
06/08/2022, 3:18 PMChris Lee
06/08/2022, 3:19 PMnamed
that has a provider. ok, that looks like it should work. addLater is documented on DomainObjectCollection as being there since 4.8. Not seeing any kotlin magic in there. This is the full context:
val packagingScripts: Configuration by configurations.creating
// lazy initialize dependencies from packaging extension
packagingScripts.dependencies.addLater(packaging.packagingScript.map { dependencies.create("${it}@zip") })
Chris Lee
06/08/2022, 3:20 PMproject.getConfigurations().getByName( "implementation" ).dependencies.addLater()
Steve Ebersole
06/08/2022, 3:20 PMSteve Ebersole
06/08/2022, 3:20 PMSteve Ebersole
06/08/2022, 3:26 PMproject.getConfigurations().getByName( "implementation" ).getDependencies().addLater(
ormDsl.getHibernateVersionProperty().map( (ormVersion) -> Character.isDigit( ormVersion.charAt( 0 ) )
? project.getDependencies().create( "org.hibernate.orm:hibernate-core:" + ormVersion )
: null
)
);
Same 😞Chris Lee
06/08/2022, 3:32 PMval prop = objects.property<String>()
prop.convention("N/A")
// this fails with expected error: Supplied String module notation 'N/A' is invalid. Example notations: 'org.gradle:gradle-core:2.2', 'org.mockito:mockito-core:1.9.5:javadoc'.
// dependencies.addProvider("implementation", prop.map { it })
// this fails with: Cannot query the value of this provider because it has no value available.
dependencies.addProvider("implementation", prop.map { null })
Has seen somewhere using null
to indicate a no-op.Chris Lee
06/08/2022, 3:34 PMnull
for N/A
input. It that null on the derived provider that is problematic…Steve Ebersole
06/08/2022, 3:34 PMChris Lee
06/08/2022, 3:35 PMChris Lee
06/08/2022, 3:37 PMSteve Ebersole
06/08/2022, 3:37 PMSteve Ebersole
06/08/2022, 3:37 PMSteve Ebersole
06/08/2022, 3:38 PMSteve Ebersole
06/08/2022, 3:38 PMChris Lee
06/08/2022, 3:38 PMimplementation micronautExtension.runtime.map { r ->
switch(r) {
case 'netty': (1)
return "io.netty:netty-buffer:4.1.75.Final"
case 'tomcat':
return "org.apache.tomcat.embed:tomcat-embed-core:10.0.18" (2)
default:
return null (3)
}
}
…but it doesn’t seem to work, trying it now.Steve Ebersole
06/08/2022, 3:39 PMSteve Ebersole
06/08/2022, 3:42 PMChris Lee
06/08/2022, 3:43 PMdependencies {
// fails with: Cannot query the value of this provider because it has no value available.
implementation( prop.map {
null
})
}
Steve Ebersole
06/08/2022, 3:46 PMSteve Ebersole
06/08/2022, 3:48 PM#set
and `#value`here?Steve Ebersole
06/08/2022, 3:49 PMChris Lee
06/08/2022, 3:50 PMSteve Ebersole
06/08/2022, 3:51 PMSteve Ebersole
06/08/2022, 3:51 PMChris Lee
06/08/2022, 3:52 PMvalue
allows chaining. I’ve used extension functions to provide this for clarity:
prop.value = something // assignment of a value
prop.from(otherProp) // from a provider of some sortSteve Ebersole
06/08/2022, 3:54 PMSteve Ebersole
06/08/2022, 3:55 PMSteve Ebersole
06/08/2022, 3:56 PMSteve Ebersole
06/08/2022, 4:00 PMChris Lee
06/08/2022, 4:08 PMnull
- but you can use addAllLater
to add a list of deps (empty list for no deps).
configurations.implementation.get().dependencies.addAllLater(prop.map {
if( it == "N/Addd") { listOf(dependencies.create("io.foo:default-dep:1.2.3")) }
else { emptyList() }
})
Steve Ebersole
06/08/2022, 4:10 PMSteve Ebersole
06/08/2022, 6:05 PM#listOf
here?Steve Ebersole
06/08/2022, 6:14 PM#emptyList
? Gradle seems to expect certain List impls. Collections#emptyList
/ Collections#singletonLit
e.g. give me
> class org.gradle.api.internal.provider.TransformBackedProvider cannot be cast to class org.gradle.api.internal.provider.CollectionProviderInternal (org.gradle.api.internal.provider.TransformBackedProvider and org.gradle.api.internal.provider.CollectionProviderInternal are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @29e235a1)
Chris Lee
06/08/2022, 6:24 PM["a", "b"]
. emptyList() is also Kotlin, would be []
iirc.Steve Ebersole
06/08/2022, 6:25 PMChris Lee
06/08/2022, 6:25 PMIterable
.Steve Ebersole
06/08/2022, 6:25 PMSteve Ebersole
06/08/2022, 6:26 PMChris Lee
06/08/2022, 6:27 PMSteve Ebersole
06/08/2022, 6:36 PMProvider<List<?>>
. It does not know because of the emptyListChris Lee
06/08/2022, 6:36 PMSteve Ebersole
06/08/2022, 6:36 PMSteve Ebersole
06/08/2022, 6:36 PMChris Lee
06/08/2022, 6:37 PMCollections.<String>emptyList()
for get the right type.Steve Ebersole
06/08/2022, 6:37 PMSteve Ebersole
06/08/2022, 6:37 PMChris Lee
06/08/2022, 6:38 PMSteve Ebersole
06/08/2022, 6:38 PMSteve Ebersole
06/08/2022, 6:39 PMChris Lee
06/08/2022, 6:40 PMSteve Ebersole
06/08/2022, 6:40 PMSteve Ebersole
06/08/2022, 6:41 PMChris Lee
06/08/2022, 6:41 PMChris Lee
06/08/2022, 6:44 PMconfigurations.implementation.get().dependencies.addAllLater(prop.map {
if( it == "N/Addd") { listOf(dependencies.create("io.foo:default-dep:1.2.3")) }
else { emptyList() }
})
Steve Ebersole
06/08/2022, 6:45 PMChris Lee
06/08/2022, 6:45 PMSteve Ebersole
06/08/2022, 6:50 PMproject.getDependencies().add(
"implementation",
ormDsl.getUseSameVersion().map( (use) -> use
? "org.hibernate.orm:hibernate-core:" + HibernateVersion.version
: null
)
);
Steve Ebersole
06/08/2022, 6:50 PMSteve Ebersole
06/08/2022, 6:51 PMChris Lee
06/08/2022, 6:51 PMSteve Ebersole
06/08/2022, 6:51 PMChris Lee
06/08/2022, 6:51 PMSteve Ebersole
06/08/2022, 6:51 PMSteve Ebersole
06/08/2022, 6:51 PMSteve Ebersole
06/08/2022, 6:52 PMProperty<Boolean
just indicating whether the users wants tisSteve Ebersole
06/08/2022, 6:52 PMSteve Ebersole
06/08/2022, 6:53 PMProperty<String>
v. Property<Boolean>
would make any difference thoughSteve Ebersole
06/08/2022, 6:54 PMChris Lee
06/08/2022, 6:54 PMval prop = objects.property<Boolean>()
prop.convention(false)
// fails with: Cannot query the value of this provider because it has no value available.
dependencies.add("implementation", prop.map { null })
…at least in this repro (Kotlin DSL, Gradle 7.4.2).Steve Ebersole
06/08/2022, 6:54 PMSteve Ebersole
06/08/2022, 6:55 PMSteve Ebersole
06/08/2022, 6:55 PMSteve Ebersole
06/08/2022, 6:55 PMChris Lee
06/08/2022, 6:55 PM