【问题标题】:Adding new task dependencies to built-in SBT tasks?向内置 SBT 任务添加新任务依赖项?
【发布时间】:2011-11-12 18:07:21
【问题描述】:

是否可以覆盖或修改内置 SBT 任务(如编译)以依赖我自己的 Build.scala 中的自定义任务?覆盖例如直接“编译”是不可能的,因为它是用惰性值定义的,因此引用 super.compile 会发出编译器错误“super may not be used on lazy value”。

【问题讨论】:

标签: scala sbt


【解决方案1】:

由于在谷歌搜索如何在 SBT 中添加依赖项时出现此问题,并且当前答案为 deprecated as of 0.13.x 并在 1.0 中删除,因此这是更新后的答案,假设 printActioncompile 应该依赖的任务:

(Compile / compile) := ((Compile / compile) dependsOn printAction).value

【讨论】:

    【解决方案2】:

    更新:请参阅 arussell84 的回答,了解实现此目的的现代方法

    你应该可以这样做:

    在 .sbt 文件中:

    compile <<= (compile in Compile) dependsOn jruby
    

    其中 jruby 是您在 project/something.scala 文件中定义的任务键:

    val jruby = TaskKey[Unit]("jruby", "run a jruby file")
    

    此外,这不是您的问题的一部分,但您可以调用常规 Scala 代码:

    compile <<= (compile in Compile) map { result =>
      println("in compile, something")
      result
    }
    

    【讨论】:

    • 那里有太多的“编译”,我无法弄清楚这如何概括为向其他任务添加依赖项。我该怎么做才能将依赖项添加到“阶段”?
    • @ScottMorrison 我想你说:stage &lt;&lt; stage dependsOn jruby
    • 这个答案已经过时了。见the updated version I just posted
    【解决方案3】:

    回复自己:http://code.google.com/p/simple-build-tool/wiki/ProjectDefinitionExamples#Insert_Task_Dependency告诉答案:

    如果您使用的是旧的 0.7.x SBT 版本,您可以这样做:

    import sbt._
    class SampleProject(info: ProjectInfo) extends DefaultProject(info) {
      lazy val printAction = task { print("Testing...") }
      override def compileAction = super.compileAction dependsOn(printAction)
    }
    

    【讨论】:

    • 请注意,此建议仅适用于“旧”SBT 0.7.x。当前的 0.11 的做法有所不同。
    • 新版本是怎么做到的?
    • 这个答案已经过时了。见the updated version I just posted
    【解决方案4】:

    base_dir/project/ 文件夹中创建一个文件build.sbt 并将libraryDependencies += ... 放在那里。

    这是构建“构建项目”(也称为“元构建”)的惯用 SBT 方式。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2016-08-31
      • 2020-05-15
      • 2013-11-01
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多