你如何开发SBT项目呢?

时间:2013-04-16 01:20:05

标签: sbt scala-ide sbt-aspectj

背景:我有一个Play 2.0项目,我试图在我的一些类(Java)中使用jar中的方面添加一些方面来进行aspectj编织。 (sbt-aspectj似乎没有这样做,或者我不知道如何)。所以我需要添加一个自定义任务,并依赖于编译。我有点想出了依赖部分。但是,因为我并不确切知道自己在做什么,但是,我想使用IDE开发它(我使用的是Scala-IDE)。由于sbt项目(以及Play项目)是递归定义的,我假设我可以:

  1. 将eclipse插件添加到myplay / project / project / plugins.sbt
  2. 将sbt主jar(和aspectj jar)添加到myplay / project / project / build.sbt:

    libraryDependencies ++ = Seq(   " org.scala-SBT" %"主要" %" 0.12.2",   " AspectJ的" %" aspectj-tools" %" 1.0.6" )

  3. 放入myplay / project

  4. 运行sbt,运行eclipse任务,然后将项目导入eclipse作为一个单独的项目。
  5. 我可以这样做,虽然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项目在其引用库中既没有显示主要工具也没有方面工具。但是,如果我给它一个虚假的版本(例如0.12.4),重新加载失败,所以它似乎正在使用 依赖。

    所以,... 第一:这是正确的方法吗? 第二:如果是这样,为什么没有添加libs。 (第三:请不要让我感到愚蠢,我错过了。)

2 个答案:

答案 0 :(得分:7)

如果您收到object Keys is not a member of package sbt错误,那么您应该检查您是否从基本目录运行sbt,而不是/ project目录。

答案 1 :(得分:1)

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项目?

如果您对黑客入侵感兴趣,那么第一个地方仍然是Getting Started指南。具体而言,您的问题应在.scala Build Definition page中解答。

我认为您希望您的构建使用"aspectj" % "aspectj-tools" % "1.0.6"。如果是这样,它应该包含在myplay/project/plugins.sbt中,您的代码应该进入myplay/project/common.scala或其他内容。如果你想使用IDE,你可以更好地将它构建为sbt插件。这样你的代码就会进入src/main/scala。在sbt插件结构的例子中查看sbt / sbt-aspectj或sbt / sbt-assembly。