从您的链接查看 API,您可以使用两种方法getGlobalBase
and getStagingDirectory
,两者都采用状态。
import sbt._
import Keys._
import sbt.BuildPaths._
object MyBuild extends Build {
val outputStaging = taskKey[Unit]("Outputs staging")
lazy val root = project.in(file(".")).settings(
outputStaging := {
val s = state.value
println(getStagingDirectory(s, getGlobalBase(s)))
}
)
}
Edit
在您上次发表评论后,我认为您正在寻找自定义解析器 http://www.scala-sbt.org/0.13.2/docs/Extending/Build-Loaders.html#custom-resolver。自定义解析器可以访问解决信息 http://www.scala-sbt.org/0.13.2/api/index.html#sbt.BuildLoader%24%24ResolveInfo对象,它有一个属性称为staging
.
例如,这就是您如何实现您正在寻找的内容(实际上无需访问staging
直接地):
object MyBuild extends Build {
lazy val root = project.in(file(".")).dependsOn(RootProject(uri("dir+git://github.com/lpiepiora/test-repo.git#branch=master&dir=subdir")))
override def buildLoaders = BuildLoader.resolve(myCustomGitResolver) +: super.buildLoaders
def myCustomGitResolver(info: BuildLoader.ResolveInfo): Option[() => File] =
if(info.uri.getScheme != "dir+git") None
else {
import RichURI.fromURI
val uri = info.uri
val (branch, directory) = parseOutBranchNameAndDir(uri.getFragment)
val gitResolveInfo = new BuildLoader.ResolveInfo(
uri.copy(scheme = "git", fragment = branch), info.staging, info.config, info.state
)
println(uri.copy(scheme = "git", fragment = branch))
Resolvers.git(gitResolveInfo).map(fn => () => fn() / directory)
}
// just an ugly way to get the branch and the folder
// you may want something more sophisticated
private def parseOutBranchNameAndDir(fragment: String): (String, String) = {
val Array(branch, dir) = fragment.split('&')
(branch.split('=')(1), dir.split('=')(1))
}
}
我们的想法是,我们委托给预定义的 git 解析器,然后让它完成工作,完成后,我们将返回一个子目录:fn() / directory
.
这是一个示例,当然您可以坚持获取存储库的逻辑。这暂存目录将在解析器方法中提供给您。