代码之家  ›  专栏  ›  技术社区  ›  Incerteza

无法从Build.scala访问项目的类/对象

  •  2
  • Incerteza  · 技术社区  · 10 年前

    我想创建像Ruby rake这样的任务。我知道我可以通过sbt任务完成 http://www.scala-sbt.org/release/docs/Detailed-Topics/Tasks 但我不能使用项目中的任何类或对象。例如:

    # project/AppBuild.scala
    object AppBuild extends Build {
      //............
        lazy val sampleTask = taskKey[Unit]("hello123", "A sample task.") := {
          val u = models.User.single(123) // Error! models is not accessible
        }
    
    }
    

    所以我无法访问模型、用户或我项目中的任何其他类。我该怎么办?

    2 回复  |  直到 10 年前
        1
  •  2
  •   James Roper    10 年前

    Scala是强类型的,所有类型都必须在编译时解析。您的生成文件是首先编译的-它不能依赖于它正在生成的项目中的类型,因为要生成它正在构建的项目,它首先需要自己构建-看到循环依赖关系了吗?

    因此,您不能简单地从构建文件中调用项目中的Scala代码。

    您可以做的是在项目中定义一个主类,并告诉SBT使用 runMain 任务这完成了所有必要的魔术,首先编译项目,然后创建一个具有所有必要依赖项的类加载器,然后反射性地查找主类并调用它 test 文件夹并使用Play的假应用程序助手,例如:

    package foo.bar
    
    import play.api.test._
    object MyMainClass extends App {
      Helpers.running(FakeApplication()) {
        val u = models.User.single(123)
        ...
      }
    }
    

    现在从 play 控制台,请尝试以下操作:

    test:runMain foo.bar.MyMainClass
    

    如果这有效,那么您可以通过将其添加到 build.sbt 或在中生成设置 Build.scala :

    TaskKey[Unit]("do-something", "Do something") := {
      (runMain in Test).toTask("foo.bar.MyMainClass").value
    }
    

    那你就可以跑了 do-something .

        2
  •  1
  •   Rado Buransky    10 年前

    Build.scala定义如何构建项目。在构建定义中,您试图使用应该基于该定义构建的东西。

    一般的回答是 models 必须在之前构建(单独的模块),并作为构建项目的依赖项添加(而不是“真实”项目)。

    但是,你需要从项目中获得一些东西来实际构建项目的想法听起来很可疑。如果你能解释为什么以及你到底想达到什么目的,也许有人能给出一个更好的答案。