如何在 SBT 命令中添加自定义工件

How can you add custom artifacts in a SBT command

谁能告诉我如何在 SBT Command 中添加多个 Artifacts?我想做以下事情。给定以下树:

  - target
     |- scala-2.10
         |- classes
             |- my
                 |- package
                     |- foo
                      - bar
                      - john
                      - doe  

我想创建一个命令,为 my/package 下的每个文件夹发布一个单独的 Artifact (jar)。不应有任何默认值 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)
  def myCommand = Command.single("myCommand") {
    case (currentState, arg) =>
      val extracted = Project.extract(currentState)

      val targetDirectory = extracted.get[File](target in Compile)
      val compileDirectory = extracted.get[File](classDirectory in Compile)
      val packageDir = new sbt.File(compileDirectory, s"my${java.io.File.separator}package")
      val additionalArtifacts =  IO.listFiles(packageDir).toList.map {  serviceDir =>
        val serviceName = serviceDir.name.split(java.io.File.separatorChar).reverse.head
        println(s"Adding artifact for $serviceName")

        val files = Path.allSubpaths(serviceDir)
        val outputZip = new sbt.File(targetDirectory, s"$serviceName.jar")
        sbt.IO.zip(files, outputZip)

        (Artifact(serviceName, serviceName), outputZip)
      }.toMap

      val settings = Seq[Setting[_]](
        packagedArtifacts ++= additionalArtifacts,
        artifacts ++= additionalArtifacts.keys.toSeq
      )

      extracted.append(settings, s)
  }