2015-05-12 36 views
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) 

回答

1
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) 
    } 
+0

感谢,修复错误。然而,当我运行这个时,我从来没有在运行'publish-local'之后看到这些工件 - 既不在'target'也不在'〜/ .ivy/local'中。我错过了什么?我想要的是包含“foo”,“bar”,“john”和“doe”中的类的单个罐子。 – reikje

+0

是的,你错过了你正在定义一个目录的工件,而不是一个打包的文件。我不建议一路走下这条路,它让我想起了蚂蚁,以及为什么maven的约定(它被采用)工作得很好:在源和神器之间保持简单的1对1关系。所以我会建议你组织你的构建是多个项目,并使用盒子里的东西,而不是沿着这条路线走。 –

+0

是的,你是对的。这个项目只包含很多.thrift文件,它们将生成源代码。我想将为每个.thrift文件生成的类打包到单独的工件中,然后可以使用分类器语法在另一个工程中使用它。如果我创建一个多项目构建,并且每个thrift文件都存在于它自己的项目中,那么我将无法使用类分类器,比如'libraryDependencies + =“whatever”%“whatever”%“1.0”Artifacts(Artifact(“foo”, “约翰”))'正确? – reikje

相关问题