Как вы сами разрабатываете проект SBT?
Предыстория: у меня есть проект Play 2.0, и я пытаюсь добавить что-то для создания аспектов j с использованием аспектов в банке на некоторых из моих классов (Java). (sbt-aspectj, кажется, не делает этого, или я не вижу, как). Поэтому мне нужно добавить пользовательское задание, и оно зависит от компиляции. Я вроде разобрался с зависимостью. Однако, поскольку я точно не знаю, что я делаю, я хочу разработать это с помощью IDE (я использую Scala-IDE). Так как проекты sbt (и, следовательно, проекты Play) определены рекурсивно, я предположил, что мог бы:
- Добавьте плагин eclipse в myplay/project/project/plugins.sbt
Добавьте основной jar sbt (и аспект jar) в myplay / project / project / build.sbt:
libraryDependencies ++ = Seq ("org.scala-sbt"% "main"% "0.12.2", "aspectj"% "aspectj-tools"% "1.0.6")
Загляните в myplay / проект
- Запустите 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.