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

对于SBT,如何指定运行主类的当前目录以外的备用项目根?,sbt,Sbt,通常SBT在/build.SBT和/project/build.scala中查找生成文件。是否可以指定一个备用项目根目录,以便生成不在当前工作目录中的项目?我本质上是在寻找一个与mvn-f/path/to/pom.xml等价的文件,但是这些文件并没有给我提供任何明显的答案 (我应该注意,我希望在运行时而不是编译时执行此操作。本质上,我希望使用sbt run main从我的项目中运行任意类,因为我不喜欢手动类路径争用。出于各种无聊的原因,我可能需要从任意位置执行此操作,因为代码可能需要工作目录可能

通常SBT在
/build.SBT
/project/build.scala
中查找生成文件。是否可以指定一个备用项目根目录,以便生成不在当前工作目录中的项目?我本质上是在寻找一个与mvn-f/path/to/pom.xml等价的文件,但是这些文件并没有给我提供任何明显的答案


(我应该注意,我希望在运行时而不是编译时执行此操作。本质上,我希望使用
sbt run main
从我的项目中运行任意类,因为我不喜欢手动类路径争用。出于各种无聊的原因,我可能需要从任意位置执行此操作,因为代码可能需要工作目录可能不是项目目录,因此使用
cd
可能无法满足我的要求。在Maven中,这太微不足道了——我只是假设,也许不公平,在SBT中会有一个简单的等价物)我有类似的东西。我在
X/build.sbt
有项目定义,
X/MyOtherDefinitionWithSpecialThing/build.sbt
X/MySuperPublishConfig/build.sbt

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

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

target <<= (baseDirectory) (_ / ".." / "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 run main
更适合于此。您只需运行
sbt stage
,就可以在
target/start
获得一个调用脚本,并解析类路径。根据文档,它需要从构建根目录运行,以使项目间的依赖关系正常工作,但对于我的简单用例来说,这似乎不是问题。

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