在 gradle 中重构 maven 块

kar*_*arl 2 android gradle maven android-gradle-plugin

我正在开发一个 android 项目,并且有许多使用相同凭据的自定义存储库:

repositories {
  maven {
    url "<url1>"
    credentials {
      username = "<username>"
      password = "<password>"
    }
  }

  maven {
    url "<url2>"
    credentials {
      username = "<username>"
      password = "<password>"
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

有没有办法定义一个方法(块?),以便我可以定义一次用户名和密码而不必每次都重复?我希望能够做到:

repositories {
  customMaven { url "<url1>"}
  customMaven { url "<url2>"}
}
Run Code Online (Sandbox Code Playgroud)

抱歉,如果我在这里错误地使用了术语 - gradle 语法对我来说有点神秘。

M.R*_*uti 5

通过@ToYonos提供的第一个答案将正常工作,但如果你正在寻找一个基础上的解决方案配置块,你可以使用的方法MavenArtifactRepository maven(Action<? super MavenArtifactRepository> action)RepositoryHandler类(见这里),具体如下:

// a Closure that builds an Action for configuring a MavenArtifactRepository instance
def customMavenRepo = { url ->
    return new Action<MavenArtifactRepository>() {
        void execute(MavenArtifactRepository repo) {
            repo.setUrl(url)
            repo.credentials(new Action<PasswordCredentials>() {
                void execute(PasswordCredentials credentials) {
                    credentials.setUsername("<username>")
                    credentials.setPassword("<password>")
                }
            });
        }
    };
}

// usage
repositories {
    jcenter()
    maven customMavenRepo("http://company.com/repo1")
    maven customMavenRepo("http://company.com/repo2")
    maven customMavenRepo("http://company.com/repo3")
}
Run Code Online (Sandbox Code Playgroud)

从下面的评论中编辑:解决方案将关闭如下。我认为这里需要使用curry方法(参见Currying 闭包),但也许还有其他方法可以简化......

// one closure with URL as parameter
ext.myCustomMavenClosure = { pUrl ->
    url pUrl
    credentials {
        username = "<username>"
        password = "<password>"
    }
}
// helper function to return a "curried" closure
Closure myCustomMaven (url){
    return myCustomMavenClosure.curry(url)
}

repositories {
    // use closure directly
    maven myCustomMavenClosure.curry ("http://mycompany.com/repo1")
    // or use helper method
    maven myCustomMaven("http://mycompany.com/repo2")
}    
Run Code Online (Sandbox Code Playgroud)