从ModuleID获取SBT设置

时间:2019-01-05 04:14:38

标签: scala sbt

如何为{si1}项目使用moduleID: ModuleID来访问设置键?

我正在编写用于多模块构建的SBT插件。

我有项目A(其中dependsOn B)和项目B。 这两个项目都有我自己的generatemybuild任务作为设置键。 mybuild任务会消耗generate中的值-可以正常工作。 B不依赖任何内容,因此B的mybuild仅需要B:generate的密钥,一切都很好。 我希望A的mybuild同时消耗A:generateB:generate,这是基于dependsOn文件中A build.sbt B的事实。 我发现的唯一有前途的密钥会将项目作为: ModuleID实例返回,因此有什么方法可以从ModuleID获取设置密钥列表吗?

...还是我应该以其他方式这样做?

解决方案(种类)

@himos help是这个...

(myTaskKey in myConfig) := {
    loadedBuild.value.allProjectRefs.find(_._1 == thisProjectRef.value).map(_._2) match {
        case Some(myCurrentProject) =>
            if (myCurrentProject.dependencies.nonEmpty)
                sys.error {
                    myCurrentProject.dependencies
                        .map {
                            myDependsOnProject: ClasspathDep[ProjectRef] =>
                                (myDependsOnProject.project / myConfig / myTaskKey).value
                                // https://www.scala-sbt.org/0.13/docs/Tasks.html#Dynamic+Computations+with
                        }
                        .foldLeft("mine.dependencies:")(_ + "\n\t" + _)
                }
    }
}

...类似的作品。 即使SBT宏不喜欢它,它也会导致一个错误,表明我已经访问了正确的对象。

1 个答案:

答案 0 :(得分:2)

我认为您提到的ModuleID与依赖项管理有关,而不是与子项目有关。 要获取子项目设置/任务键,可以使用项目范围:

(generate in A).value
(generate in B).value

更全面的示例:

name := "A"
version := "1.0"
scalaVersion := "2.12.5"

val generate = TaskKey[String]("generate")
val myBuild = TaskKey[String]("myBuild")

val a = (project in file(".")).settings(Seq(
  generate := "A_generate"
))
val b = (project in file("proj_b")).settings(Seq(
 generate := "B_generate",
 myBuild := (generate in a).value + "_" + generate.value
)).dependsOn(a)

Sbt控制台输出:

sbt:A> show b/myBuild
[info] A_generate_B_generate