@nx/gradle 19.4.0-canary.20240621-472459d → 19.4.0-canary.20240626-3a2e8d4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/migrations.json CHANGED
@@ -1,4 +1,11 @@
1
1
  {
2
- "generators": {},
2
+ "generators": {
3
+ "add-project-report-all": {
4
+ "version": "19.4.0-beta.1",
5
+ "cli": "nx",
6
+ "description": "Add task projectReportAll to build.gradle file",
7
+ "factory": "./src/migrations/19-4-0/add-project-report-all"
8
+ }
9
+ },
3
10
  "packageJsonUpdates": {}
4
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/gradle",
3
- "version": "19.4.0-canary.20240621-472459d",
3
+ "version": "19.4.0-canary.20240626-3a2e8d4",
4
4
  "private": false,
5
5
  "description": "The Nx Plugin for Gradle allows Gradle tasks to be run through Nx",
6
6
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "migrations": "./migrations.json"
35
35
  },
36
36
  "dependencies": {
37
- "@nx/devkit": "19.4.0-canary.20240621-472459d"
37
+ "@nx/devkit": "19.4.0-canary.20240626-3a2e8d4"
38
38
  },
39
39
  "publishConfig": {
40
40
  "access": "public"
@@ -1,4 +1,8 @@
1
1
  import { GeneratorCallback, Tree } from '@nx/devkit';
2
2
  import { InitGeneratorSchema } from './schema';
3
3
  export declare function initGenerator(tree: Tree, options: InitGeneratorSchema): Promise<GeneratorCallback>;
4
+ /**
5
+ * This function creates and populate build.gradle file next to the settings.gradle file.
6
+ */
7
+ export declare function addBuildGradleFileNextToSettingsGradle(tree: Tree): Promise<void>;
4
8
  export default initGenerator;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initGenerator = void 0;
3
+ exports.addBuildGradleFileNextToSettingsGradle = exports.initGenerator = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const child_process_1 = require("child_process");
6
6
  const versions_1 = require("../../utils/versions");
7
7
  const has_gradle_plugin_1 = require("../../utils/has-gradle-plugin");
8
+ const path_1 = require("path");
8
9
  async function initGenerator(tree, options) {
9
10
  const tasks = [];
10
11
  if (!tree.exists('settings.gradle') && !tree.exists('settings.gradle.kts')) {
@@ -18,9 +19,9 @@ Running 'gradle init':`);
18
19
  '@nx/gradle': versions_1.nxVersion,
19
20
  }, undefined, options.keepExistingVersions));
20
21
  }
22
+ await addBuildGradleFileNextToSettingsGradle(tree);
21
23
  addPlugin(tree);
22
24
  updateNxJsonConfiguration(tree);
23
- addProjectReportToBuildGradle(tree);
24
25
  if (!options.skipFormat) {
25
26
  await (0, devkit_1.formatFiles)(tree);
26
27
  }
@@ -43,23 +44,39 @@ function addPlugin(tree) {
43
44
  }
44
45
  }
45
46
  /**
46
- * This function adds the project-report plugin to the build.gradle or build.gradle.kts file
47
+ * This function creates and populate build.gradle file next to the settings.gradle file.
47
48
  */
48
- function addProjectReportToBuildGradle(tree) {
49
- let buildGradleFile;
50
- if (tree.exists('settings.gradle.kts')) {
51
- buildGradleFile = 'build.gradle.kts';
52
- }
53
- else if (tree.exists('settings.gradle')) {
54
- buildGradleFile = 'build.gradle';
49
+ async function addBuildGradleFileNextToSettingsGradle(tree) {
50
+ const settingsGradleFiles = await (0, devkit_1.globAsync)(tree, [
51
+ '**/settings.gradle?(.kts)',
52
+ ]);
53
+ settingsGradleFiles.forEach((settingsGradleFile) => {
54
+ addProjectReportToBuildGradle(settingsGradleFile, tree);
55
+ });
56
+ }
57
+ exports.addBuildGradleFileNextToSettingsGradle = addBuildGradleFileNextToSettingsGradle;
58
+ /**
59
+ * - creates a build.gradle file next to the settings.gradle file if it does not exist.
60
+ * - adds the project-report plugin to the build.gradle file if it does not exist.
61
+ * - adds a task to generate project reports for all subprojects and included builds.
62
+ */
63
+ function addProjectReportToBuildGradle(settingsGradleFile, tree) {
64
+ const filename = (0, path_1.basename)(settingsGradleFile);
65
+ let gradleFilePath = 'build.gradle';
66
+ if (filename.endsWith('.kts')) {
67
+ gradleFilePath = 'build.gradle.kts';
55
68
  }
69
+ gradleFilePath = (0, path_1.join)((0, path_1.dirname)(settingsGradleFile), gradleFilePath);
56
70
  let buildGradleContent = '';
57
- if (tree.exists(buildGradleFile)) {
58
- buildGradleContent = tree.read(buildGradleFile).toString();
71
+ if (!tree.exists(gradleFilePath)) {
72
+ tree.write(gradleFilePath, buildGradleContent); // create a build.gradle file near settings.gradle file if it does not exist
73
+ }
74
+ else {
75
+ buildGradleContent = tree.read(gradleFilePath).toString();
59
76
  }
60
77
  if (buildGradleContent.includes('allprojects')) {
61
- if (!buildGradleContent.includes('"project-report')) {
62
- devkit_1.logger.warn(`Please add the project-report plugin to your ${buildGradleFile}:
78
+ if (!buildGradleContent.includes('"project-report"')) {
79
+ devkit_1.logger.warn(`Please add the project-report plugin to your ${gradleFilePath}:
63
80
  allprojects {
64
81
  apply {
65
82
  plugin("project-report")
@@ -73,7 +90,37 @@ allprojects {
73
90
  plugin("project-report")
74
91
  }
75
92
  }`;
76
- tree.write(buildGradleFile, buildGradleContent);
93
+ }
94
+ if (!buildGradleContent.includes(`tasks.register("projectReportAll")`)) {
95
+ if (gradleFilePath.endsWith('.kts')) {
96
+ buildGradleContent += `\n\rtasks.register("projectReportAll") {
97
+ // All project reports of subprojects
98
+ allprojects.forEach {
99
+ dependsOn(it.tasks.get("projectReport"))
100
+ }
101
+
102
+ // All projectReportAll of included builds
103
+ gradle.includedBuilds.forEach {
104
+ dependsOn(it.task(":projectReportAll"))
105
+ }
106
+ }`;
107
+ }
108
+ else {
109
+ buildGradleContent += `\n\rtasks.register("projectReportAll") {
110
+ // All project reports of subprojects
111
+ allprojects.forEach {
112
+ dependsOn(it.tasks.getAt("projectReport"))
113
+ }
114
+
115
+ // All projectReportAll of included builds
116
+ gradle.includedBuilds.forEach {
117
+ dependsOn(it.task(":projectReportAll"))
118
+ }
119
+ }`;
120
+ }
121
+ }
122
+ if (buildGradleContent) {
123
+ tree.write(gradleFilePath, buildGradleContent);
77
124
  }
78
125
  }
79
126
  function updateNxJsonConfiguration(tree) {
@@ -0,0 +1,5 @@
1
+ import { Tree } from '@nx/devkit';
2
+ /**
3
+ * This migration adds task `projectReportAll` to build.gradle files
4
+ */
5
+ export default function update(tree: Tree): Promise<void>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const init_1 = require("../../generators/init/init");
4
+ /**
5
+ * This migration adds task `projectReportAll` to build.gradle files
6
+ */
7
+ async function update(tree) {
8
+ await (0, init_1.addBuildGradleFileNextToSettingsGradle)(tree);
9
+ }
10
+ exports.default = update;
@@ -1,2 +1,3 @@
1
- import { CreateDependencies } from '@nx/devkit';
1
+ import { CreateDependencies, CreateDependenciesContext, RawProjectGraphDependency } from '@nx/devkit';
2
2
  export declare const createDependencies: CreateDependencies;
3
+ export declare function processGradleDependencies(depsFile: string, gradleProjectToProjectName: Map<string, string>, sourceProjectName: string, gradleFile: string, context: CreateDependenciesContext, dependencies: Set<RawProjectGraphDependency>): void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createDependencies = void 0;
3
+ exports.processGradleDependencies = exports.createDependencies = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const node_fs_1 = require("node:fs");
6
6
  const node_path_1 = require("node:path");
@@ -10,20 +10,20 @@ const createDependencies = async (_, context) => {
10
10
  if (gradleFiles.length === 0) {
11
11
  return [];
12
12
  }
13
- let dependencies = [];
14
13
  const gradleDependenciesStart = performance.mark('gradleDependencies:start');
15
14
  const { gradleFileToGradleProjectMap, gradleProjectToProjectName, buildFileToDepsMap, } = (0, get_gradle_report_1.getCurrentGradleReport)();
15
+ const dependencies = new Set();
16
16
  for (const gradleFile of gradleFiles) {
17
17
  const gradleProject = gradleFileToGradleProjectMap.get(gradleFile);
18
18
  const projectName = gradleProjectToProjectName.get(gradleProject);
19
19
  const depsFile = buildFileToDepsMap.get(gradleFile);
20
20
  if (projectName && depsFile) {
21
- dependencies = dependencies.concat(Array.from(processGradleDependencies(depsFile, gradleProjectToProjectName, projectName, gradleFile, context)));
21
+ processGradleDependencies(depsFile, gradleProjectToProjectName, projectName, gradleFile, context, dependencies);
22
22
  }
23
23
  }
24
24
  const gradleDependenciesEnd = performance.mark('gradleDependencies:end');
25
25
  performance.measure('gradleDependencies', gradleDependenciesStart.name, gradleDependenciesEnd.name);
26
- return dependencies;
26
+ return Array.from(dependencies);
27
27
  };
28
28
  exports.createDependencies = createDependencies;
29
29
  const gradleConfigFileNames = new Set(['build.gradle', 'build.gradle.kts']);
@@ -38,8 +38,7 @@ function findGradleFiles(fileMap) {
38
38
  }
39
39
  return gradleFiles;
40
40
  }
41
- function processGradleDependencies(depsFile, gradleProjectToProjectName, sourceProjectName, gradleFile, context) {
42
- const dependencies = new Set();
41
+ function processGradleDependencies(depsFile, gradleProjectToProjectName, sourceProjectName, gradleFile, context, dependencies) {
43
42
  const lines = (0, node_fs_1.readFileSync)(depsFile).toString().split(get_gradle_report_1.newLineSeparator);
44
43
  let inDeps = false;
45
44
  for (const line of lines) {
@@ -54,22 +53,31 @@ function processGradleDependencies(depsFile, gradleProjectToProjectName, sourceP
54
53
  continue;
55
54
  }
56
55
  const [indents, dep] = line.split('--- ');
57
- if ((indents === '\\' || indents === '+') && dep.startsWith('project ')) {
58
- const gradleProjectName = dep
59
- .substring('project '.length)
60
- .replace(/ \(n\)$/, '')
61
- .trim();
56
+ if (indents === '\\' || indents === '+') {
57
+ let gradleProjectName;
58
+ if (dep.startsWith('project ')) {
59
+ gradleProjectName = dep
60
+ .substring('project '.length)
61
+ .replace(/ \(n\)$/, '')
62
+ .trim();
63
+ }
64
+ else if (dep.includes('-> project')) {
65
+ const [_, projectName] = dep.split('-> project');
66
+ gradleProjectName = projectName.trim();
67
+ }
62
68
  const target = gradleProjectToProjectName.get(gradleProjectName);
63
- const dependency = {
64
- source: sourceProjectName,
65
- target,
66
- type: devkit_1.DependencyType.static,
67
- sourceFile: gradleFile,
68
- };
69
- (0, devkit_1.validateDependency)(dependency, context);
70
- dependencies.add(dependency);
69
+ if (target) {
70
+ const dependency = {
71
+ source: sourceProjectName,
72
+ target,
73
+ type: devkit_1.DependencyType.static,
74
+ sourceFile: gradleFile,
75
+ };
76
+ (0, devkit_1.validateDependency)(dependency, context);
77
+ dependencies.add(dependency);
78
+ }
71
79
  }
72
80
  }
73
81
  }
74
- return dependencies;
75
82
  }
83
+ exports.processGradleDependencies = processGradleDependencies;
@@ -30,11 +30,32 @@ async function populateGradleReport(workspaceRoot) {
30
30
  return;
31
31
  }
32
32
  const gradleProjectReportStart = performance.mark('gradleProjectReport:start');
33
- const projectReportLines = (await (0, exec_gradle_1.execGradleAsync)(['projectReport'], {
34
- cwd: workspaceRoot,
35
- }))
33
+ let projectReportLines;
34
+ try {
35
+ projectReportLines = await (0, exec_gradle_1.execGradleAsync)(['projectReportAll'], {
36
+ cwd: workspaceRoot,
37
+ });
38
+ }
39
+ catch (e) {
40
+ try {
41
+ projectReportLines = await (0, exec_gradle_1.execGradleAsync)(['projectReport'], {
42
+ cwd: workspaceRoot,
43
+ });
44
+ devkit_1.logger.warn('Could not run `projectReportAll` task. Ran `projectReport` instead. Please run `nx generate @nx/gradle:init` to generate the necessary tasks.');
45
+ }
46
+ catch (e) {
47
+ throw new devkit_1.AggregateCreateNodesError([
48
+ [
49
+ null,
50
+ new Error('Could not run `projectReportAll` or `projectReport` task. Please run `nx generate @nx/gradle:init` to generate the necessary tasks.'),
51
+ ],
52
+ ], []);
53
+ }
54
+ }
55
+ projectReportLines = projectReportLines
36
56
  .toString()
37
- .split(exports.newLineSeparator);
57
+ .split(exports.newLineSeparator)
58
+ .filter((line) => line.trim() !== '');
38
59
  const gradleProjectReportEnd = performance.mark('gradleProjectReport:end');
39
60
  performance.measure('gradleProjectReport', gradleProjectReportStart.name, gradleProjectReportEnd.name);
40
61
  gradleReportCache = processProjectReports(projectReportLines);
@@ -45,10 +66,6 @@ function processProjectReports(projectReportLines) {
45
66
  * Map of Gradle File path to Gradle Project Name
46
67
  */
47
68
  const gradleFileToGradleProjectMap = new Map();
48
- /**
49
- * Map of Gradle Project Name to Gradle File
50
- */
51
- const gradleProjectToGradleFileMap = new Map();
52
69
  const dependenciesMap = new Map();
53
70
  /**
54
71
  * Map of Gradle Build File to tasks type map
@@ -115,7 +132,6 @@ function processProjectReports(projectReportLines) {
115
132
  outputDirMap.set('classes', `{workspaceRoot}/${(0, node_path_1.join)(buildDir, 'classes')}`);
116
133
  gradleFileToOutputDirsMap.set(buildFile, outputDirMap);
117
134
  gradleFileToGradleProjectMap.set(buildFile, gradleProject);
118
- gradleProjectToGradleFileMap.set(gradleProject, buildFile);
119
135
  gradleProjectToProjectName.set(gradleProject, projectName);
120
136
  }
121
137
  if (line.endsWith('taskReport')) {