如何为{si1}项目使用moduleID: ModuleID
来访问设置键?
我正在编写用于多模块构建的SBT插件。
我有项目A(其中dependsOn
B)和项目B。
这两个项目都有我自己的generate
和mybuild
任务作为设置键。
mybuild
任务会消耗generate
中的值-可以正常工作。
B不依赖任何内容,因此B的mybuild
仅需要B:generate
的密钥,一切都很好。
我希望A的mybuild
同时消耗A:generate
和B: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宏不喜欢它,它也会导致一个错误,表明我已经访问了正确的对象。
答案 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