【问题标题】:Custom 'run' like task for for a project项目的自定义“运行”任务
【发布时间】:2014-02-13 04:04:42
【问题描述】:

默认情况下,我的 SBT 构建的运行任务会执行我在 src/main/scala/ 中(自动)找到的主类。

如何为行为与运行任务类似但在src/util/scala 中找到主类的项目添加新任务?该任务应该在类路径上运行带有src/main/scala 的util main 方法。

我正在使用具有完整多项目配置的 SBT 0.12.4。

【问题讨论】:

    标签: scala build sbt


    【解决方案1】:

    以下定义了一个新配置,它从src/util/scala 编译源代码,并定义util:run 和util:run-main 以从新配置运行主类。编译和运行时,来自src/main/scala 的编译源在类路径中可用。

    import sbt._
    import Keys._
    
    object MyBuild extends Build
    {
       // Define a new configuration named `util`.
       //   Extending `Compile` means the main classpath is available to `util`
       lazy val Util = config("util").extend(Compile)
    
       // Add the new configuration to the project.
       // Add the new settings.
       lazy val root = Project("root", file(".")).configs(Util).settings( utilSettings : _*)
    
       // Add the basic source, compilation, and packaging settings
       //   as well as custom run methods.
       lazy val utilSettings = inConfig(Util)( Defaults.configSettings ++ utilRunSettings )
    
       // Settings that define `run` and `run-main` to use the
       // classpath from the enclosing configuration.
       // (The standard `run` methods use the `Runtime` configuration.
       lazy val utilRunSettings = Seq(
            run <<= Defaults.runTask(fullClasspath, mainClass in run, runner in run),
            runMain <<= Defaults.runMainTask(fullClasspath, runner in run)
       )
    }
    

    (在 0.13 上测试过,但应该可以在 0.12 上使用。)

    【讨论】:

    • 这看起来很棒。是时候尝试一下了。
    • 到目前为止,我的项目构建文件已编译,但util:run 自动从src/main/scala 找到并运行主类。
    • 我测试了粘贴的代码,util:run 仅在src/util/scala 中运行主类。也许您可以验证 sn-p 在独立项目中的工作原理,然后发布您如何将其集成到您的构建中?
    • 我花了一段时间才再次尝试这个,但效果很好。谢谢!
    【解决方案2】:

    我不认为 sbt 会找到你放在 src/util/... 中的代码,它应该放在 src/main/scala、src/test/scala 等中。你可能想要将实用程序类添加到一些一种“util”包,可能在 src/main/com/example/util 中,或者将它们放在子项目或依赖项目中,但 sbt 并没有真正设计(afaik)能够处理任意目录结构。

    至于设置多个main方法,sbt run,如果在src/main/scala中找到多个main方法,会让你选择调用哪一个。

    如果它在外部 jar 中,您可能需要:Configuring sbt project to include external Main methods in "sbt run"

    我通常做的是运行sbt console,然后直接从那里导入并调用 main 方法。例如:

    sbt console
    import com.example.Main
    Main(new String[])
    

    由于您有子项目,如果您的项目之一是“util”,您应该能够使用sbt util/run 之类的东西在 util/src/main/scala 中运行 main 方法。

    如果您在一个项目中有多个主要方法,您也应该能够使用sbt "util/run-main com.example.MainClass"。

    您也可以考虑使用 sbt start-script 插件: https://github.com/sbt/sbt-start-script

    【讨论】:

    • 根据scala-sbt.org/release/docs/Howto/defaultpaths.html,您可以将所需的任何目录添加到任何范围。我认为我需要一个新的作用域,在源路径上有main 和util 目录,并使用不同名称的“运行”任务。我只是不知道该怎么做。
    • 从您的链接看来,您可以将项目配置为在 myRandomDirectory/main/scala 而不是 src/main/scala 中引用 scala 源,但我认为这对您没有帮助。有很多方法可以从 sbt 运行(多个)任务,我使用了我的答案中列出的一些机制。我不确定为什么将主类保存在 util 目录中会有所不同。
    • 我在src/main/scala 中有一个主类以及我的大部分业务逻辑,在src/main/util 中有一些实用程序代码。实用程序代码与主代码非常相关,因此它似乎不保证它自己的子项目。实用程序代码有自己的主类,而不是测试用例代码,它挂在通常的src/test/scala。
    • 通常你要么将 util 代码添加到使用多项目构建的项目中,要么将 util 代码放在一个包中(例如在 src/main/scala/com/example/util/ )。如果目录与包名称不匹配,afaik scala 不介意,因此也许您可以有两个代码目录:src/main/scala/application 和 src/main/scala/util。这是一种非常规的方法,但也应该有效。 Sbt 可以在单个 src/main/scala 代码库中配置多个主要方法(如答案中所述),所以这不是问题。如果您必须有两个完全独立的 src 目录,请使用项目。
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多