Gradle ソース解析
Gradleが内部的にどのように構成されているか確認するためにソースコードリーディングしています。
その際のメモです。バージョンは 4.1.0。
From https://github.com/gradle/gradle (tag: v4.1.0)
task
- org.gradle.api.Task
- org.gradle.api.internal.project.DefaultProject#task()
- org.gradle.api.internal.ClassGenerator#generate()
※ leftShift ( << ) でのタスク定義は非推奨となり v5.0 で削除予定
repositories
拡張プロパティ、プロジェクトプロパティ
- なぜ ext で設定することができる?
- ProjectPropertySettingBuildLoader#CachingPropertyApplicator
private static class CachingPropertyApplicator {
private final Map<Pair<String, ? extends Class<?>>, PropertyMutator> mutators = Maps.newHashMap();
private Class<? extends Project> projectClazz;
void configureProperty(Project project, String name, Object value) {
Class<? extends Project> clazz = project.getClass();
if (clazz != projectClazz) {
mutators.clear();
projectClazz = clazz;
}
Class<?> valueType = value == null ? null : value.getClass();
Pair<String, ? extends Class<?>> key = Pair.of(name, valueType);
PropertyMutator propertyMutator = mutators.get(key);
if (propertyMutator != null) {
propertyMutator.setValue(project, value);
} else {
if (!mutators.containsKey(key)) {
propertyMutator = JavaReflectionUtil.writeablePropertyIfExists(clazz, name, valueType);
mutators.put(key, propertyMutator);
if (propertyMutator != null) {
propertyMutator.setValue(project, value);
return;
}
}
ExtraPropertiesExtension extraProperties = project.getExtensions().getExtraProperties();
extraProperties.set(name, value);
}
}
}
- org.gradle.api.Project#getExtensions()
- org.gradle.api.internal.project.DefaultProject#getExtensions()
Configurations
なぜ configurations スコープに記述するだけでコンフィグレーションが生成される?
↓ DefaultConfiguration が生成される
org/gradle/api/internal/artifacts/configurations/DefaultConfiguration.
↓ dependencies スコープ側の delegate で動的にメソッド追加される
JavaPlugin
MavenPlugin
内部情報確認
repositories
build.gradle
def closure = {
mavenCentral()
}
this.repositories(closure)
this.repositories.each { println it instanceof org.gradle.api.internal.artifacts.repositories.DefaultMavenArtifactRepository }
//-> true