问题
在开发过程中,有时需要同时发布一份aar/jar到远程和本地的repo,这样可以保证在没有网的情况下编译成功。
解决
不可能在uploadArchive任务中设置多个repo,因为源码里明显写的只有单个repository对象。所以需要手写一个Upload task的子类。
里面有的坑是configuration需要手动设置成project的archives,否则打包不过。
推荐在每次发布之后,都在git上打一个tag,方便后续查问题。这里的坑是同一个task里的commandline是并行执行的,只能用task做顺序。
最后的gradle长这样:
apply plugin: 'maven'
repositories {
mavenCentral()
}
group = "gt.${project.getName()}"
version "${project.extensions.getByName("uploadVersion")}-SNAPSHOT"
task uploadLocal(type: Upload) {
// 需要把config设置成project的,要不然会报错
configuration = project.configurations.findByName('archives')
repositories {
mavenDeployer {
def localDir = uri("${rootProject.buildFile.parentFile.absolutePath}/repos")
snapshotRepository(url: localDir)
repository(url: localDir)
}
}
}
uploadArchives {
repositories {
mavenDeployer {
snapshotRepository(url: 'http://remote') {
authentication(userName: 'username', password: 'pwd')
}
repository(url: 'http://remote') {
authentication(userName: 'username', password: 'pwd')
}
pom.project {
groupId = "gt.${project.getName()}"
artifactId "${project.getName()}"
}
}
}
}
task gitRemoveTag(type: Exec) {
commandLine 'git', 'tag', '-d', "library/${project.name}/${version}"
}
task gitAddTag(type: Exec, dependsOn: 'gitRemoveTag') {
commandLine 'git', 'tag', "library/${project.name}/${version}"
}
task gitPushTag(type: Exec, dependsOn: 'gitAddTag') {
commandLine 'git', 'push', 'origin', '--tags'
}
uploadArchives.dependsOn uploadLocal
uploadArchives.finalizedBy gitPushTag