Skip to content

Using a provider to set a DirectoryProperty or RegularFileProperty is too restrictive, and requires verbose workarounds #23708

@aSemy

Description

@aSemy

Expected Behavior

I am able to simply set a value into a DirectoryProperty.

interface MyPluginConfig {
  val targetDir: DirectoryProperty
  val targetFile: RegularFileProperty
}

val myPluginConfig = extensions.create<MyPluginConfig>("myPlugin").apply {

  targetDir.convention(project.providers.systemProperty("user.home").map { home ->
    file("$home/.cache/myPlugin")
  })
  
  targetFile.convention(project.providers.systemProperty("user.home").map { home ->
    file("$home/.cache/someFile")
  })
}

Current Behavior

I am not able to simply set a value into a DirectoryProperty.

interface MyPluginConfig {
  val targetDir: DirectoryProperty
  val targetFile: RegularFileProperty
}

val myPluginConfig = extensions.create<MyPluginConfig>("myPlugin").apply {
  
  // ERROR: None of the following functions can be called with the arguments supplied.
  targetDir.convention(project.providers.systemProperty("user.home").map { home ->
    project.file("$home/.cache/myPlugin")
  })
  // None of the following functions can be called with the arguments supplied.
  targetFile.convention(project.providers.systemProperty("user.home").map { home ->
    file("$home/.cache/someFile")
  })
}

Context

The workaround is really verbose, and is not intuitive at all.

interface MyPluginConfig {
  val targetDir: DirectoryProperty
  val targetFile: RegularFileProperty
}

val myPluginConfig = extensions.create<MyPluginConfig>("myPlugin").apply {

  targetDir.convention(project.providers.systemProperty("user.home").flatMap { home ->
    project.layout.dir(
      project.providers.provider {
        project.file("$home/.cache/myPlugin")
      }
    )
  })

  targetFile.set(providers.systemProperty("user.home").flatMap {
    project.layout.file(
      project.providers.provider {
        project.file(it) }
    )
  })
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    a:featureA new functionalityin:provider-apiproperty lazy provider MapProperty ListProperty DirectoryProperty

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions