我有一个 play 项目,我想添加一个 sbt 任务,该任务使用给定的文件夹作为资源运行应用程序。但是,我不希望该文件夹在“正常”运行期间位于类路径中。
我创建了一个配置,将资源添加到该配置,但是当我在该配置中运行时,文件没有被拾取
例如,我有:
val Mock = config(“mock”) extend Compile
val mock = inputKey[Unit]("run in mock mode")
val project = Project(“my project”, file(“src/”))
.configs(Mock)
.settings(
unmanagedResourceDirectories in Mock ++= Seq(baseDirectory.value / “mock-resources”)
mock <<= run in Mock
)
我想要这样当我输入 mock
时 mock-resources
在类路径中,而当我输入 run
时它不在
我正在使用 play 2.2.0 和 sbt 0.13.1
最佳答案
您需要将Compile
配置下的适当设置和任务设置为新定义的Mock
配置。原因是这样的:
lazy val Mock = config("mock") extend Compile
当 Mock
下没有设置或任务时,sbt 会继续在 Compile
中搜索,其中确实定义了 run
但使用 Compile
值。
执行以下操作,它将起作用 - 注意 Classpaths.configSettings
和 Seq
中的 run
:
lazy val Mock = config("mock") extend Compile
lazy val mock = inputKey[Unit]("run in mock mode")
lazy val mockSettings = inConfig(Mock) {
Classpaths.configSettings ++
Seq(
unmanagedClasspath += baseDirectory.value / "mock-resources",
mock <<= run in Mock,
run <<= Defaults.runTask(fullClasspath in Mock, mainClass in Mock, runner in Mock)
)
}
lazy val p = (project in file("src/")).configs(Mock).settings(
mockSettings: _*
)
注意 我不确定为什么需要以下行:
run <<= Defaults.runTask(fullClasspath in Mock, mainClass in Mock, runner in Mock)
我的猜测是因为 run
使用默认为 Compile
范围的 fullClasspath
它在 Mock< 中看不到值
。 sbt 让我惊艳!
我已经在 Why does the default run task not pick settings in custom configuration? 中询问过了
示例
我一直在 src
目录下使用以下 hello.scala
运行构建:
object Hello extends App {
val r = getClass.getResource("/a.properties")
println(s"resource: $r")
}
在 p/mock:mock
上它给了我:
> p/mock:mock
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
同样适用于 p/mock:run
:
> p/mock:run
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
mock
也不异常(exception):
> mock
[info] Running Hello
resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
关于scala - 如何更改 play/sbt 下自定义配置的设置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24933269/