如何编写sbt插件以使用代理启动应用程序

时间:2014-04-12 11:41:24

标签: scala plugins sbt

我想在开源之前为我的项目创建一个sbt插件。

项目将Java代理附加到运行应用程序的开始,以便对其进行各种类型的分析。代理会写出文本文件以供以后处理。

我希望能够编写一个可以

的sbt插件
  • 可以替代名为run的{​​{1}},它会启动一个新的java进程,并将代理添加到参数列表中,并传递所有用户命令。
  • 退出时,我想调用一些任意的后处理代码来生成HTML报告

我大致知道如何创建新命令,但我不知道如何最好地实现runWithProfiling的替代方案...我不想通过以下方式重新发明轮子复制run所做的所有代码。有没有办法可以调用run但确保我的参数传递(一次)并且它肯定是一个新的java进程?

此外,能够为测试做同样的事情会很棒。

更新:这是我目前拥有的代码,但它遇到了几个问题,标记为run s

TODO

2 个答案:

答案 0 :(得分:1)

请参阅http://www.scala-sbt.org/0.13.0/docs/faq.html上的“除了运行之外如何创建自定义运行任务?”。在自定义任务中,您需要将fork设置为true才能启动新的JVM。

答案 1 :(得分:1)

插件作者需要遵守一个不成文的希波克拉底誓言,首先,不要伤害。"您的实现目前强制执行每个子项目并改变默认行为的forkjavaOptions,我认为这是危险的。我认为您需要复制作为任务范围的run参数,以便默认设置不受损害。

// TODO: update to a task that can take parameters (e.g. number of repeats, profiling settings)

请参阅Plugins Best Practices和现有插件,例如sbt-appengine

在sbt-appengine中devServer是一个输入任务,你可以设置一堆参数。

gae.devServer       := {
  val args = startArgsParser.parsed
  val x = (products in Compile).value
  AppEngine.restartDevServer(streams.value, (gae.reLogTag in gae.devServer).value,
    thisProjectRef.value, (gae.reForkOptions in gae.devServer).value,
    (mainClass in gae.devServer).value, (fullClasspath in gae.devServer).value,
    (gae.reStartArgs in gae.devServer).value, args,
    packageWar.value,
    (gae.onStartHooks in gae.devServer).value, (gae.onStopHooks in gae.devServer).value)
}

如您所见,代码的内容实际上是在AppEngine对象下的方法中实现的,因此其他人可能会重用您的内容。 方法中的许多参数(在本例中为restartDevServer)的范围限定为gae.devServer (mainClass in gae.devServer)任务。

您打算如何通过构建用户设置插件?他们是否会将其作为全局插件启用一次,并在任何地方使用相同的设置,或者他们是否会为project/lion.sbt中的每个版本启用它? Plugins Best Practices的建议是提供baseLionSettingslionSettings,以便构建用户可以选择和选择启用lion任务的子项目。

根据实际运行情况,您可能希望重新使用sbt-revolver中的代码,类似于我在sbt-appengine中所做的代码。