【问题标题】:How to change value of setting for a custom configuration under play/sbt?如何更改 play/sbt 下自定义配置的设置值?
【发布时间】:2014-09-15 23:34:40
【问题描述】:

我有一个 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
)

我希望这样当我输入 mockmock-resources 在类路径上,而当我输入 run 时它不在。

我正在使用带有 sbt 0.13.1 的 play 2.2.0

【问题讨论】:

    标签: scala playframework sbt playframework-2.2


    【解决方案1】:

    您需要将Compile 配置下的相应设置和任务设置为新定义的Mock 配置。原因是这样的:

    lazy val Mock = config("mock") extend Compile
    

    Mock 下没有设置或任务时,sbt 会继续在Compile 中搜索,其中确实定义了run,但使用了Compile 值。

    执行以下操作,它将起作用 - 请注意 Seq 中的 Classpaths.configSettingsrun

    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 也不例外:

    > mock
    [info] Running Hello
    resource: file:/Users/jacek/sandbox/mock-config/src/mock-resources/a.properties
    

    【讨论】:

    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2019-06-27
    • 2012-12-25
    相关资源
    最近更新 更多