Gradle執行的關鍵代碼 org.gradle.initialization.DefaultGradleLauncher.java
private void doBuildStages(Stage upTo) {
// Evaluate init scripts
initScriptHandler.executeScripts(gradle);
// Evaluate settings script
SettingsInternal settings = settingsHandler.findAndLoadSettings(gradle);
buildListener.settingsEvaluated(settings);
// Load build
buildLoader.load(settings.getRootProject(), settings.getDefaultProject(), gradle, settings.getRootClassLoaderScope());
buildListener.projectsLoaded(gradle);
// Configure build
buildConfigurer.configure(gradle);
if (!gradle.getStartParameter().isConfigureOnDemand()) {
buildListener.projectsEvaluated(gradle);
}
modelConfigurationListener.onConfigure(gradle);
if (upTo == Stage.Configure) {
return;
}
// Populate task graph
buildExecuter.select(gradle);
if (gradle.getStartParameter().isConfigureOnDemand()) {
buildListener.projectsEvaluated(gradle);
}
// Execute build
buildExecuter.execute();
tasksCompletionListener.onTasksFinished(gradle);
assert upTo == Stage.Build;
}
從註釋上我們可以看出gradle的幾個關鍵步驟
A. Evaluate init scripts
1.InitScriptHandler 通過
protected InitScriptHandler createInitScriptHandler() {
return new InitScriptHandler(
new DefaultInitScriptProcessor(
get(ScriptPluginFactory.class),
get(ScriptHandlerFactory.class)
)
);
}
指定了DefaultInitScriptProcessor <span style="font-family: Arial, Helvetica, sans-serif;">對象做它的 processor</span>
2.指定Script finder (in org.gradle.startParameter.java)
從 C:\Users\xxx\.gradle\init.gradle <-USER_HOME
C:\Users\xxx\.gradle\init.d 文件夾中endswith ".gradle" <- USER_HOME
C:\gradle-2.2.1\init.d 文件夾中 endswith ".gradle" <- GRADLE_HOME
3.調用DefaultInitScriptProcessor.processs 函數處理
有個臨時文件 C:\Users\xxx\.gradle\caches\2.2.1\scripts\_333_7ego0r9xq73y22y1atyq8h6q0\InitScript\initscript\classes