6

在 SBT 插件中,我试图访问子项目的托管资源。

这是构建文件:

import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {
  val appName         = "demo"
  val appVersion      = "1.0-SNAPSHOT"
  val appDependencies = Seq(
    "org.jruby" % "jruby-complete" % "1.7.1"
  )

  val widgets = play.Project("widgets", appVersion, appDependencies, path = file("widgets"))
  val main = play.Project(appName, appVersion, appDependencies, path = file("demo"))
    .dependsOn(widgets)

}

我正在使用 plugins.sbt 中定义的 SBT 插件。

现在,我需要在编译父项目(演示)期间使用子项目(小部件)中的资源文件。

到目前为止,我最接近的是 buildDependencies 设置键 - 但我只获取 ProjectRef 对象,唯一的信息是构建基础和项目 ID。我找不到进入该项目资源目录的方法。

4

2 回答 2

2

我不熟悉编写插件,但至少在你的build.sbt你可以定义资源文件

或者,build.sbt您可以再次创建一个其他人引用的“通用”项目,例如:

lazy val common = (project in file("common"))
  .settings(
    Seq(
      includeFilter in unmanagedResources := new SimpleFileFilter(_.getCanonicalPath.startsWith((sourceDirectory.value / "main" / "resources").getCanonicalPath))
    )
  )

然后其他代码(例如任务)可以像这样引用:

lazy val doSomething = taskKey[Seq[File]]("Does something useful")
lazy val doSomethingSetting = doIt := {

  val resourceDir = (resourceDirectory in common in Compile).value
  println(resourceDir)

}

所以你的其他项目可以运行这个或引用那个目录

希望有一种直接的方法来实现插件与构建的解决方案之一?

于 2018-12-19T16:24:30.160 回答
0

不幸的是,我不相信这是可能的。我正在尝试类似的东西,但在文档中发现了以下内容:

注意:在运行时,所有构建的所有插件都加载到构建类加载器的单独的父类加载器中。这意味着插件不会从构建定义中看到类或资源

请参阅:SBT 插件

于 2013-08-01T16:30:31.303 回答