如何切换工厂是否使用调试选项进行构建——从命令行

问题描述 投票:0回答:1

使用以下构建文件执行

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 可读的。也就是说,我不知道如何在随后的磨机运行中将那根绳子吸回去。

欢迎任何建议,包括完全不同的方法(除了放弃工厂!)。

scala mill
1个回答
0
投票

也许是这样的?

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
。但这现在有效,并且应该继续有效。)

© www.soinside.com 2019 - 2024. All rights reserved.