Крутой и мощный аспект sbt заключается в том, что генерируемое им определение сборки является обычным Scala приложением, означающим, что мы можем проверять его объекты, как и в любом другом Scala приложении, просто вызывая методы-члены для запроса их штат. Выполнение sbt
запускает REPL для специального языка сборки DSL, однако мы можем перейти на более низкий уровень, выполнив
sbt consoleProject
, чтобы начать true Scala REPL :
запускает интерпретатор Scala с доступом к определению вашего проекта и к sbt ... consoleProject
может быть полезным для создания и изменения вашей сборки так же, как обычно используется интерпретатор Scala изучить написание кода. Обратите внимание, что это дает вам необработанный доступ к вашей сборке.
Существует публичный c tags
метод
final case class Task[T](info: Info[T], work: Action[T]) {
...
def tags: TagMap = info get tagsKey getOrElse TagMap.empty
}
, поэтому должен быть способ вызвать его (даже если для него может не быть готовой команды верхнего уровня, такой как inspect
). Скажем, у нас есть следующее теговое определение задачи в build.sbt
lazy val hello = taskKey[Unit]("Vulcan greeting")
hello := Def.task(println("Live long and prosper")).tag(Tags.CPU, Tags.Compile).value
После выполнения consoleProject
наше определение сборки импортируется
scala> import _root_.scala.xml.{TopScope=>$scope}
import _root_.sbt._
import _root_.sbt.Keys._
import _root_.sbt.nio.Keys._
import _root_.sbt.ScriptedPlugin.autoImport._
import _root_.sbt.plugins.IvyPlugin
import _root_.sbt.plugins.JvmPlugin
import _root_.sbt.plugins.CorePlugin
import _root_.sbt.ScriptedPlugin
import _root_.sbt.plugins.SbtPlugin
import _root_.sbt.plugins.SemanticdbPlugin
import _root_.sbt.plugins.JUnitXmlReportPlugin
import _root_.sbt.plugins.Giter8TemplatePlugin
import $d408b7d79eabe42459a4.root
import currentState._
import extracted._
import cpHelpers._
Теперь мы можем сделать используйте Extracted#get
, чтобы получить TaskKey
и исследовать его следующим образом:
scala> extracted.get(hello).tags
res1: sbt.ConcurrentRestrictions.TagMap = Map(Tag(cpu) -> 1, Tag(compile) -> 1)
Кроме того, обратите внимание на import $d408b7d79eabe42459a4
. Мы можем использовать этот объект для доступа к обычным элементам val / def, например, например, что мы определили в build.sbt
def helloTask = Def.task { println("Live long and prosper") } tag(Tags.CPU, Tags.Compile)
, тогда мы можем получить доступ к helloTask
, например,
scala> $d408b7d79eabe42459a4.helloTask.evaluate(structure.data).tags
res0: sbt.ConcurrentRestrictions.TagMap = Map(Tag(cpu) -> 1, Tag(compile) -> 1)
Оба подхода показывают требуемое Map(Tag(cpu) -> 1, Tag(compile) -> 1)
.
Обращение к комментарию compileTask
, похоже, не помечено, поэтому
scala> get(Compile/compile).tags
res8: sbt.ConcurrentRestrictions.TagMap = Map()
однако для Например, updateFull
задача действительно помечена
updateFull := (updateTask tag (Tags.Update, Tags.Network)).value
следовательно
scala> get(updateFull).tags
res9: sbt.ConcurrentRestrictions.TagMap = Map(Tag(update) -> 1, Tag(network) -> 1)