scala - 将日志记录添加到设置键时设置不能依赖于任务
问题描述
我正在更新sbt plugin
一个SettingKey
来自fm-sbt-s3-resolver
. 我在明确添加所需设置作为问题的副作用方面取得了一些进展:
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)
)
}
)
}
当我尝试添加logging
usingstreams.value.log
时,sbt 抛出错误:
[error] A setting cannot depend on a task
[error] PropertyFilesCredentialProvider.create(bucket, streams.value.log)
解决方案
在这种情况下,您需要依赖于 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
每次调用它都会打印一个日志
推荐阅读
- python - 使用 Web 提供程序复制本地 Web 开发环境(Python、Flask、SQL)的最简单方法?
- regex - 意大利语标签的正则表达式
- mysql - MySQL将来自两个不同表的id依赖字段插入第三个表
- ios - 如何从包含特定标题的日历中获取事件?
- python - 我如何在没有终端命令的情况下运行 vscode
- javascript - 使用 React Router 根据 React 中的 JSON 返回值路由到特定视图
- mysql - 在mysql中保存base64字符串
- html - 向下滚动时,可以在我的侧边栏上方看到一个空格
- javascript - React useState() 数组未更新
- ansible - Ansible 和 Terraform 调试