SBT: выполнить задачу, используя другое значение задачи

Я переопределяю свои тесты, чтобы предоставить некоторые аргументы от конфигурации до набора тестов:

Это отрывок из моего Build.scala:

object Build extends Build {
  lazy val myProject = (project in file("my_project")).settings(
    test in Test := myProjectTest.value
  )

  val myProjectTest = Def.task {
    (testOnly in Test).toTask(" tests.Suites -- " +
      s"-Ddbserver=localhost " +
      s"-Ddbport=3306 ").value
  }
}

Это работает хорошо.

Теперь я хотел дать своему тестовому набору имя артефакта, подобного этому:

val myProjectTest = Def.task {
  val art = (Keys.artifactPath in (Compile, packageBin)).value

  (testOnly in Test).toTask(" tests.Suites -- " +
    s"-Dartifact=${art.getCanonicalPath} " +
    s"-Ddbserver=localhost " +
    s"-Ddbport=3306").value
}

Но это показывает следующее сообщение об ошибке:

[error] /tmp/aa/project/Build.scala:17: Illegal dynamic reference: art
[error]     s"-Dartifact=${art.getCanonicalPath} " +
[error]                    ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

Я кое-что знаю о внутренностях SBT, макросах, графике зависимостей задач, и мне даже удалось решить некоторые из моих задач с помощью областей. Здесь я попытался использовать карту или flatMap на (Keys.artifactPath in (Compile, packageBin)) но не может достичь желаемого результата. Всякий раз, когда я пытаюсь получить доступ .value я получил Illegal dynamic reference,

Пожалуйста, ведите меня. Мне просто нужно передать значение задачи другим параметрам (inputKey) параметров.

Версия SBT: 0.13.5

2 ответа

Решение

Методом проб и ошибок я сделал то, что хотел в конце концов, используя Def.taskDyn (динамическое задание):

object Build extends Build {
  lazy val myProject = (project in file("my_project")).settings(
    test in Test := myProjectTest.value
  )

  lazy val myProjectTest = Def.taskDyn {
    val art = (Keys.artifactPath in (Compile, packageBin)).value

    (testOnly in Test).toTask(" tests.Suites -- " +
      s"-Dartifact=${art.getCanonicalPath} " +
      s"-Ddbserver=localhost " +
      s"-Ddbport=3306")
  }
}

Я никогда не видел, чтобы указать параметры теста через .toTask,

Вы хотите увидеть, если testOptions in Test у тебя работает? См. Раздел " Опции " документа "Тестирование".

Другие вопросы по тегам