Skip to content

Commit

Permalink
fix(gradle): wrap looping through task inside projectsEvaluated
Browse files Browse the repository at this point in the history
  • Loading branch information
xiongemi committed Feb 6, 2025
1 parent a7a904e commit 1a0f4e2
Show file tree
Hide file tree
Showing 16 changed files with 291 additions and 380 deletions.
13 changes: 4 additions & 9 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
group = "dev.nx"

plugins {
// id("dev.nx.gradle.native") version("+")
id("dev.nx.gradle.native") version("+")
}

group = "dev.nx.gradle"

allprojects {
apply {
plugin("project-report")
}
}

repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}

tasks.register("projectReportAll") {
// All project reports of subprojects
allprojects.forEach {
Expand All @@ -25,4 +20,4 @@ tasks.register("projectReportAll") {
gradle.includedBuilds.forEach {
dependsOn(it.task(":projectReportAll"))
}
}
}
23 changes: 0 additions & 23 deletions packages/build.gradle.kts

This file was deleted.

23 changes: 0 additions & 23 deletions packages/gradle/build.gradle.kts

This file was deleted.

5 changes: 1 addition & 4 deletions packages/gradle/native/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ plugins {
id("com.gradle.plugin-publish") version "1.3.0"

id("java-library")
id("org.jetbrains.kotlin.jvm") version "1.9.25"
id("org.jetbrains.kotlin.jvm") version "2.1.10"
}

repositories {
Expand Down Expand Up @@ -52,9 +52,6 @@ publishing {
dependencies {
implementation("com.google.code.gson:gson:2.11.0")

compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib")

testImplementation(kotlin("test"))
}

Expand Down
17 changes: 17 additions & 0 deletions packages/gradle/native/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* This file was generated by the Gradle 'init' task.
*
* The settings file is used to specify which projects to include in your build.
* For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.5/userguide/building_swift_projects.html in the Gradle documentation.
*/


pluginManagement {
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}
}

rootProject.name = "native"
5 changes: 0 additions & 5 deletions packages/gradle/native/settings.xml

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package dev.nx.gradle.native

import com.google.gson.Gson
import org.gradle.api.DefaultTask
import java.io.File
import org.gradle.api.tasks.options.Option
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import java.nio.file.Path
import org.gradle.api.logging.Logger
import org.gradle.api.file.ProjectLayout
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Nested
import javax.inject.Inject
import kotlin.io.path.Path
import java.nio.file.Files

/**
* This task generates nodes, depedencies and external nodes for all projects int the workspace
* This task generates nodes, dependencies and external nodes for all projects int the workspace
* For each project, it will generate a json file at outputDirectory/projectName+hash.json
* Inputs:
* - hash: hash to in the file name
Expand All @@ -22,37 +22,37 @@ import java.nio.file.Files
*/
abstract class CreateNodesTask
@Inject constructor(private var projectLayout: ProjectLayout) : DefaultTask() {
@Option(option = "hash", description = "hash adds to output file")
@Option(option = "hash", description = "hash adds to output file name")
@Input
var hash: String = ""

@get:Input
abstract var json: String

@get:Input
abstract var projectName: String

private var logger = getLogger()
@get:Nested
abstract val gradleNodeReport: Property<GradleNodeReport>

@TaskAction
fun action() {
logger.info("CreateNodes: using hash ${hash}")
logger.info("CreateNodes: create file for ${projectName}")
logger.info("CreateNodes: using hash $hash")
logger.info("CreateNodes: create file for $projectName")

var buildDirectory = projectLayout.getBuildDirectory()
var buildDirectoryFile: File = buildDirectory.getAsFile().get()
val buildDirectory = projectLayout.buildDirectory
val buildDirectoryFile: File = buildDirectory.asFile.get()
if (!buildDirectoryFile.exists()) {
Files.createDirectory(buildDirectoryFile.toPath())
}

var outputDirectory = buildDirectory.dir("nx").get()
var outputDirectoryFile = outputDirectory.getAsFile()
val outputDirectory = buildDirectory.dir("nx").get()
val outputDirectoryFile = outputDirectory.asFile
if (!outputDirectoryFile.exists()) {
Files.createDirectory(outputDirectoryFile.toPath())
}
val file = outputDirectory.file("${projectName}${hash}.json").getAsFile()
val file = outputDirectory.file("${projectName}${hash}.json").asFile

val gson = Gson()
val json = gson.toJson(gradleNodeReport.get())
file.writeText(json)
println(file.getPath())
println(file.path)
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.nx.gradle.native

import org.gradle.api.tasks.Input

typealias Target = MutableMap<String, Any?>

typealias Targets = MutableMap<String, Target>
Expand All @@ -14,7 +16,7 @@ data class GradleTargets(
var externalNodes: MutableMap<String, ExternalNode>
)

data class NodeMetadata(val targetGroups: TargetGroups, val technologies: Array<String>, val description: String?)
data class NodeMetadata(val targetGroups: TargetGroups, val technologies: List<String>, val description: String?)

data class ProjectNode(
val targets: Targets,
Expand All @@ -27,4 +29,10 @@ data class ExternalDepData(val version: String?, val packageName: String, val ha

data class ExternalNode(var type: String?, val name: String, var data: ExternalDepData)

data class GradleNodeReport(var nodes: MutableMap<String, ProjectNode>?, var dependencies: MutableSet<Dependency>?, var externalNodes: MutableMap<String, ExternalNode>?)
data class GradleNodeReport(
@Input
var nodes: MutableMap<String, ProjectNode>?,
@Input
var dependencies: MutableSet<Dependency>?,
@Input
var externalNodes: MutableMap<String, ExternalNode>?)
Original file line number Diff line number Diff line change
@@ -1,69 +1,35 @@
package dev.nx.gradle.native

import org.gradle.api.Project
import org.gradle.api.Plugin
import com.google.gson.Gson
import org.gradle.api.Project

/**
* A plugin to create nx nodes, dependencies and external nodes
*/
class NodesPlugin : Plugin<Project> {

override fun apply(project: Project) {
project.logger.info("HELLO")
val gradleNodeReport = project.objects.property(GradleNodeReport::class.java)

// Initialize and store data in GradleNodeReport safely
project.gradle.projectsEvaluated {
val report = createNodeForProject(project)
gradleNodeReport.set(report)
}

// Register a task
project.tasks.register("createNodes", CreateNodesTask::class.java) { task ->
val gradleNodeReport = createNodeForProject(project)

task.projectName = project.name
val gson = Gson()
val json = gson.toJson(gradleNodeReport)
task.json = json
task.gradleNodeReport.set(gradleNodeReport)

task.setDescription("Create nodes and dependencies for Nx")
task.setGroup("Nx Custom")
task.description = "Create nodes and dependencies for Nx"
task.group = "Nx Custom"

// Run task for composite builds
project.getGradle().includedBuilds.forEach { includedBuild ->
project.gradle.includedBuilds.forEach { includedBuild ->
task.dependsOn(includedBuild.task(":createNodes"))
}
}
}

/**
* Loops through all projects and populate dependencies and nodes for each target
*/
fun createNodeForProject(rootProject: Project): GradleNodeReport {
val gradleNodeReport = GradleNodeReport(null, null, null)
val logger = rootProject.getLogger()
logger.info("createNodeForProject: get nodes and dependencies for ${rootProject}")

try {
// get dependencies of project
val dependencies = getDependenciesForProject(rootProject, rootProject.getAllprojects())
gradleNodeReport.dependencies = dependencies
logger.info("createNodeForProject: get dependencies for ${rootProject}")
} catch (e: Exception) {
logger.info("createNodeForProject: get dependencies error ${e.toString()}")
}


try {
val gradleTargets: GradleTargets = processTargetsForProject(rootProject)
var projectRoot = rootProject.getProjectDir().getPath()
val projectNode = ProjectNode(
gradleTargets.targets,
NodeMetadata(gradleTargets.targetGroups, arrayOf("gradle"), rootProject.getDescription()),
rootProject.getName()
)
gradleNodeReport.nodes = mutableMapOf<String, ProjectNode>(projectRoot to projectNode)

gradleNodeReport.externalNodes = gradleTargets.externalNodes
logger.info("CreateNodes: get nodes and external nodes for ${projectRoot}")
} catch (e: Exception) {
logger.info("${rootProject}: get nodes error ${e.toString()}")
}
return gradleNodeReport
}
}

Loading

0 comments on commit 1a0f4e2

Please sign in to comment.