1

我在理解 gradle 中创建和上传工件的所有部分如何组合在一起时遇到了一些实际问题。

我在这个脚本中的意图很简单:我想下载一个源 tarball 和可能的一堆依赖项,运行一个“build.sh”shellscript,它最终会创建一个二进制 tarball,并让 gradle 脚本将它发布到一个工件 repo。

主要思想是我可以使用gradle的依赖管理,maven工件知识和构建并行化和避免来控制构建脚本本身的执行,主要是管理我的一组第三方二进制依赖...

以下脚本失败并出现 400 错误,我怀疑这是因为我没有将工件与实际输出文件链接。

正确和正确的方法是什么?

apply plugin: 'maven'

version 'testarch-4.2'

repositories {
  maven {
    url "http://nexus/..."
  }
}

configurations {
  sourceArchive
  binaryArchive
}

dependencies {
  sourceArchive "org.gnu:bash:4.2:src@tgz"
}

task buildFromSource(type: Exec) {
  inputs.files configurations.sourceArchive.files
  outputs.file file("${project.name}-${project.version}.tgz")
  executable './build.sh'
  def myArgs = configurations.sourceArchive.files.path
  myArgs.add(0, outputs.files.asPath)
  args myArgs
}

artifacts {
  // Is this really the only way to transform a singleton collection
  // into the singleton?
  //   def outputFile
  //   buildFromSource.outputs.files.each { outputFile = it }
  // Nope: this is better magic:
  def outputFile = buildFromSource.outputs.files.singleFile
  println outputFile.path
  binaryArchive file: outputFile, name: 'bash'
  // binaryArchive file: file(buildFromSource.outputs.files.asPath), name: 'bash'
}

uploadArchives {
  configuration = configurations.binaryArchive
  repositories.mavenDeployer {
    repository(url: "http://nexus/..") {
      authentication(userName: "me", password: "secret!")
    }
    pom.groupId = 'org.gnu'
  }
}

uploadArchives.dependsOn buildFromSource

我得到的错误是:

* What went wrong:
Execution failed for task ':uploadArchives'.
> Could not publish configuration 'binaryArchive'
   > Error deploying artifact 'org.gnu:bash:tgz': Error deploying artifact: Failed to transfer file: http://nexus/.../org/gnu/bash/testarch-4.2/bash-testarch-4.2.tgz. Return code is: 400

从评论更新,同样的错误 - 试图访问连接日志以进行进一步调试。

来自 Nexus 的错误是“缺少实体”,请参阅:Missing Request Entity response to a PUT to Nexus

4

1 回答 1

0

我的问题的根本原因是我正在使用一个空文件进行测试。Nexus 不喜欢空文件。一旦我将内容放入其中,Nexus 就很高兴并且代码正在运行。

于 2013-11-21T00:43:53.307 回答