目录

Gradle:仓库

引言

你有没有很奇怪,我们的远程引入的依赖库为什么只需要写入源即可?难道还有不需要网络协议就能获取到的资源?怎么可能。那么协议写到了哪里?写到仓库中。位置在project的build.gradle

1
2
3
4
5
6
7
8
9
buildscript {
    repositories {
        // 编译工具用到的仓库
    }
}

allprojects {
    // 所有项目都用到的仓库
}

google()与jcenter()

当我们创建新项目时,就会看到这样的代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
buildscript {
    repositories {
        google()
        jcenter()
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

通过上述代码引入和google和jcenter的仓库,然后我们填写依赖的源的时候,会根据源自动在这些仓库中搜索合适的库进行引入。 我们打开上述两个方法会发现

1
2
3
4
public interface RepositoryHandler extends ArtifactRepositoryContainer {
    MavenArtifactRepository google();
    MavenArtifactRepository jcenter();
}

MavenArtifactRepository中包含对URI的操作

1
2
3
4
URI getUrl();
void setUrl(URI url);
Set<URI> getArtifactUrls();
...

正是通过这些方法从互联网上获取到远程仓库。

自定义仓库

你还可以通过maven添加新的仓库

1
2
3
4
5
6
7
buildscript {
    repositories {
        maven {
            url "http://repo.mycompany.com/maven2"
        }
    }
}

多模块下的仓库管理

我们之前提到过使用versions来管理版本,也可以用它来管理仓库。 在project下新建version.gradleversions.gradle中(注意调用方法时,使用符号&

1
2
3
4
5
6
def addRepos(RepositoryHandler handler) {
    handler.google()
    handler.jcenter()
    handler.maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
ext.addRepos = this.&addRepos

在project的build.gradle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
buildscript {
    // 引入versions.gradle
    apply from: "versions.gradle"
    // 添加仓库
    addRepos(repositories)
}

allprojects {
    // 添加仓库
    addRepos(repositories)
}