0
任何人都可以告诉我如何在SBT Command
内添加多个Artifacts
?我想要做以下事情。考虑下面的树:如何在SBT命令中添加自定义工件
- target
|- scala-2.10
|- classes
|- my
|- package
|- foo
- bar
- john
- doe
我想创建一个发布个人Artifact
(JAR)为my/package
下每个文件夹的命令。不应该有任何默认Artifact
。依赖这个库的项目应该使用分类器,即
libraryDependencies += "whatever" % "whatever" % "1.0" Artifacts(Artifact("foo", "john"))
这是我到目前为止。
def myCommand = Command.single("myCommand") {
case (currentState, arg) =>
val extracted = Project.extract(currentState)
val compileDirectory = extracted.get[File](classDirectory in Compile)
val packageDir = new sbt.File(compileDirectory, s"my${File.separator}package")
val artifactDefinitions = IO.listFiles(packageDir).toList.map {
serviceDir =>
val serviceName = serviceDir.name.split(File.separatorChar).reverse.head
println(s"Adding artifact for $serviceName")
val serviceTask = taskKey[File](s"Adds a $serviceName artifact")
serviceTask := {
serviceDir
}
val definition = addArtifact(Artifact("service", serviceName), serviceTask)
extracted.append(definition.settings, currentState) <-- fails on this line
definition
}
currentState
}
错误我得到:
Reference to undefined setting:
*:serviceTask from *:packagedArtifacts ((sbt.BuildExtra) Defaults.scala:1767)
感谢,修复错误。然而,当我运行这个时,我从来没有在运行'publish-local'之后看到这些工件 - 既不在'target'也不在'〜/ .ivy/local'中。我错过了什么?我想要的是包含“foo”,“bar”,“john”和“doe”中的类的单个罐子。 – reikje
是的,你错过了你正在定义一个目录的工件,而不是一个打包的文件。我不建议一路走下这条路,它让我想起了蚂蚁,以及为什么maven的约定(它被采用)工作得很好:在源和神器之间保持简单的1对1关系。所以我会建议你组织你的构建是多个项目,并使用盒子里的东西,而不是沿着这条路线走。 –
是的,你是对的。这个项目只包含很多.thrift文件,它们将生成源代码。我想将为每个.thrift文件生成的类打包到单独的工件中,然后可以使用分类器语法在另一个工程中使用它。如果我创建一个多项目构建,并且每个thrift文件都存在于它自己的项目中,那么我将无法使用类分类器,比如'libraryDependencies + =“whatever”%“whatever”%“1.0”Artifacts(Artifact(“foo”, “约翰”))'正确? – reikje