Chciałbym utworzyć wtyczkę sbt dla mojego projektu, zanim go otworzę.jak napisać wtyczkę sbt, aby uruchomić aplikację z agentem
Projekt dołącza agenta Java na początku uruchamiania aplikacji, aby przydzielić go do różnych typów profilowania. Agent wypisze pliki tekstowe do późniejszego przetworzenia.
Chciałbym móc napisać plugin SBT, które mogą
- mieć alternatywę do
run
nazywarunWithProfiling
który uruchamia nowy proces java, ze środkiem dodany do listy argumentów, a przechodząc przez cały polecenia użytkowników. - na wyjeździe, to potem chce powołać jakąś dowolnego kodu postprocessingu produkować raport HTML
Wiem mniej więcej, jak utworzyć nowe polecenie, ale nie wiem, jak najlepiej wdrożyć alternatywny do run
... Nie chcę ponownie wymyślać koła, kopiując cały kod, który robi run
. Czy istnieje sposób, aby wywołać run
, ale upewnij się, że moje parametry są przekazywane (jeden raz) i że jest to z pewnością nowy proces java?
Również możliwość wykonania tego samego testu byłaby świetna.
UPDATE: jest to kod, który obecnie mam, ale cierpi z powodu kilku problemów, oznaczony jako TODO
s
import sbt._
import Keys._
import sbt.Attributed.data
object LionPlugin extends Plugin {
val lion = TaskKey[Unit]("lion", "Run a main class with lions-share profiling.")
override val projectSettings = Seq(
fork := true,
javaOptions ++= Seq(
"-Xloggc:gc.log", "-XX:+PrintGCDetails", "-XX:+PrintGCDateStamps",
"-XX:+PrintTenuringDistribution", "-XX:+PrintHeapAtGC"
// TODO: need to get hold of the local jar file for a particular artifact
// IMPL: pass the jar as the agent
),
lion <<= (
runner,
fullClasspath in Runtime,
mainClass in Runtime,
streams in Runtime
) map runLion
)
// TODO: update to a task that can take parameters (e.g. number of repeats, profiling settings)
def runLion(runner: ScalaRun, cp: Classpath, main: Option[String], streams: TaskStreams): Unit = {
assert(runner.isInstanceOf[ForkRun], "didn't get a forked runner... SBT is b0rk3d")
println("RUNNING with " + runner.getClass)
// TODO: ask user if main is None, like 'run' does
val m = main.getOrElse("Scratch")
// TODO: get the user's arguments
val args = Nil
runner.run(m, data(cp), args, streams.log)
// IMPL: post-process and produce the report
println("FINISHED")
}
}
jest to bardzo przydatne, dzięki! Bardzo chciałbym umożliwić użytkownikom ustawienie tego na podstawie modułu i pozostawienie fork/javaOptions użytkownika nietkniętym. Obawiam się, że nadal nie jestem bliżej, aby wiedzieć, jak to zrobić, nawet po przeczytaniu źródła. Pierwotnie miałem np. 'fork in lion: = true', ale to było ignorowane. – fommil
chociaż, ukradnę twoje podejście i użyję 'Fork.java' bezpośrednio ... to znaczy, że nigdy nie zmieniam żadnego z ustawień. – fommil