2017-04-06 4 views
1

を決定し、私は(sshを使用すると、私はプライベートレポにアクセスすることを可能にする)ので、同じように、私のbuild.sbtにプロジェクト参照としてリモートgitリポジトリを治療するためのssh URI参照を使用しています:はGitの依存関係のためのローカルディレクトリに

lazy val dep = RootProject(uri("ssh://[email protected]/...")) 

lazy val root = project(file.in(".").dependsOn(dep) 

SBTがプロジェクトを格納するローカルディレクトリをビルドファイルのタスクまたはコマンドでどのように判断できますか?

答えて

1

How do I get SBT staging directory at build time?にある情報に基づいて、私はうまくいくソリューションを考え出すことができました。あなたは、タスク(またはコマンド)を定義する必要があります(SBT 0.13.13)

それはあなたがstaging`ディレクトリを取得することができますようにStateは、提供されています:

lazy val printRepos = taskKey[Unit]("Print path to dependencies that are hosted in git repositories.") 
printRepos := { 
    import sbt.BuildPaths._ 

    val s = state.value 
    val staging = getStagingDirectory(s, getGlobalBase(s)) 
    // root is a reference to your top-level project, which has 
    // git-hosted dependencies. 

    val repos = gitRepos(staging, root.dependencies) 
    println("${repos.mkString(",")}") 
} 

gitRepos方法は、(下記)かかりステージングディレクトリと依存関係、git reposのように見えるものをフィルタリングし、プロジェクト、元のURI、ソースを保持するローカルパスを組み合わせた一連のタプルを返します。

ソースをローカルに格納するために使用される実際のディレクトリは、Resolvers.gitによって返されます。これには、ResolveInfoオブジェクトが必要です。順番に再利用Resolvers.gitに不正なResolveInfoを構築し、私はあなたがその周りを得ることができるとは思わないgitRepos

def gitRepos(staging: File, cps: Seq[ClasspathDep[ProjectReference]]): Seq[(ProjectReference, URI, File)] = { 
    import sbt.BuildLoader._ 
    import sbt.RichURI._ 

    val x = cps.flatMap(cp => Reference.uri(cp.project).map(uri => (cp.project, uri))) 
    x.flatMap({ case (project, uri) => { 
    // Stolen from sbt.RetrieveUnit 
    if(uri.getScheme == "git" || uri.withoutMarkerScheme.getPath.endsWith(".git")) { 
     val y = Resolvers.git(new ResolveInfo(uri, staging, null, null)) 
     y.map(path => (project, uri, path())) 
    } 
    else 
     None 
    }}) 
} 

getReposResolvers.gitを再使用しているので、printReposは常にsbtという正確なディレクトリを印刷しますプロジェクト参照を格納するために使用します。

1

情報がビルドユニットのlocalBaseフィールドに表示されません。それはそのプロジェクトの設定として追加する必要がある、あなたはProjectRefとして追加プロジェクトで

val localBase: TaskKey[File] = taskKey[File]("the local base of project") 
localBase := { 
    val extracted = Project.extract(state.value) 
    extracted.currentUnit.localBase 
} 

localBase in yourProjectRef := ... 

だけ取得するには、現在のプロジェクトのためにそれを取得するためのタスクを行うことができますすべての地元基地の地図:

val allYourBase = taskKey[Map[URI,File]]("project bases") 
allYourBase := { 
    val extracted = Project extract state.value 
    extracted.structure.units.map { case (uri, unit) => (uri,unit.localBase)} 
} 
関連する問題