Skip to content

Basic Usage ​

This guide covers the fundamental operations you can perform with Gradle Parser, including parsing files, extracting information, and working with the parsed data.

Parsing Gradle Files ​

Simple File Parsing ​

The most straightforward way to parse a Gradle file:

go
package main

import (
    "fmt"
    "log"
    "github.com/scagogogo/gradle-parser/pkg/api"
)

func main() {
    result, err := api.ParseFile("build.gradle")
    if err != nil {
        log.Fatal(err)
    }

    project := result.Project
    fmt.Printf("Project: %s\n", project.Name)
    fmt.Printf("Group: %s\n", project.Group)
    fmt.Printf("Version: %s\n", project.Version)
}

Parsing Different Sources ​

You can parse Gradle content from various sources:

go
// From file
result, err := api.ParseFile("build.gradle")

// From string
gradleContent := `
plugins {
    id 'java'
}
group = 'com.example'
version = '1.0.0'
`
result, err = api.ParseString(gradleContent)

// From any io.Reader
file, err := os.Open("build.gradle")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
result, err = api.ParseReader(file)

Working with Dependencies ​

Extracting Dependencies ​

Get all dependencies from a Gradle file:

go
deps, err := api.GetDependencies("build.gradle")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Found %d dependencies:\n", len(deps))
for _, dep := range deps {
    fmt.Printf("  %s:%s:%s (%s)\n", 
        dep.Group, dep.Name, dep.Version, dep.Scope)
}

Grouping Dependencies by Scope ​

Organize dependencies by their scope (implementation, testImplementation, etc.):

go
deps, err := api.GetDependencies("build.gradle")
if err != nil {
    log.Fatal(err)
}

depSets := api.DependenciesByScope(deps)
for _, depSet := range depSets {
    fmt.Printf("\n%s dependencies:\n", depSet.Scope)
    for _, dep := range depSet.Dependencies {
        fmt.Printf("  %s:%s:%s\n", dep.Group, dep.Name, dep.Version)
    }
}

Analyzing Dependencies ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    log.Fatal(err)
}

dependencies := result.Project.Dependencies

// Count dependencies by scope
scopeCount := make(map[string]int)
for _, dep := range dependencies {
    scopeCount[dep.Scope]++
}

fmt.Println("Dependencies by scope:")
for scope, count := range scopeCount {
    fmt.Printf("  %s: %d\n", scope, count)
}

// Find specific dependencies
for _, dep := range dependencies {
    if dep.Group == "org.springframework" {
        fmt.Printf("Found Spring dependency: %s:%s:%s\n", 
            dep.Group, dep.Name, dep.Version)
    }
}

Working with Plugins ​

Extracting Plugins ​

Get all plugins from a Gradle file:

go
plugins, err := api.GetPlugins("build.gradle")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Found %d plugins:\n", len(plugins))
for _, plugin := range plugins {
    fmt.Printf("  %s", plugin.ID)
    if plugin.Version != "" {
        fmt.Printf(" (v%s)", plugin.Version)
    }
    if !plugin.Apply {
        fmt.Printf(" [not applied]")
    }
    fmt.Println()
}

Project Type Detection ​

Determine the type of project based on applied plugins:

go
plugins, err := api.GetPlugins("build.gradle")
if err != nil {
    log.Fatal(err)
}

// Check project types
if api.IsAndroidProject(plugins) {
    fmt.Println("✓ Android project")
}

if api.IsKotlinProject(plugins) {
    fmt.Println("✓ Kotlin project")
}

if api.IsSpringBootProject(plugins) {
    fmt.Println("✓ Spring Boot project")
}

// Check for specific plugins
hasJavaPlugin := false
for _, plugin := range plugins {
    if plugin.ID == "java" {
        hasJavaPlugin = true
        break
    }
}

if hasJavaPlugin {
    fmt.Println("✓ Java project")
}

Working with Repositories ​

Extracting Repositories ​

Get repository configurations:

go
repos, err := api.GetRepositories("build.gradle")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Found %d repositories:\n", len(repos))
for _, repo := range repos {
    fmt.Printf("  %s", repo.Name)
    if repo.URL != "" {
        fmt.Printf(" (%s)", repo.URL)
    }
    fmt.Println()
}

Repository Analysis ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    log.Fatal(err)
}

repositories := result.Project.Repositories

