1

我有一个带有多个子项目的 gradle 项目——我希望能够一次将所有这些子项目发布到本地工件存储库。使用uploadArchives 可以很好地管理这一点。但是,上传需要我不想存储在任何地方的凭据。我发现了几种通过将额外属性设置为根项目的一部分并在子项目中获取它们来实现这一点的黑客方法,但感觉这样做的正确方法是:

task getAuth << {
    ext {
        username = getUsername()
        password = getPassword()
    }
}

uploadArchives.dependsOn(getAuth)

但是,uploadArchives 似乎在它的依赖项之前运行,因此在设置用户名或密码之前设置了身份验证,并且脚本出错了。这对我来说似乎是非常出乎意料的行为。

4

3 回答 3

0

我个人会在任务操作 ( ) 中设置用户名和密码uploadArchives.doFirst { ... },但配置任务也应该有效。如果不是,则可能是您的其余构建脚本有问题。请注意,您正在设置额外的属性getAuth.usernameand getAuth.password,而不是project.usernameand project.password

于 2013-10-24T02:46:13.370 回答
0

所以事实证明我的问题有些错误。我错误地认为为 maven 添加发布存储库的关闭将在任务执行时运行。然而:

uploadArchives {
    addSomeRepos()
}

正在配置 uploadArchives 任务,因此在构建脚本中找到它时运行。因此,在构建脚本之后运行的任务中设置用户名和密码意味着它们在设置时为空。

我通过将 getAuth 任务更改为 createPublishTargets 任务来解决此问题,该任务在任务中配置 uploadArchives 任务。这完美地工作。

task createPublishTarget << {
  ext {
    username = System.console().readLine("\nusername: ")
    password = System.console().readPassword("password: ").toString()
  }

  allprojects {
    uploadArchives {
      repositories {
        mavenDeployer {
          repository(url: "my-artifactory") {
            authentication(userName: createPublishTarget.username, password: createPublishTarget.password)
          }
        }
      }
    }
  }
}

尽管我仍然遇到了一个有趣的问题,它authentication(//blah)配置了一个与我预期不同的对象,因此您必须从任务中显式获取设置的属性。

于 2013-10-24T11:09:20.533 回答
0

我建议将凭据放入$HOME/.gradle/gradle.properties或可能正在创建一个$HOME/.gradle/init.gradle包含存储库定义的脚本。

于 2013-10-25T06:43:29.850 回答