Как вы сами разрабатываете проект SBT?

Предыстория: у меня есть проект Play 2.0, и я пытаюсь добавить что-то для создания аспектов j с использованием аспектов в банке на некоторых из моих классов (Java). (sbt-aspectj, кажется, не делает этого, или я не вижу, как). Поэтому мне нужно добавить пользовательское задание, и оно зависит от компиляции. Я вроде разобрался с зависимостью. Однако, поскольку я точно не знаю, что я делаю, я хочу разработать это с помощью IDE (я использую Scala-IDE). Так как проекты sbt (и, следовательно, проекты Play) определены рекурсивно, я предположил, что мог бы:

  1. Добавьте плагин eclipse в myplay/project/project/plugins.sbt
  2. Добавьте основной jar sbt (и аспект jar) в myplay / project / project / build.sbt:

    libraryDependencies ++ = Seq ("org.scala-sbt"% "main"% "0.12.2", "aspectj"% "aspectj-tools"% "1.0.6")

  3. Загляните в myplay / проект

  4. Запустите sbt, запустите задачу eclipse, затем импортируйте проект в eclipse как отдельный проект.

Я могу сделать это, хотя build.scala (и другие файлы scala) изначально не считаются исходными текстами, и мне нужно немного поиграться с путем сборки. Однако, несмотря на то, что у меня есть sbt main, определенный для проекта, и Eclipse IDE, и задача компиляции выдают ошибки:

> compile
[error] .../myplay/project/Build.scala:2: not found: object keys
[error] import keys.Keys._
[error]        ^
[error] .../myplay/project/SbtAspectJ.scala:2: object Configurations is not a member of package sbt
[error] import sbt.Configurations.Compile
[error]            ^
[error] .../myplay/project/SbtAspectJ.scala:3: object Keys is not a member of package sbt
[error] import sbt.Keys._
[error]            ^
[error] three errors found

Проект eclipse не показывает ни основных, ни aspectj-инструментов в своих ссылочных библиотеках. Тем не менее, если я дам ему фиктивную версию (например, 0.12.4), перезагрузка завершится неудачно, поэтому, похоже, она использует зависимость.

Итак,... Во-первых: это правильный способ сделать это? Второе: если так, то почему не добавляются библиотеки? (В-третьих: пожалуйста, не позволяйте этому быть чем-то глупым, что я пропустил.)

2 ответа

Если вы получаете object Keys is not a member of package sbt ошибка, то вы должны проверить, что вы запускаете sbt из базового каталога, а не из каталога /project.

SBT-AspectJ

sbt-aspectj, кажется, не делает этого, или я не вижу как.

Я думаю, что это реальная проблема. Уже есть плагин, который делает эту работу, поэтому попробуйте заставить его работать, а не возиться со сборкой. Использование плагинов из build.scala немного сложнее. К счастью, на github есть примеры проектов:

import sbt._
import sbt.Keys._
import com.typesafe.sbt.SbtAspectj.{ Aspectj, aspectjSettings, compiledClasses }
import com.typesafe.sbt.SbtAspectj.AspectjKeys.{ binaries, compileOnly, inputs, lintProperties }


object SampleBuild extends Build {
  ....

  // precompiled aspects
  lazy val tracer = Project(
    "tracer",
    file("tracer"),
    settings = buildSettings ++ aspectjSettings ++ Seq(
      // stop after compiling the aspects (no weaving)
      compileOnly in Aspectj := true,

      // ignore warnings (we don't have the sample classes)
      lintProperties in Aspectj += "invalidAbsoluteTypeName = ignore",

      // replace regular products with compiled aspects
      products in Compile <<= products in Aspectj
    )
  )
}

Как вы сами разрабатываете проект SBT?

Если вы заинтересованы во взломе сборки, первым делом стоит обратиться к руководству по началу работы. В частности, ваш вопрос должен быть дан ответ на странице определения сборки.scala.

Я думаю, вы хотите, чтобы ваша сборка использовалась "aspectj" % "aspectj-tools" % "1.0.6", Если так, то это должно быть включено в myplay/project/plugins.sbtи ваш код должен войти в myplay/project/common.scala или что-то. Если вы хотите использовать IDE, вам больше повезло с его сборкой в ​​качестве плагина sbt. Таким образом, ваш код будет в src/main/scala, Посмотрите sbt / sbt-aspectj или sbt/sbt-assembly на примере структуры плагина sbt.

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