使用以下构建文件执行
mill run
将启动程序,暂停以等待调试器连接,然后在调试器的控制下继续。
import mill._, scalalib._
object foo extends RootModule with ScalaModule {
def scalaVersion = "3.3.3"
override def forkArgs = Seq("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005")
object test extends ScalaTests {
def ivyDeps = Agg(ivy"com.lihaoyi::utest:0.7.11")
def testFramework = "utest.runner.Framework"
}
}
问题是我想轻松地在使用调试器运行和不使用调试器运行之间切换。也就是说,我想将
override def forkArgs...
替换为
override def forkArgs = if (someMagicIncantation)
Seq("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005")
else
Seq()
理想情况下,
someMagicIncantation
将连接到命令行,以便 mill withDebugger run
或 mill withDebugger test
可以与调试器连接,而 mill run
则不会。
添加以下内容可以让我执行
mill debug on
和 mill debug off
,将选项字符串写入 out/debug.json
。
def debug(arg: String) = T.command {
if (arg.trim.toLowerCase() == "on")
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005"
else ""
}
但是,我不知道如何从中取得进展,因为命令不是 json 可读的。也就是说,我不知道如何在随后的磨机运行中将那根绳子吸回去。
欢迎任何建议,包括完全不同的方法(除了放弃工厂!)。
也许是这样的?
import mill._, scalalib._
object foo extends RootModule with ScalaModule {
def scalaVersion = "3.3.3"
object debug extends JavaModule {
override def forkArgs = Seq("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005")
override def runClasspath = foo.runClasspath
override def finalMainClass = foo.finalMainClass
}
object test extends ScalaTests {
def ivyDeps = Agg(ivy"com.lihaoyi::utest:0.7.11")
def testFramework = "utest.runner.Framework"
}
}
然后
mill run
会正常运行,并且 mill debug.run
会附加到您的调试器。
(很快
debug
将能够延伸RunModule
,而不是拉入所有JavaModule
。但这现在有效,并且应该继续有效。)