使用SBT,如何指定运行主类的当前目录以外的备用项目根?

时间:2013-05-17 01:36:11

标签: sbt

通常,SBT会在./build.sbt./project/Build.scala查找构建文件。是否可以指定备用项目根目录,因此我可以构建一个不在当前工作目录中的项目?我基本上寻找相当于mvn -f /path/to/pom.xml但是文档没有给我任何明显的答案。

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

2 个答案:

答案 0 :(得分:0)

我有类似的东西。我的项目定义位于X/build.sbtX/MyOtherDefinitionWithSpecialThing/build.sbtX/MySuperPublishConfig/build.sbt

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

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

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

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

我的一个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

答案 1 :(得分:0)

正如我在this other answer中发现的那样,sbt-start-script插件是比sbt run-main更好的工具。您只需运行sbt stage,就可以在target/start获得一个解析类路径的调用脚本。根据文档,它需要从构建根目录运行,以便项目间依赖项工作,但对于我的简单用例,这似乎不是问题。