0%

Gradle学习(二):Project核心API

在Gradle术语中,一个项目(project)代表一个正在构建的组件(比如,一个JAR文件),或一个想要完成的目标,如部署应用程序。每个Gradle构建脚本build.gradle至少定义一个项目。当构建进程启动后,Gradle基于build.gradle中的配置实例化org.gradle.api.Project类,并且能够通过project变量使其隐式可用。

1.Project相关API

Project提供了一系列操作Project对象的API。如下:

//返回工程RootProject
Project getRootProject();

//返回父Project,在RootProject中调用会返回null
@Nullable
Project getParent();

//返回当前Project
Project getProject();

//返回一个Project的Set集合,包含当前Project和所有子Project
Set<Project> getAllprojects();

//返回一个Project的Set集合,包含所有子Project
Set<Project> getSubprojects();

//返回指定路径的Project,找不到时返回null
@Nullable
Project findProject(String path);

//返回指定路径的Project,不存在时抛出UnknownProjectException
Project project(String path) throws UnknownProjectException;

//为所有子Project增加配置
void subprojects(Closure var1);

//为当前Project以及所有子Project增加配置
void allprojects(Closure var1);

2.Project属性相关API

Project提供了一系列操作属性的API,通过属性API可以实现在Project之间共享配置参数。如下:

//默认属性
//默认的build文件名
String DEFAULT_BUILD_FILE = "build.gradle";
//路径分隔符
String PATH_SEPARATOR = ":";
//每个工程默认的输出文件夹名称
String DEFAULT_BUILD_DIR_NAME = "build";

//是否存在指定属性名
boolean hasProperty(String propertyName);

//设置属性值,如果属性不存在则抛出MissingPropertyException
void setProperty(String name, @Nullable Object value) throws MissingPropertyException;

//获取属性值,如果不存在则抛出MissingPropertyException
@Nullable
Object property(String propertyName) throws MissingPropertyException;

//查找属性值,如果不存在返回null
@Nullable
Object findProperty(String propertyName);

2.1 ext扩展属性

gradle为Project提供了ext命名空间,用于定义扩展属性。子Project会继承父Project定义的ext属性,但是只读的。我们经常会在Root Project中定义ext属性,而在子Project中可以直接复用属性值。

3.Project文件相关API

3.1 文件获取相关

//获取Project根目录(非项目根目录)
File getRootDir();

//build文件夹目录
File getBuildDir();

//获取项目目录
File getProjectDir();

3.2 文件定位相关

//获取单个文件,相对当前Project目录
File file(Object path);

//获取多个文件,相对当前Project目录
ConfigurableFileCollection files(Object... paths);

3.3 文件拷贝

//文件拷贝,接受闭包作为参数。
WorkResult copy(Closure var1);
使用如下:

copy {
    //文件来源
    from file(‘a.jks’)
    //目的地
    into getRootProject().getBuildDir().path + "/apk/"

    exclude {
        //排除不需要拷贝的文件
    }

    rename {
        //重命名
    }
}

3.4 文件遍历

//将指定目录转化为文件树
ConfigurableFileTree fileTree(Object path);

使用如下:

fileTree('build/output/apk'){ FileTree fileTree ->
    fileTree.visit{ FileTreeElement fileTreeElement ->
    
    }
}