首页 > 解决方案 > 将日志记录添加到设置键时设置不能依赖于任务

问题描述

我正在更新sbt plugin一个SettingKey来自fm-sbt-s3-resolver. 我在明确添加所需设置作为问题的副作用方面取得了一些进展:

从 sbt 插件记录

object MyPlugin {
  override def requires = S3ResolverPlugin
  override def trigger = allRequirements

override lazy val globalSettings = Seq(
    resolvers ++= repos,
    publishMavenStyle := true,
    S3ResolverPlugin.autoImport.s3CredentialsProvider := {bucket: String =>
      new AWSCredentialsProviderChain(
        new EnvironmentVariableCredentialsProvider(),
        PropertyFilesCredentialProvider.create(bucket, streams.value.log)
      )
    }
  )
}

当我尝试添加loggingusingstreams.value.log时,sbt 抛出错误:

[error]  A setting cannot depend on a task
[error] PropertyFilesCredentialProvider.create(bucket, streams.value.log)

标签: scalasbt

解决方案


在这种情况下,您需要依赖于 settingsLog而不是 task streams

import sbt._
import sbt.Keys._

object Logs extends AutoPlugin {

  object autoImport {
    val settingLog = settingKey[Unit]("Uses setting sLog")
    val taskLog = taskKey[Unit]("Uses task streams log")
  }

  import autoImport._

  override def trigger = allRequirements

  override def projectSettings: Seq[Def.Setting[_]] = Seq(
    settingLog := { sLog.value.info("Logging on settings execution") },
    taskLog := { streams.value.log.info("Logging on task execution") }
  )
}

不同之settingLog处在于它会在 sbt 启动时记录。

~/w/t/stackoverflow $ sbt
[info] Logging on settings execution

重复调用settingLog将不再产生任何日志记录。但是taskLog每次调用它都会打印一个日志


推荐阅读