【问题标题】:With SBT, how do I a specify an alternate project root other than the current directory for running a main class?使用 SBT,我如何指定一个替代项目根目录而不是当前目录来运行主类?
【发布时间】:2013-05-12 02:16:55
【问题描述】:

通常 SBT 在 ./build.sbt./project/Build.scala 查找构建文件。是否可以指定备用项目根目录,以便我可以构建不在当前工作目录中的项目?我基本上在寻找与 mvn -f /path/to/pom.xml 等效的内容,但文档没有为我提供任何明显的答案。

(我应该注意,我想在运行时而不是编译时执行此操作。本质上,我想使用 sbt run-main 从我的项目中运行任意类,因为我讨厌手动类路径争论.由于各种无聊的原因,我可能需要从任意位置执行此操作,因为代码可能需要工作目录不是项目目录,因此使用 cd 可能无法满足我的要求。这在 Maven 中是如此微不足道 - 我只是假设,也许不公平,在 SBT 中会有一个简单的等价物)

【问题讨论】:

    标签: sbt


    【解决方案1】:

    我有这样的东西。我在X/build.sbtX/MyOtherDefinitionWithSpecialThing/build.sbtX/MySuperPublishConfig/build.sbt 有项目定义。

    但是我对这个问题的看法是相反的。我没有指定./build.sbt./project/Build.scala 的位置,而是指定资源路径的位置。结果是一样的。它看起来像:

    sourceDirectory <<= (baseDirectory) (_ / ".." / "src")
    
    target <<= (baseDirectory) (_ / ".." / "target")
    

    这允许创建具有多个定义的单个项目。这适用于嵌套/分层项目。但我对分层项目使用符号链接(Linux 操作系统)。

    我的一个 SBT 插件有一个文件树。多个构建定义,只有一个src/...

    .
    |-build.sbt
    |-project
    |---project
    |-----target
    |-------...
    |---target
    |-----...
    |-project-0.11
    |---build.sbt
    |---project
    |-----project
    |-------target
    |---------...
    |-----target
    |-------...
    |-project-0.12
    |---build.sbt
    |---project
    |-----project
    |-------target
    |---------...
    |-----target
    |-------...
    |-...
    |-src
    |---main
    |-----scala
    |-------org
    |---------...
    |---sbt-test
    |-----...
    |-target
    |---...
    

    如果这不能解决您的问题,请详细说明您不想使用“cd”命令的原因;-)

    -- 对于更新的用例:

    我使用 shell 包装器,并且在每个 SBT 项目中都有指向这个的符号链接:

    #!/bin/sh
    #
    here=$(cd $(dirname "$0"); pwd)
    if [ ! -e "${here}/build.sbt" ]
    then
      echo build.sbt lost
      exit
    fi
    cd ${here} 
    
    LOCAL_BUILD=true sbt-0.12 "$@"
    

    例如,我只是写/path/to/my/project/sbt 'show name' 或在你的情况下写/path/to/my/project/sbt run-main

    【讨论】:

    • 对于某些用例来说似乎是一个很好的解决方案 - 谢谢。但是,在这种特殊情况下,这并不是我想要的。我现在已经澄清了这个问题以解释我想要做什么。
    • 已更新。 SBT 启动器严格绑定到目录结构。这对于分层项目或带有插件的项目非常冗长。
    • 谢谢,但它仍在使用“cd”。如果代码需要从文件系统中的任意点运行——比如说,因为它希望数据文件位于当前工作目录中,这仍然行不通。 (这可能是项目的糟糕设计,但如果这是真的,那么 SBT 的设计同样糟糕)
    【解决方案2】:

    我从this other answer 发现,sbt-start-script 插件比sbt run-main 是一个更好的工具。您可以简单地运行sbt stage,然后在target/start 处获得一个调用脚本,并解析了类路径。根据文档,需要从构建根目录运行项目间依赖关系才能工作,但对于我的简单用例,这似乎不是问题。

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多