我想在开源之前为我的项目创建一个sbt插件。
项目将Java代理附加到运行应用程序的开始,以便对其进行各种类型的分析。代理会写出文本文件以供以后处理。
我希望能够编写一个可以
的sbt插件run
的{{1}},它会启动一个新的java进程,并将代理添加到参数列表中,并传递所有用户命令。我大致知道如何创建新命令,但我不知道如何最好地实现runWithProfiling
的替代方案...我不想通过以下方式重新发明轮子复制run
所做的所有代码。有没有办法可以调用run
但确保我的参数传递(一次)并且它肯定是一个新的java进程?
此外,能够为测试做同样的事情会很棒。
更新:这是我目前拥有的代码,但它遇到了几个问题,标记为run
s
TODO
答案 0 :(得分:1)
请参阅http://www.scala-sbt.org/0.13.0/docs/faq.html上的“除了运行之外如何创建自定义运行任务?”。在自定义任务中,您需要将fork
设置为true才能启动新的JVM。
答案 1 :(得分:1)
插件作者需要遵守一个不成文的希波克拉底誓言,首先,不要伤害。"您的实现目前强制执行每个子项目并改变默认行为的fork
和javaOptions
,我认为这是危险的。我认为您需要复制作为任务范围的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的建议是提供baseLionSettings
和lionSettings
,以便构建用户可以选择和选择启用lion
任务的子项目。
根据实际运行情况,您可能希望重新使用sbt-revolver中的代码,类似于我在sbt-appengine中所做的代码。