// Check for common repositories
hasMaven := false
hasGoogle := false
hasJCenter := false

for _, repo := range repositories {
    switch repo.Name {
    case "mavenCentral":
        hasMaven = true
    case "google":
        hasGoogle = true
    case "jcenter":
        hasJCenter = true
    }
}

fmt.Println("Repository analysis:")
fmt.Printf("  Maven Central: %v\n", hasMaven)
fmt.Printf("  Google: %v\n", hasGoogle)
fmt.Printf("  JCenter: %v\n", hasJCenter)

Working with Project Properties ​

Accessing Basic Properties ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    log.Fatal(err)
}

project := result.Project

// Basic project information
fmt.Printf("Project Information:\n")
fmt.Printf("  Name: %s\n", project.Name)
fmt.Printf("  Group: %s\n", project.Group)
fmt.Printf("  Version: %s\n", project.Version)
fmt.Printf("  Description: %s\n", project.Description)

// Java compatibility
if project.SourceCompatibility != "" {
    fmt.Printf("  Source Compatibility: %s\n", project.SourceCompatibility)
}
if project.TargetCompatibility != "" {
    fmt.Printf("  Target Compatibility: %s\n", project.TargetCompatibility)
}

Custom Properties ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    log.Fatal(err)
}

project := result.Project

// Access custom properties
if len(project.Properties) > 0 {
    fmt.Println("Custom properties:")
    for key, value := range project.Properties {
        fmt.Printf("  %s = %s\n", key, value)
    }
}

Error Handling and Validation ​

Comprehensive Error Handling ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    // Handle different types of errors
    if os.IsNotExist(err) {
        log.Printf("Gradle file not found: %v", err)
        return
    }
    
    if strings.Contains(err.Error(), "permission") {
        log.Printf("Permission denied: %v", err)
        return
    }
    
    log.Printf("Parse error: %v", err)
    return
}

// Check for warnings
if len(result.Warnings) > 0 {
    fmt.Printf("Parsing completed with %d warnings:\n", len(result.Warnings))
    for i, warning := range result.Warnings {
        fmt.Printf("  %d. %s\n", i+1, warning)
    }
}

// Validate results
project := result.Project
if project == nil {
    log.Println("Warning: No project information found")
    return
}

if len(project.Dependencies) == 0 {
    log.Println("Warning: No dependencies found")
}

if len(project.Plugins) == 0 {
    log.Println("Warning: No plugins found")
}

Data Validation ​

go
result, err := api.ParseFile("build.gradle")
if err != nil {
    log.Fatal(err)
}

project := result.Project

// Validate project structure
errors := []string{}

if project.Group == "" {
    errors = append(errors, "Missing project group")
}

if project.Version == "" {
    errors = append(errors, "Missing project version")
}

// Check for required plugins
hasJavaPlugin := false
for _, plugin := range project.Plugins {
    if plugin.ID == "java" || plugin.ID == "java-library" {
        hasJavaPlugin = true
        break
    }
}

if !hasJavaPlugin {
    errors = append(errors, "No Java plugin found")
}

// Report validation results
if len(errors) > 0 {
    fmt.Println("Validation errors:")
    for _, err := range errors {
        fmt.Printf("  - %s\n", err)
    }
} else {
    fmt.Println("✓ Project structure is valid")
}

Performance Considerations ​

Parsing Large Files ​

For large Gradle files, consider using custom parser options:

go
// Create parser with optimized settings
options := api.DefaultOptions()
options.SkipComments = true        // Skip comments for faster parsing
options.CollectRawContent = false  // Don't store raw content to save memory
options.ParseTasks = false         // Skip task parsing if not needed

parser := api.NewParser(options)
result, err := parser.Parse(gradleContent)
if err != nil {
    log.Fatal(err)
}

Batch Processing ​

When processing multiple files:

go
// Reuse parser instance
parser := api.NewParser(api.DefaultOptions())

files := []string{"app/build.gradle", "lib/build.gradle", "core/build.gradle"}
for _, file := range files {
    result, err := parser.ParseFile(file)
    if err != nil {
        log.Printf("Failed to parse %s: %v", file, err)
        continue
    }
    
    fmt.Printf("Processed %s: %d dependencies\n", 
        file, len(result.Project.Dependencies))
}

Next Steps ​

Now that you understand the basics, explore more advanced features:

Released under the MIT License.