Список тегов sbt `Task` - PullRequest
       11

Список тегов sbt `Task`

1 голос
/ 20 апреля 2020

Есть ли способ перечислить теги , связанные с задачей в sbt?

inspect и show, похоже, там ничего нет.

1 Ответ

2 голосов
/ 20 апреля 2020

Крутой и мощный аспект 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...