@nx/gradle 19.4.1 → 19.5.0-beta.0
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/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nx/gradle",
|
3
|
-
"version": "19.
|
3
|
+
"version": "19.5.0-beta.0",
|
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.
|
37
|
+
"@nx/devkit": "19.5.0-beta.0"
|
38
38
|
},
|
39
39
|
"publishConfig": {
|
40
40
|
"access": "public"
|
@@ -26,12 +26,11 @@ const createDependencies = async (_, context) => {
|
|
26
26
|
return Array.from(dependencies);
|
27
27
|
};
|
28
28
|
exports.createDependencies = createDependencies;
|
29
|
-
const gradleConfigFileNames = new Set(['build.gradle', 'build.gradle.kts']);
|
30
29
|
function findGradleFiles(fileMap) {
|
31
30
|
const gradleFiles = [];
|
32
31
|
for (const [_, files] of Object.entries(fileMap.projectFileMap)) {
|
33
32
|
for (const file of files) {
|
34
|
-
if (
|
33
|
+
if (get_gradle_report_1.GRADLE_BUILD_FILES.has((0, node_path_1.basename)(file.file))) {
|
35
34
|
gradleFiles.push(file.file);
|
36
35
|
}
|
37
36
|
}
|
package/src/plugin/nodes.d.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import { CreateNodes, CreateNodesV2, ProjectConfiguration, TargetConfiguration, CreateNodesFunction } from '@nx/devkit';
|
2
2
|
import { GradleReport } from '../utils/get-gradle-report';
|
3
3
|
export interface GradlePluginOptions {
|
4
|
+
ciTargetName?: string;
|
4
5
|
testTargetName?: string;
|
5
6
|
classesTargetName?: string;
|
6
7
|
buildTargetName?: string;
|
@@ -13,7 +14,7 @@ type GradleTargets = Record<string, {
|
|
13
14
|
}>;
|
14
15
|
export declare function writeTargetsToCache(cachePath: string, results: GradleTargets): void;
|
15
16
|
export declare const createNodesV2: CreateNodesV2<GradlePluginOptions>;
|
16
|
-
export declare const
|
17
|
+
export declare const makeCreateNodesForGradleConfigFile: (gradleReport: GradleReport, targetsCache?: GradleTargets, gradleProjectRootToTestFilesMap?: Record<string, string[]>) => CreateNodesFunction;
|
17
18
|
/**
|
18
19
|
@deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
|
19
20
|
This function will change to the v2 function in Nx 20.
|
package/src/plugin/nodes.js
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.createNodes = exports.
|
3
|
+
exports.createNodes = exports.makeCreateNodesForGradleConfigFile = exports.createNodesV2 = exports.writeTargetsToCache = void 0;
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
5
5
|
const calculate_hash_for_create_nodes_1 = require("@nx/devkit/src/utils/calculate-hash-for-create-nodes");
|
6
6
|
const node_fs_1 = require("node:fs");
|
7
7
|
const node_path_1 = require("node:path");
|
8
8
|
const cache_directory_1 = require("nx/src/utils/cache-directory");
|
9
|
+
const devkit_internals_1 = require("nx/src/devkit-internals");
|
9
10
|
const exec_gradle_1 = require("../utils/exec-gradle");
|
10
11
|
const get_gradle_report_1 = require("../utils/get-gradle-report");
|
11
12
|
const file_hasher_1 = require("nx/src/hasher/file-hasher");
|
@@ -15,6 +16,13 @@ const dependsOnMap = {
|
|
15
16
|
test: ['classes'],
|
16
17
|
classes: ['^classes'],
|
17
18
|
};
|
19
|
+
function normalizeOptions(options) {
|
20
|
+
options ??= {};
|
21
|
+
options.testTargetName ??= 'test';
|
22
|
+
options.classesTargetName ??= 'classes';
|
23
|
+
options.buildTargetName ??= 'build';
|
24
|
+
return options;
|
25
|
+
}
|
18
26
|
function readTargetsCache(cachePath) {
|
19
27
|
return (0, node_fs_1.existsSync)(cachePath) ? (0, devkit_1.readJsonFile)(cachePath) : {};
|
20
28
|
}
|
@@ -23,25 +31,28 @@ function writeTargetsToCache(cachePath, results) {
|
|
23
31
|
}
|
24
32
|
exports.writeTargetsToCache = writeTargetsToCache;
|
25
33
|
exports.createNodesV2 = [
|
26
|
-
get_gradle_report_1.
|
27
|
-
async (
|
34
|
+
get_gradle_report_1.gradleConfigAndTestGlob,
|
35
|
+
async (files, options, context) => {
|
36
|
+
const { configFiles, projectRoots, testFiles } = splitConfigFiles(files);
|
28
37
|
const optionsHash = (0, file_hasher_1.hashObject)(options);
|
29
38
|
const cachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `gradle-${optionsHash}.hash`);
|
30
39
|
const targetsCache = readTargetsCache(cachePath);
|
31
40
|
await (0, get_gradle_report_1.populateGradleReport)(context.workspaceRoot);
|
32
41
|
const gradleReport = (0, get_gradle_report_1.getCurrentGradleReport)();
|
42
|
+
const gradleProjectRootToTestFilesMap = getGradleProjectRootToTestFilesMap(testFiles, projectRoots);
|
33
43
|
try {
|
34
|
-
return
|
44
|
+
return (0, devkit_1.createNodesFromFiles)((0, exports.makeCreateNodesForGradleConfigFile)(gradleReport, targetsCache, gradleProjectRootToTestFilesMap), configFiles, options, context);
|
35
45
|
}
|
36
46
|
finally {
|
37
47
|
writeTargetsToCache(cachePath, targetsCache);
|
38
48
|
}
|
39
49
|
},
|
40
50
|
];
|
41
|
-
const
|
51
|
+
const makeCreateNodesForGradleConfigFile = (gradleReport, targetsCache = {}, gradleProjectRootToTestFilesMap = {}) => async (gradleFilePath, options, context) => {
|
42
52
|
const projectRoot = (0, node_path_1.dirname)(gradleFilePath);
|
53
|
+
options = normalizeOptions(options);
|
43
54
|
const hash = await (0, calculate_hash_for_create_nodes_1.calculateHashForCreateNodes)(projectRoot, options ?? {}, context);
|
44
|
-
targetsCache[hash] ??= createGradleProject(gradleReport, gradleFilePath, options, context);
|
55
|
+
targetsCache[hash] ??= await createGradleProject(gradleReport, gradleFilePath, options, context, gradleProjectRootToTestFilesMap[projectRoot]);
|
45
56
|
const project = targetsCache[hash];
|
46
57
|
if (!project) {
|
47
58
|
return {};
|
@@ -52,7 +63,7 @@ const makeCreateNodes = (gradleReport, targetsCache) => async (gradleFilePath, o
|
|
52
63
|
},
|
53
64
|
};
|
54
65
|
};
|
55
|
-
exports.
|
66
|
+
exports.makeCreateNodesForGradleConfigFile = makeCreateNodesForGradleConfigFile;
|
56
67
|
/**
|
57
68
|
@deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
|
58
69
|
This function will change to the v2 function in Nx 20.
|
@@ -63,11 +74,11 @@ exports.createNodes = [
|
|
63
74
|
devkit_1.logger.warn('`createNodes` is deprecated. Update your plugin to utilize createNodesV2 instead. In Nx 20, this will change to the createNodesV2 API.');
|
64
75
|
await (0, get_gradle_report_1.populateGradleReport)(context.workspaceRoot);
|
65
76
|
const gradleReport = (0, get_gradle_report_1.getCurrentGradleReport)();
|
66
|
-
const internalCreateNodes = (0, exports.
|
77
|
+
const internalCreateNodes = (0, exports.makeCreateNodesForGradleConfigFile)(gradleReport);
|
67
78
|
return await internalCreateNodes(configFile, options, context);
|
68
79
|
},
|
69
80
|
];
|
70
|
-
function createGradleProject(gradleReport, gradleFilePath, options, context) {
|
81
|
+
async function createGradleProject(gradleReport, gradleFilePath, options, context, testFiles = []) {
|
71
82
|
try {
|
72
83
|
const { gradleProjectToTasksTypeMap, gradleFileToOutputDirsMap, gradleFileToGradleProjectMap, gradleProjectToProjectName, } = gradleReport;
|
73
84
|
const gradleProject = gradleFileToGradleProjectMap.get(gradleFilePath);
|
@@ -84,7 +95,7 @@ function createGradleProject(gradleReport, gradleFilePath, options, context) {
|
|
84
95
|
});
|
85
96
|
}
|
86
97
|
const outputDirs = gradleFileToOutputDirsMap.get(gradleFilePath);
|
87
|
-
const { targets, targetGroups } = createGradleTargets(tasks, options, context, outputDirs, gradleProject);
|
98
|
+
const { targets, targetGroups } = await createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleFilePath, testFiles);
|
88
99
|
const project = {
|
89
100
|
name: projectName,
|
90
101
|
targets,
|
@@ -100,29 +111,35 @@ function createGradleProject(gradleReport, gradleFilePath, options, context) {
|
|
100
111
|
return undefined;
|
101
112
|
}
|
102
113
|
}
|
103
|
-
function createGradleTargets(tasks, options, context, outputDirs, gradleProject) {
|
114
|
+
async function createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleFilePath, testFiles = []) {
|
104
115
|
const inputsMap = createInputsMap(context);
|
105
116
|
const targets = {};
|
106
117
|
const targetGroups = {};
|
107
118
|
for (const task of tasks) {
|
108
119
|
const targetName = options?.[`${task.name}TargetName`] ?? task.name;
|
109
|
-
|
120
|
+
let outputs = [outputDirs.get(task.name)].filter(Boolean);
|
121
|
+
if (task.name === 'test') {
|
122
|
+
outputs = [
|
123
|
+
outputDirs.get('testReport'),
|
124
|
+
outputDirs.get('testResults'),
|
125
|
+
].filter(Boolean);
|
126
|
+
getTestCiTargets(testFiles, gradleProject, targetName, options.ciTargetName, inputsMap['test'], outputs, task.type, targets, targetGroups);
|
127
|
+
}
|
128
|
+
const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}${task.name}`;
|
110
129
|
targets[targetName] = {
|
111
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} ${
|
130
|
+
command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun}`,
|
112
131
|
cache: cacheableTaskType.has(task.type),
|
113
132
|
inputs: inputsMap[task.name],
|
114
133
|
dependsOn: dependsOnMap[task.name],
|
115
134
|
metadata: {
|
116
135
|
technologies: ['gradle'],
|
117
136
|
},
|
137
|
+
...(outputs && outputs.length ? { outputs } : {}),
|
118
138
|
};
|
119
|
-
if (outputs) {
|
120
|
-
targets[targetName].outputs = [outputs];
|
121
|
-
}
|
122
139
|
if (!targetGroups[task.type]) {
|
123
140
|
targetGroups[task.type] = [];
|
124
141
|
}
|
125
|
-
targetGroups[task.type].push(
|
142
|
+
targetGroups[task.type].push(targetName);
|
126
143
|
}
|
127
144
|
return { targetGroups, targets };
|
128
145
|
}
|
@@ -138,3 +155,79 @@ function createInputsMap(context) {
|
|
138
155
|
: ['default', '^default'],
|
139
156
|
};
|
140
157
|
}
|
158
|
+
function getTestCiTargets(testFiles, gradleProject, testTargetName, ciTargetName, inputs, outputs, targetGroupName, targets, targetGroups) {
|
159
|
+
if (!testFiles || testFiles.length === 0 || !ciTargetName) {
|
160
|
+
return;
|
161
|
+
}
|
162
|
+
const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}test`;
|
163
|
+
if (!targetGroups[targetGroupName]) {
|
164
|
+
targetGroups[targetGroupName] = [];
|
165
|
+
}
|
166
|
+
const dependsOn = [];
|
167
|
+
testFiles.forEach((testFile) => {
|
168
|
+
const testName = (0, node_path_1.basename)(testFile).split('.')[0];
|
169
|
+
const targetName = ciTargetName + '--' + testName;
|
170
|
+
targets[targetName] = {
|
171
|
+
command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun} --tests ${testName}`,
|
172
|
+
cache: true,
|
173
|
+
inputs,
|
174
|
+
dependsOn: dependsOnMap['test'],
|
175
|
+
metadata: {
|
176
|
+
technologies: ['gradle'],
|
177
|
+
description: `Runs Gradle test ${testFile} in CI`,
|
178
|
+
},
|
179
|
+
...(outputs && outputs.length > 0 ? { outputs } : {}),
|
180
|
+
};
|
181
|
+
targetGroups[targetGroupName].push(targetName);
|
182
|
+
dependsOn.push({
|
183
|
+
target: targetName,
|
184
|
+
projects: 'self',
|
185
|
+
params: 'forward',
|
186
|
+
});
|
187
|
+
});
|
188
|
+
targets[ciTargetName] = {
|
189
|
+
executor: 'nx:noop',
|
190
|
+
cache: true,
|
191
|
+
inputs,
|
192
|
+
dependsOn: dependsOn,
|
193
|
+
...(outputs && outputs.length > 0 ? { outputs } : {}),
|
194
|
+
metadata: {
|
195
|
+
technologies: ['gradle'],
|
196
|
+
description: 'Runs Gradle Tests in CI',
|
197
|
+
nonAtomizedTarget: testTargetName,
|
198
|
+
},
|
199
|
+
};
|
200
|
+
targetGroups[targetGroupName].push(ciTargetName);
|
201
|
+
}
|
202
|
+
function splitConfigFiles(files) {
|
203
|
+
const configFiles = [];
|
204
|
+
const testFiles = [];
|
205
|
+
const projectRoots = new Set();
|
206
|
+
files.forEach((file) => {
|
207
|
+
if (get_gradle_report_1.GRADLE_BUILD_FILES.has((0, node_path_1.basename)(file))) {
|
208
|
+
configFiles.push(file);
|
209
|
+
projectRoots.add((0, node_path_1.dirname)(file));
|
210
|
+
}
|
211
|
+
else {
|
212
|
+
testFiles.push(file);
|
213
|
+
}
|
214
|
+
});
|
215
|
+
return { configFiles, testFiles, projectRoots: Array.from(projectRoots) };
|
216
|
+
}
|
217
|
+
function getGradleProjectRootToTestFilesMap(testFiles, projectRoots) {
|
218
|
+
if (testFiles.length === 0 || projectRoots.length === 0) {
|
219
|
+
return;
|
220
|
+
}
|
221
|
+
const roots = new Map(projectRoots.map((root) => [root, root]));
|
222
|
+
const testFilesToGradleProjectMap = {};
|
223
|
+
testFiles.forEach((testFile) => {
|
224
|
+
const projectRoot = (0, devkit_internals_1.findProjectForPath)(testFile, roots);
|
225
|
+
if (projectRoot) {
|
226
|
+
if (!testFilesToGradleProjectMap[projectRoot]) {
|
227
|
+
testFilesToGradleProjectMap[projectRoot] = [];
|
228
|
+
}
|
229
|
+
testFilesToGradleProjectMap[projectRoot].push(testFile);
|
230
|
+
}
|
231
|
+
});
|
232
|
+
return testFilesToGradleProjectMap;
|
233
|
+
}
|
@@ -7,7 +7,10 @@ export interface GradleReport {
|
|
7
7
|
gradleProjectToTasksTypeMap: Map<string, Map<string, string>>;
|
8
8
|
gradleProjectToProjectName: Map<string, string>;
|
9
9
|
}
|
10
|
-
export declare const
|
10
|
+
export declare const GRADLE_BUILD_FILES: Set<string>;
|
11
|
+
export declare const GRADLE_TEST_FILES: string[];
|
12
|
+
export declare const gradleConfigGlob: string;
|
13
|
+
export declare const gradleConfigAndTestGlob: string;
|
11
14
|
export declare function getCurrentGradleReport(): GradleReport;
|
12
15
|
export declare function populateGradleReport(workspaceRoot: string): Promise<void>;
|
13
16
|
export declare function processProjectReports(projectReportLines: string[]): GradleReport;
|
@@ -1,9 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.processProjectReports = exports.populateGradleReport = exports.getCurrentGradleReport = exports.gradleConfigGlob = exports.newLineSeparator = exports.fileSeparator = void 0;
|
3
|
+
exports.processProjectReports = exports.populateGradleReport = exports.getCurrentGradleReport = exports.gradleConfigAndTestGlob = exports.gradleConfigGlob = exports.GRADLE_TEST_FILES = exports.GRADLE_BUILD_FILES = exports.newLineSeparator = exports.fileSeparator = void 0;
|
4
4
|
const node_fs_1 = require("node:fs");
|
5
5
|
const node_path_1 = require("node:path");
|
6
6
|
const devkit_1 = require("@nx/devkit");
|
7
|
+
const globs_1 = require("nx/src/utils/globs");
|
7
8
|
const exec_gradle_1 = require("./exec-gradle");
|
8
9
|
const workspace_context_1 = require("nx/src/utils/workspace-context");
|
9
10
|
exports.fileSeparator = process.platform.startsWith('win')
|
@@ -14,7 +15,13 @@ exports.newLineSeparator = process.platform.startsWith('win')
|
|
14
15
|
: '\n';
|
15
16
|
let gradleReportCache;
|
16
17
|
let gradleCurrentConfigHash;
|
17
|
-
exports.
|
18
|
+
exports.GRADLE_BUILD_FILES = new Set(['build.gradle', 'build.gradle.kts']);
|
19
|
+
exports.GRADLE_TEST_FILES = [
|
20
|
+
'**/src/test/java/**/*.java',
|
21
|
+
'**/src/test/kotlin/**/*.kt',
|
22
|
+
];
|
23
|
+
exports.gradleConfigGlob = (0, globs_1.combineGlobPatterns)(...Array.from(exports.GRADLE_BUILD_FILES).map((file) => `**/${file}`));
|
24
|
+
exports.gradleConfigAndTestGlob = (0, globs_1.combineGlobPatterns)(...Array.from(exports.GRADLE_BUILD_FILES).map((file) => `**/${file}`), ...exports.GRADLE_TEST_FILES);
|
18
25
|
function getCurrentGradleReport() {
|
19
26
|
if (!gradleReportCache) {
|
20
27
|
throw new Error('Expected cached gradle report. Please open an issue at https://github.com/nrwl/nx/issues/new/choose');
|