从SBT插件记录

问题描述 投票:2回答:1

我用的是s3 resolver plugin为SBT。

我已经改变了凭据提供:

lazy val s3CredentialsProvider = {bucket: String =>
    new AWSCredentialsProviderChain(
      new EnvironmentVariableCredentialsProvider(),
      PropertyFilesCredentialProvider.create(bucket)
    )
  }

其中PropertyFilesCredentialProvider是一个自定义提供商。

我已经做了以下地方:

  • 我们增加了一个ConsoleLogger使用sbt.util.internal
  • 我们增加了一个System.out.println

代替。

我已经发布了插件,并一直在使用它的另一个插件被。它看起来像正在使用我的插件,因为解析器会尝试每一次使用不同的快捷键,但我们不能从我们班看到日志。

我们如何才能增加logging当我们在AutoPlugin有代码?

提供程序的代码如下所示:

进口java.io. {文件的FileInputStream,为InputStream}进口java.util.Properties

import com.amazonaws.auth.{AWSCredentials, AWSCredentialsProvider, BasicSessionCredentials}
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder
import com.amazonaws.services.securitytoken.model.{AssumeRoleRequest, AssumeRoleResult, Credentials}

/** Creates a credential provider that reads a `roleArn` property from a file
  * and assumes the role using STS.
  *
  * This is based on https://github.com/frugalmechanic/fm-sbt-s3-resolver/blob/master/src/main/scala/fm/sbt/S3URLHandler.scala#L84
  *
  * @param file Properties file holding the ROLE_ARN for the project.
  */
class PropertyFilesCredentialProvider(file: File)
  extends AWSCredentialsProvider {

  private val ROLE_ARN_KEY: String = "roleArn"
  private val AWS_REGION: String = "<AWS_REGION>"

  protected def getRoleArn: String = {
    val is: InputStream = new FileInputStream(file)
    try {
      val props: Properties = new Properties()
      props.load(is)
      props.getProperty(ROLE_ARN_KEY)
    } finally is.close()
  }

  def createAWSCredentials(credentials: Credentials): AWSCredentials = {
    System.out.println("Retrieved AWS Session Token and Credentials for assuming role")
    new BasicSessionCredentials(credentials.getAccessKeyId,
      credentials.getSecretAccessKey,
      credentials.getSessionToken)
  }

  def assumeRole(roleArn: String): AssumeRoleResult = {
    System.out.println(s"Making a request to AWS STS with the roleArn: $roleArn to assume a role")
    val stsClient = AWSSecurityTokenServiceClientBuilder
      .standard
      .withRegion(AWS_REGION)
      .build

    val assumeRoleRequest = new AssumeRoleRequest
    assumeRoleRequest.setRoleArn(roleArn)
    stsClient.assumeRole(assumeRoleRequest)
  }

  override def getCredentials: AWSCredentials = {
    val roleArn = getRoleArn
    if (roleArn == null || roleArn == "") {
      System.out.println(s"Key of name $ROLE_ARN_KEY was not found in file at ${file.getAbsolutePath}")
      return null
    }
    System.out.println(s"$ROLE_ARN_KEY was read from ${file.getAbsolutePath} successfully")
    val assumeRoleResult = assumeRole(roleArn)
    System.out.println("Request to assume role using AWS STS successful")
    createAWSCredentials(assumeRoleResult.getCredentials)
  }

  override def refresh(): Unit = {}
}

object PropertyFilesCredentialProvider {

  private val DOT_SBT_DIR: File =
    new File(System.getProperty("user.home"), ".sbt")

  /** Uses a bucket specific propertyfile to read AWS `roleArn` from and provides it
    * to the PropertyFilesCredentialProvider.
    *
    * @param bucket Name of the S3 bucket.
    * @return a PropertyFileCredentialProvider
    */
  def create(bucket: String): PropertyFilesCredentialProvider = {
    val fileName = s".${bucket}_s3credentials"
    System.out.println("Using the Property Files Credential Provider")
    System.out.println(s"Reading $fileName for AWS Credentials ")
    val file: File = new File(DOT_SBT_DIR, fileName)
    new PropertyFilesCredentialProvider(file)
  }
}

UPDATE

尝试使用streams.value.log失败,出现错误:

`value` can only be called on a task within a task definition macro, 
 such as :=, +=, ++=, or Def.task.
[error]   val logger = streams.value.log
[error]   

尝试使用ConsoleLogger这是一个子类Logger的,但在类中实例化。它的适用方法被调用是这样的:

val logger = sbt.internal.util.ConsoleLogger(System.out)
logger.info("s"Key of name $ROLE_ARN_KEY was not found in file at ${file.getAbsolutePath}"")

上述类的内部。这并没有输出的日志,要么。

我创建了两个记录器,一个用于类,另一个用于伴侣对象作为成员,而不是类延伸AutoPlugin内。

scala sbt
1个回答
1
投票

这是添加日志上课的方式,你为你的AutoPlugin定义

import sbt._
import sbt.Keys._

object TestPlugin extends AutoPlugin {

  class SomeClassThatNeedsLogger(logger: Logger) {
    def doSomeLogging(): Unit = {
      logger.info("It logs")
    }
  }

  object autoImport {
    val someClassThatNeedsLoggerHolder = taskKey[SomeClassThatNeedsLogger]("Holds instance of SomeClassThatNeedsLogger")
    val runSomeClassThatNeedsLogger = taskKey[Unit]("Runs SomeClassThatNeedsLogger")
  }

  import autoImport._

  override def trigger = allRequirements

  override def projectSettings: Seq[Def.Setting[_]] = {
    Seq(
      someClassThatNeedsLoggerHolder := new SomeClassThatNeedsLogger(streams.value.log),
      runSomeClassThatNeedsLogger := someClassThatNeedsLoggerHolder.value.doSomeLogging()
    )
  }
}

并运行给了我们一个日志条目:

> runSomeClassThatNeedsLogger
[info] It logs
[success] Total time: 0 s, completed Feb 6, 2019 9:47:15 AM

对错误你得到一些注意事项

value只能被称为一个任务定义宏内的任务, 如:=,+ =,++ =,或Def.task。

这告诉你,streams.value只能在像someClassThatNeedsLoggerHolder := new SomeClassThatNeedsLogger(streams.value.log)任务定义使用

ConsoleLogger使用sbt.util.internal

作为包顾名思义,这是一个内部封装且受SBT的下一个版本的变化。它不应该在你的插件定义来使用。

© www.soinside.com 2019 - 2024. All rights reserved.