@nx/gradle 21.0.0-beta.1 → 21.0.0-beta.11
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/batch-runner/build/libs/batch-runner-all.jar +0 -0
- package/batch-runner/build/libs/batch-runner.jar +0 -0
- package/batch-runner/project.json +33 -0
- package/executors.json +10 -0
- package/migrations.json +6 -0
- package/package.json +4 -2
- package/plugin-v1.d.ts +2 -0
- package/plugin-v1.js +8 -0
- package/plugin.d.ts +1 -1
- package/plugin.js +1 -2
- package/project-graph/project.json +43 -0
- package/project-graph/publish-maven.d.ts +1 -0
- package/project-graph/publish-maven.js +103 -0
- package/src/executors/gradle/gradle-batch.impl.d.ts +6 -0
- package/src/executors/gradle/gradle-batch.impl.js +67 -0
- package/src/executors/gradle/gradle.impl.d.ts +5 -0
- package/src/executors/gradle/gradle.impl.js +31 -0
- package/src/executors/gradle/schema.d.ts +5 -0
- package/src/executors/gradle/schema.json +33 -0
- package/src/generators/ci-workflow/files/circleci/.circleci/config.yml.template +1 -1
- package/src/generators/ci-workflow/files/github/.github/workflows/__workflowFileName__.yml.template +4 -3
- package/src/generators/init/init.js +28 -44
- package/src/migrations/19-4-0/add-project-report-all.d.ts +4 -0
- package/src/migrations/19-4-0/add-project-report-all.js +83 -2
- package/src/migrations/21-0-0/change-plugin-to-v1.d.ts +2 -0
- package/src/migrations/21-0-0/change-plugin-to-v1.js +26 -0
- package/src/plugin/dependencies.d.ts +2 -1
- package/src/plugin/dependencies.js +30 -53
- package/src/plugin/nodes.d.ts +3 -16
- package/src/plugin/nodes.js +22 -228
- package/src/plugin/utils/__mocks__/gradle_composite.json +38 -0
- package/src/plugin/utils/__mocks__/gradle_nx_list.json +590 -0
- package/src/plugin/utils/__mocks__/gradle_tutorial.json +344 -0
- package/src/plugin/utils/get-project-graph-from-gradle-plugin.d.ts +25 -0
- package/src/plugin/utils/get-project-graph-from-gradle-plugin.js +113 -0
- package/src/plugin/utils/get-project-graph-lines.d.ts +2 -0
- package/src/plugin/utils/get-project-graph-lines.js +66 -0
- package/src/plugin/utils/gradle-plugin-options.d.ts +7 -0
- package/src/plugin/utils/gradle-plugin-options.js +8 -0
- package/src/plugin-v1/dependencies.d.ts +2 -0
- package/src/plugin-v1/dependencies.js +64 -0
- package/src/plugin-v1/nodes.d.ts +20 -0
- package/src/plugin-v1/nodes.js +266 -0
- package/src/{utils → plugin-v1/utils}/get-gradle-report.d.ts +2 -2
- package/src/{utils → plugin-v1/utils}/get-gradle-report.js +23 -26
- package/src/{utils → plugin-v1/utils}/get-project-report-lines.d.ts +0 -2
- package/src/{utils → plugin-v1/utils}/get-project-report-lines.js +13 -18
- package/src/utils/exec-gradle.d.ts +5 -3
- package/src/utils/exec-gradle.js +12 -5
- package/src/utils/split-config-files.js +2 -0
- package/src/utils/versions.d.ts +2 -0
- package/src/utils/versions.js +3 -1
|
@@ -1,10 +1,91 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.default = update;
|
|
4
|
-
|
|
4
|
+
exports.addBuildGradleFileNextToSettingsGradle = addBuildGradleFileNextToSettingsGradle;
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
5
7
|
/**
|
|
6
8
|
* This migration adds task `projectReportAll` to build.gradle files
|
|
7
9
|
*/
|
|
8
10
|
async function update(tree) {
|
|
9
|
-
await
|
|
11
|
+
await addBuildGradleFileNextToSettingsGradle(tree);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* This function creates and populate build.gradle file next to the settings.gradle file.
|
|
15
|
+
*/
|
|
16
|
+
async function addBuildGradleFileNextToSettingsGradle(tree) {
|
|
17
|
+
const settingsGradleFiles = await (0, devkit_1.globAsync)(tree, [
|
|
18
|
+
'**/settings.gradle?(.kts)',
|
|
19
|
+
]);
|
|
20
|
+
settingsGradleFiles.forEach((settingsGradleFile) => {
|
|
21
|
+
addProjectReportToBuildGradle(settingsGradleFile, tree);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* - creates a build.gradle file next to the settings.gradle file if it does not exist.
|
|
26
|
+
* - adds the project-report plugin to the build.gradle file if it does not exist.
|
|
27
|
+
* - adds a task to generate project reports for all subprojects and included builds.
|
|
28
|
+
*/
|
|
29
|
+
function addProjectReportToBuildGradle(settingsGradleFile, tree) {
|
|
30
|
+
const filename = (0, node_path_1.basename)(settingsGradleFile);
|
|
31
|
+
let gradleFilePath = 'build.gradle';
|
|
32
|
+
if (filename.endsWith('.kts')) {
|
|
33
|
+
gradleFilePath = 'build.gradle.kts';
|
|
34
|
+
}
|
|
35
|
+
gradleFilePath = (0, node_path_1.join)((0, node_path_1.dirname)(settingsGradleFile), gradleFilePath);
|
|
36
|
+
let buildGradleContent = '';
|
|
37
|
+
if (!tree.exists(gradleFilePath)) {
|
|
38
|
+
tree.write(gradleFilePath, buildGradleContent); // create a build.gradle file near settings.gradle file if it does not exist
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
buildGradleContent = tree.read(gradleFilePath).toString();
|
|
42
|
+
}
|
|
43
|
+
if (buildGradleContent.includes('allprojects')) {
|
|
44
|
+
if (!buildGradleContent.includes('"project-report"')) {
|
|
45
|
+
devkit_1.logger.warn(`Please add the project-report plugin to your ${gradleFilePath}:
|
|
46
|
+
allprojects {
|
|
47
|
+
apply {
|
|
48
|
+
plugin("project-report")
|
|
49
|
+
}
|
|
50
|
+
}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
buildGradleContent += `\n\rallprojects {
|
|
55
|
+
apply {
|
|
56
|
+
plugin("project-report")
|
|
57
|
+
}
|
|
58
|
+
}`;
|
|
59
|
+
}
|
|
60
|
+
if (!buildGradleContent.includes(`tasks.register("projectReportAll")`)) {
|
|
61
|
+
if (gradleFilePath.endsWith('.kts')) {
|
|
62
|
+
buildGradleContent += `\n\rtasks.register("projectReportAll") {
|
|
63
|
+
// All project reports of subprojects
|
|
64
|
+
allprojects.forEach {
|
|
65
|
+
dependsOn(it.tasks.get("projectReport"))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// All projectReportAll of included builds
|
|
69
|
+
gradle.includedBuilds.forEach {
|
|
70
|
+
dependsOn(it.task(":projectReportAll"))
|
|
71
|
+
}
|
|
72
|
+
}`;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
buildGradleContent += `\n\rtasks.register("projectReportAll") {
|
|
76
|
+
// All project reports of subprojects
|
|
77
|
+
allprojects.forEach {
|
|
78
|
+
dependsOn(it.tasks.getAt("projectReport"))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// All projectReportAll of included builds
|
|
82
|
+
gradle.includedBuilds.forEach {
|
|
83
|
+
dependsOn(it.task(":projectReportAll"))
|
|
84
|
+
}
|
|
85
|
+
}`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (buildGradleContent) {
|
|
89
|
+
tree.write(gradleFilePath, buildGradleContent);
|
|
90
|
+
}
|
|
10
91
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = update;
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
const has_gradle_plugin_1 = require("../../utils/has-gradle-plugin");
|
|
6
|
+
/* This function changes the plugin to v1
|
|
7
|
+
* Replace @nx/gradle with @nx/gradle/plugin-v1
|
|
8
|
+
*/
|
|
9
|
+
function update(tree) {
|
|
10
|
+
const nxJson = (0, devkit_1.readNxJson)(tree);
|
|
11
|
+
if (!nxJson) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (!(0, has_gradle_plugin_1.hasGradlePlugin)(tree)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let gradlePluginIndex = nxJson.plugins.findIndex((p) => typeof p === 'string' ? p === '@nx/gradle' : p.plugin === '@nx/gradle');
|
|
18
|
+
let gradlePlugin = nxJson.plugins[gradlePluginIndex];
|
|
19
|
+
if (typeof gradlePlugin === 'string') {
|
|
20
|
+
nxJson.plugins[gradlePluginIndex] = '@nx/gradle/plugin-v1';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
gradlePlugin.plugin = '@nx/gradle/plugin-v1';
|
|
24
|
+
}
|
|
25
|
+
(0, devkit_1.updateNxJson)(tree, nxJson);
|
|
26
|
+
}
|
|
@@ -3,60 +3,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createDependencies = void 0;
|
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
|
5
5
|
const node_path_1 = require("node:path");
|
|
6
|
-
const
|
|
6
|
+
const get_project_graph_from_gradle_plugin_1 = require("./utils/get-project-graph-from-gradle-plugin");
|
|
7
7
|
const split_config_files_1 = require("../utils/split-config-files");
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const targetProjectName = Object.values(context.projects).find((project) => project.root === targetProjectRoot)?.name;
|
|
24
|
-
const dependency = {
|
|
25
|
-
source: projectName,
|
|
26
|
-
target: targetProjectName,
|
|
27
|
-
type: devkit_1.DependencyType.static,
|
|
28
|
-
sourceFile: gradleFile,
|
|
29
|
-
};
|
|
30
|
-
(0, devkit_1.validateDependency)(dependency, context);
|
|
31
|
-
dependencies.add(dependency);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
gradleProjectToChildProjects.get(gradleProject)?.forEach((childProject) => {
|
|
35
|
-
if (childProject) {
|
|
36
|
-
const dependency = {
|
|
37
|
-
source: projectName,
|
|
38
|
-
target: childProject,
|
|
39
|
-
type: devkit_1.DependencyType.static,
|
|
40
|
-
sourceFile: gradleFile,
|
|
41
|
-
};
|
|
42
|
-
(0, devkit_1.validateDependency)(dependency, context);
|
|
43
|
-
dependencies.add(dependency);
|
|
8
|
+
const workspace_context_1 = require("nx/src/utils/workspace-context");
|
|
9
|
+
const createDependencies = async (options, context) => {
|
|
10
|
+
const files = await (0, workspace_context_1.globWithWorkspaceContext)(devkit_1.workspaceRoot, Array.from(split_config_files_1.GRALDEW_FILES));
|
|
11
|
+
const { gradlewFiles } = (0, split_config_files_1.splitConfigFiles)(files);
|
|
12
|
+
await (0, get_project_graph_from_gradle_plugin_1.populateProjectGraph)(context.workspaceRoot, gradlewFiles.map((file) => (0, node_path_1.join)(devkit_1.workspaceRoot, file)), options);
|
|
13
|
+
const { dependencies: dependenciesFromReport } = (0, get_project_graph_from_gradle_plugin_1.getCurrentProjectGraphReport)();
|
|
14
|
+
const dependencies = [];
|
|
15
|
+
dependenciesFromReport.forEach((dependencyFromPlugin) => {
|
|
16
|
+
try {
|
|
17
|
+
const source = (0, node_path_1.relative)(devkit_1.workspaceRoot, dependencyFromPlugin.source) || '.';
|
|
18
|
+
const sourceProjectName = Object.values(context.projects).find((project) => source === project.root)?.name ?? dependencyFromPlugin.source;
|
|
19
|
+
const target = (0, node_path_1.relative)(devkit_1.workspaceRoot, dependencyFromPlugin.target) || '.';
|
|
20
|
+
const targetProjectName = Object.values(context.projects).find((project) => target === project.root)?.name ?? dependencyFromPlugin.target;
|
|
21
|
+
if (!sourceProjectName || !targetProjectName) {
|
|
22
|
+
return;
|
|
44
23
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
24
|
+
const dependency = {
|
|
25
|
+
source: sourceProjectName,
|
|
26
|
+
target: targetProjectName,
|
|
27
|
+
type: devkit_1.DependencyType.static,
|
|
28
|
+
sourceFile: (0, devkit_1.normalizePath)((0, node_path_1.relative)(devkit_1.workspaceRoot, dependencyFromPlugin.sourceFile)),
|
|
29
|
+
};
|
|
30
|
+
(0, devkit_1.validateDependency)(dependency, context);
|
|
31
|
+
dependencies.push(dependency);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
devkit_1.logger.warn(`Unable to parse dependency from gradle plugin: ${dependencyFromPlugin.source} -> ${dependencyFromPlugin.target}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return dependencies;
|
|
50
38
|
};
|
|
51
39
|
exports.createDependencies = createDependencies;
|
|
52
|
-
function findGradleFiles(fileMap) {
|
|
53
|
-
const gradleFiles = [];
|
|
54
|
-
for (const [_, files] of Object.entries(fileMap.projectFileMap)) {
|
|
55
|
-
for (const file of files) {
|
|
56
|
-
if (split_config_files_1.GRADLE_BUILD_FILES.has((0, node_path_1.basename)(file.file))) {
|
|
57
|
-
gradleFiles.push(file.file);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return gradleFiles;
|
|
62
|
-
}
|
package/src/plugin/nodes.d.ts
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export interface GradlePluginOptions {
|
|
4
|
-
includeSubprojectsTasks?: boolean;
|
|
5
|
-
ciTargetName?: string;
|
|
6
|
-
testTargetName?: string;
|
|
7
|
-
classesTargetName?: string;
|
|
8
|
-
buildTargetName?: string;
|
|
9
|
-
[taskTargetName: string]: string | undefined | boolean;
|
|
10
|
-
}
|
|
1
|
+
import { CreateNodesV2, ProjectConfiguration, CreateNodesFunction, ProjectGraphExternalNode } from '@nx/devkit';
|
|
2
|
+
import { GradlePluginOptions } from './utils/gradle-plugin-options';
|
|
11
3
|
type GradleTargets = Record<string, Partial<ProjectConfiguration>>;
|
|
12
4
|
export declare function writeTargetsToCache(cachePath: string, results: GradleTargets): void;
|
|
13
5
|
export declare const createNodesV2: CreateNodesV2<GradlePluginOptions>;
|
|
14
|
-
export declare const makeCreateNodesForGradleConfigFile: (
|
|
15
|
-
/**
|
|
16
|
-
@deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
|
|
17
|
-
This function will change to the v2 function in Nx 20.
|
|
18
|
-
*/
|
|
19
|
-
export declare const createNodes: CreateNodes<GradlePluginOptions>;
|
|
6
|
+
export declare const makeCreateNodesForGradleConfigFile: (projects: Record<string, Partial<ProjectConfiguration>>, projectsCache?: GradleTargets, externalNodes?: Record<string, ProjectGraphExternalNode>) => CreateNodesFunction;
|
|
20
7
|
export {};
|
package/src/plugin/nodes.js
CHANGED
|
@@ -1,32 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.makeCreateNodesForGradleConfigFile = exports.createNodesV2 = void 0;
|
|
4
4
|
exports.writeTargetsToCache = writeTargetsToCache;
|
|
5
5
|
const devkit_1 = require("@nx/devkit");
|
|
6
6
|
const calculate_hash_for_create_nodes_1 = require("@nx/devkit/src/utils/calculate-hash-for-create-nodes");
|
|
7
7
|
const node_fs_1 = require("node:fs");
|
|
8
8
|
const node_path_1 = require("node:path");
|
|
9
9
|
const cache_directory_1 = require("nx/src/utils/cache-directory");
|
|
10
|
-
const devkit_internals_1 = require("nx/src/devkit-internals");
|
|
11
|
-
const get_gradle_report_1 = require("../utils/get-gradle-report");
|
|
12
10
|
const file_hasher_1 = require("nx/src/hasher/file-hasher");
|
|
13
11
|
const split_config_files_1 = require("../utils/split-config-files");
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
build: ['^build', 'classes', 'test'],
|
|
18
|
-
testClasses: ['classes'],
|
|
19
|
-
test: ['testClasses'],
|
|
20
|
-
classes: ['^classes'],
|
|
21
|
-
};
|
|
22
|
-
function normalizeOptions(options) {
|
|
23
|
-
options ??= {};
|
|
24
|
-
options.testTargetName ??= 'test';
|
|
25
|
-
options.classesTargetName ??= 'classes';
|
|
26
|
-
options.buildTargetName ??= 'build';
|
|
27
|
-
return options;
|
|
28
|
-
}
|
|
29
|
-
function readTargetsCache(cachePath) {
|
|
12
|
+
const get_project_graph_from_gradle_plugin_1 = require("./utils/get-project-graph-from-gradle-plugin");
|
|
13
|
+
const gradle_plugin_options_1 = require("./utils/gradle-plugin-options");
|
|
14
|
+
function readProjectsCache(cachePath) {
|
|
30
15
|
return (0, node_fs_1.existsSync)(cachePath) ? (0, devkit_1.readJsonFile)(cachePath) : {};
|
|
31
16
|
}
|
|
32
17
|
function writeTargetsToCache(cachePath, results) {
|
|
@@ -35,232 +20,41 @@ function writeTargetsToCache(cachePath, results) {
|
|
|
35
20
|
exports.createNodesV2 = [
|
|
36
21
|
split_config_files_1.gradleConfigAndTestGlob,
|
|
37
22
|
async (files, options, context) => {
|
|
38
|
-
const { buildFiles,
|
|
23
|
+
const { buildFiles, gradlewFiles } = (0, split_config_files_1.splitConfigFiles)(files);
|
|
39
24
|
const optionsHash = (0, file_hasher_1.hashObject)(options);
|
|
40
25
|
const cachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `gradle-${optionsHash}.hash`);
|
|
41
|
-
const
|
|
42
|
-
await (0,
|
|
43
|
-
const
|
|
44
|
-
const gradleProjectRootToTestFilesMap = getGradleProjectRootToTestFilesMap(testFiles, projectRoots);
|
|
26
|
+
const projectsCache = readProjectsCache(cachePath);
|
|
27
|
+
await (0, get_project_graph_from_gradle_plugin_1.populateProjectGraph)(context.workspaceRoot, gradlewFiles.map((f) => (0, node_path_1.join)(context.workspaceRoot, f)), options);
|
|
28
|
+
const { nodes, externalNodes } = (0, get_project_graph_from_gradle_plugin_1.getCurrentProjectGraphReport)();
|
|
45
29
|
try {
|
|
46
|
-
return (0, devkit_1.createNodesFromFiles)((0, exports.makeCreateNodesForGradleConfigFile)(
|
|
30
|
+
return (0, devkit_1.createNodesFromFiles)((0, exports.makeCreateNodesForGradleConfigFile)(nodes, projectsCache, externalNodes), buildFiles, options, context);
|
|
47
31
|
}
|
|
48
32
|
finally {
|
|
49
|
-
writeTargetsToCache(cachePath,
|
|
33
|
+
writeTargetsToCache(cachePath, projectsCache);
|
|
50
34
|
}
|
|
51
35
|
},
|
|
52
36
|
];
|
|
53
|
-
const makeCreateNodesForGradleConfigFile = (
|
|
37
|
+
const makeCreateNodesForGradleConfigFile = (projects, projectsCache = {}, externalNodes = {}) => async (gradleFilePath, options, context) => {
|
|
38
|
+
if (process.env.VERCEL) {
|
|
39
|
+
// Vercel does not allow JAVA_VERSION to be set
|
|
40
|
+
// skip on Vercel
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
54
43
|
const projectRoot = (0, node_path_1.dirname)(gradleFilePath);
|
|
55
|
-
options = normalizeOptions(options);
|
|
44
|
+
options = (0, gradle_plugin_options_1.normalizeOptions)(options);
|
|
56
45
|
const hash = await (0, calculate_hash_for_create_nodes_1.calculateHashForCreateNodes)(projectRoot, options ?? {}, context);
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
projectsCache[hash] ??=
|
|
47
|
+
projects[projectRoot] ?? projects[(0, node_path_1.join)(devkit_1.workspaceRoot, projectRoot)];
|
|
48
|
+
const project = projectsCache[hash];
|
|
59
49
|
if (!project) {
|
|
60
50
|
return {};
|
|
61
51
|
}
|
|
52
|
+
project.root = projectRoot;
|
|
62
53
|
return {
|
|
63
54
|
projects: {
|
|
64
55
|
[projectRoot]: project,
|
|
65
56
|
},
|
|
57
|
+
externalNodes: externalNodes,
|
|
66
58
|
};
|
|
67
59
|
};
|
|
68
60
|
exports.makeCreateNodesForGradleConfigFile = makeCreateNodesForGradleConfigFile;
|
|
69
|
-
/**
|
|
70
|
-
@deprecated This is replaced with {@link createNodesV2}. Update your plugin to export its own `createNodesV2` function that wraps this one instead.
|
|
71
|
-
This function will change to the v2 function in Nx 20.
|
|
72
|
-
*/
|
|
73
|
-
exports.createNodes = [
|
|
74
|
-
split_config_files_1.gradleConfigGlob,
|
|
75
|
-
async (buildFile, options, context) => {
|
|
76
|
-
devkit_1.logger.warn('`createNodes` is deprecated. Update your plugin to utilize createNodesV2 instead. In Nx 20, this will change to the createNodesV2 API.');
|
|
77
|
-
const { gradlewFiles } = (0, split_config_files_1.splitConfigFiles)(context.configFiles);
|
|
78
|
-
await (0, get_gradle_report_1.populateGradleReport)(context.workspaceRoot, gradlewFiles);
|
|
79
|
-
const gradleReport = (0, get_gradle_report_1.getCurrentGradleReport)();
|
|
80
|
-
const internalCreateNodes = (0, exports.makeCreateNodesForGradleConfigFile)(gradleReport);
|
|
81
|
-
return await internalCreateNodes(buildFile, options, context);
|
|
82
|
-
},
|
|
83
|
-
];
|
|
84
|
-
async function createGradleProject(gradleReport, gradleFilePath, options, context, testFiles = []) {
|
|
85
|
-
try {
|
|
86
|
-
const { gradleProjectToTasksTypeMap, gradleProjectToTasksMap, gradleFileToOutputDirsMap, gradleFileToGradleProjectMap, gradleProjectToProjectName, } = gradleReport;
|
|
87
|
-
const gradleProject = gradleFileToGradleProjectMap.get(gradleFilePath);
|
|
88
|
-
const projectName = gradleProjectToProjectName.get(gradleProject);
|
|
89
|
-
if (!projectName) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const tasksTypeMap = gradleProjectToTasksTypeMap.get(gradleProject);
|
|
93
|
-
const tasksSet = gradleProjectToTasksMap.get(gradleProject);
|
|
94
|
-
let tasks = [];
|
|
95
|
-
tasksSet.forEach((taskName) => {
|
|
96
|
-
tasks.push({
|
|
97
|
-
type: tasksTypeMap?.get(taskName),
|
|
98
|
-
name: taskName,
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
if (options.includeSubprojectsTasks) {
|
|
102
|
-
tasksTypeMap.forEach((taskType, taskName) => {
|
|
103
|
-
if (!tasksSet.has(taskName)) {
|
|
104
|
-
tasks.push({
|
|
105
|
-
type: taskType,
|
|
106
|
-
name: taskName,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
const outputDirs = gradleFileToOutputDirsMap.get(gradleFilePath);
|
|
112
|
-
const { targets, targetGroups } = await createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleFilePath, testFiles);
|
|
113
|
-
const project = {
|
|
114
|
-
name: projectName,
|
|
115
|
-
projectType: 'application',
|
|
116
|
-
targets,
|
|
117
|
-
metadata: {
|
|
118
|
-
targetGroups,
|
|
119
|
-
technologies: ['gradle'],
|
|
120
|
-
},
|
|
121
|
-
};
|
|
122
|
-
return project;
|
|
123
|
-
}
|
|
124
|
-
catch (e) {
|
|
125
|
-
console.error(e);
|
|
126
|
-
return undefined;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
async function createGradleTargets(tasks, options, context, outputDirs, gradleProject, gradleBuildFilePath, testFiles = []) {
|
|
130
|
-
const inputsMap = createInputsMap(context);
|
|
131
|
-
const gradlewFileDirectory = (0, node_path_1.dirname)((0, exec_gradle_1.findGraldewFile)(gradleBuildFilePath, context.workspaceRoot));
|
|
132
|
-
const targets = {};
|
|
133
|
-
const targetGroups = {};
|
|
134
|
-
for (const task of tasks) {
|
|
135
|
-
const targetName = options?.[`${task.name}TargetName`] ?? task.name;
|
|
136
|
-
let outputs = [outputDirs.get(task.name)].filter(Boolean);
|
|
137
|
-
if (task.name === 'test') {
|
|
138
|
-
outputs = [
|
|
139
|
-
outputDirs.get('testReport'),
|
|
140
|
-
outputDirs.get('testResults'),
|
|
141
|
-
].filter(Boolean);
|
|
142
|
-
getTestCiTargets(testFiles, gradleProject, targetName, options.ciTargetName, inputsMap['test'], outputs, task.type, targets, targetGroups, gradlewFileDirectory);
|
|
143
|
-
}
|
|
144
|
-
const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}${task.name}`;
|
|
145
|
-
targets[targetName] = {
|
|
146
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun}`,
|
|
147
|
-
options: {
|
|
148
|
-
cwd: gradlewFileDirectory,
|
|
149
|
-
},
|
|
150
|
-
cache: cacheableTaskType.has(task.type),
|
|
151
|
-
inputs: inputsMap[task.name],
|
|
152
|
-
dependsOn: dependsOnMap[task.name],
|
|
153
|
-
metadata: {
|
|
154
|
-
technologies: ['gradle'],
|
|
155
|
-
help: {
|
|
156
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} help --task ${taskCommandToRun}`,
|
|
157
|
-
example: {
|
|
158
|
-
options: {
|
|
159
|
-
args: ['--rerun'],
|
|
160
|
-
},
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
...(outputs && outputs.length ? { outputs } : {}),
|
|
165
|
-
};
|
|
166
|
-
if (task.type) {
|
|
167
|
-
if (!targetGroups[task.type]) {
|
|
168
|
-
targetGroups[task.type] = [];
|
|
169
|
-
}
|
|
170
|
-
targetGroups[task.type].push(targetName);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return { targetGroups, targets };
|
|
174
|
-
}
|
|
175
|
-
function createInputsMap(context) {
|
|
176
|
-
const namedInputs = context.nxJsonConfiguration.namedInputs;
|
|
177
|
-
return {
|
|
178
|
-
build: namedInputs?.production
|
|
179
|
-
? ['production', '^production']
|
|
180
|
-
: ['default', '^default'],
|
|
181
|
-
test: ['default', namedInputs?.production ? '^production' : '^default'],
|
|
182
|
-
classes: namedInputs?.production
|
|
183
|
-
? ['production', '^production']
|
|
184
|
-
: ['default', '^default'],
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
function getTestCiTargets(testFiles, gradleProject, testTargetName, ciTargetName, inputs, outputs, targetGroupName, targets, targetGroups, gradlewFileDirectory) {
|
|
188
|
-
if (!testFiles || testFiles.length === 0 || !ciTargetName) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const taskCommandToRun = `${gradleProject ? gradleProject + ':' : ''}test`;
|
|
192
|
-
if (!targetGroups[targetGroupName]) {
|
|
193
|
-
targetGroups[targetGroupName] = [];
|
|
194
|
-
}
|
|
195
|
-
const dependsOn = [];
|
|
196
|
-
testFiles.forEach((testFile) => {
|
|
197
|
-
const testName = (0, node_path_1.basename)(testFile).split('.')[0];
|
|
198
|
-
const targetName = ciTargetName + '--' + testName;
|
|
199
|
-
targets[targetName] = {
|
|
200
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} ${taskCommandToRun} --tests ${testName}`,
|
|
201
|
-
options: {
|
|
202
|
-
cwd: gradlewFileDirectory,
|
|
203
|
-
},
|
|
204
|
-
cache: true,
|
|
205
|
-
inputs,
|
|
206
|
-
dependsOn: dependsOnMap['test'],
|
|
207
|
-
metadata: {
|
|
208
|
-
technologies: ['gradle'],
|
|
209
|
-
description: `Runs Gradle test ${testFile} in CI`,
|
|
210
|
-
help: {
|
|
211
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} help --task ${taskCommandToRun}`,
|
|
212
|
-
example: {
|
|
213
|
-
options: {
|
|
214
|
-
args: ['--rerun'],
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
},
|
|
218
|
-
},
|
|
219
|
-
...(outputs && outputs.length > 0 ? { outputs } : {}),
|
|
220
|
-
};
|
|
221
|
-
targetGroups[targetGroupName].push(targetName);
|
|
222
|
-
dependsOn.push({
|
|
223
|
-
target: targetName,
|
|
224
|
-
projects: 'self',
|
|
225
|
-
params: 'forward',
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
targets[ciTargetName] = {
|
|
229
|
-
executor: 'nx:noop',
|
|
230
|
-
cache: true,
|
|
231
|
-
inputs,
|
|
232
|
-
dependsOn: dependsOn,
|
|
233
|
-
...(outputs && outputs.length > 0 ? { outputs } : {}),
|
|
234
|
-
metadata: {
|
|
235
|
-
technologies: ['gradle'],
|
|
236
|
-
description: 'Runs Gradle Tests in CI',
|
|
237
|
-
nonAtomizedTarget: testTargetName,
|
|
238
|
-
help: {
|
|
239
|
-
command: `${(0, exec_gradle_1.getGradleExecFile)()} help --task ${taskCommandToRun}`,
|
|
240
|
-
example: {
|
|
241
|
-
options: {
|
|
242
|
-
args: ['--rerun'],
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
targetGroups[targetGroupName].push(ciTargetName);
|
|
249
|
-
}
|
|
250
|
-
function getGradleProjectRootToTestFilesMap(testFiles, projectRoots) {
|
|
251
|
-
if (testFiles.length === 0 || projectRoots.length === 0) {
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
const roots = new Map(projectRoots.map((root) => [root, root]));
|
|
255
|
-
const testFilesToGradleProjectMap = {};
|
|
256
|
-
testFiles.forEach((testFile) => {
|
|
257
|
-
const projectRoot = (0, devkit_internals_1.findProjectForPath)(testFile, roots);
|
|
258
|
-
if (projectRoot) {
|
|
259
|
-
if (!testFilesToGradleProjectMap[projectRoot]) {
|
|
260
|
-
testFilesToGradleProjectMap[projectRoot] = [];
|
|
261
|
-
}
|
|
262
|
-
testFilesToGradleProjectMap[projectRoot].push(testFile);
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
return testFilesToGradleProjectMap;
|
|
266
|
-
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nodes": {
|
|
3
|
+
"nested/nested/proj": {
|
|
4
|
+
"targets": {
|
|
5
|
+
"buildEnvironment": {
|
|
6
|
+
"cache": true,
|
|
7
|
+
"metadata": {
|
|
8
|
+
"description": "Displays all buildscript dependencies declared in root project \u0027my-composite\u0027.",
|
|
9
|
+
"technologies": ["gradle"]
|
|
10
|
+
},
|
|
11
|
+
"command": "./gradlew :buildEnvironment",
|
|
12
|
+
"options": {
|
|
13
|
+
"cwd": "nested/nested/proj"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"metadata": {
|
|
18
|
+
"targetGroups": {
|
|
19
|
+
"help": ["buildEnvironment"]
|
|
20
|
+
},
|
|
21
|
+
"technologies": ["gradle"]
|
|
22
|
+
},
|
|
23
|
+
"name": "my-composite"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": [
|
|
27
|
+
{
|
|
28
|
+
"source": "nested/nested/proj",
|
|
29
|
+
"target": "projectRoot/my-app",
|
|
30
|
+
"sourceFile": "projectRoot/build.gradle.kts"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"source": "nested/nested/proj",
|
|
34
|
+
"target": "projectRoot/my-utils",
|
|
35
|
+
"sourceFile": "projectRoot/build.gradle.kts"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|