fix(gradle): fix child project deps (#27643)

## Current Behavior
<!-- This is the behavior we have today -->

When the name of a gradle project is overwritten by a different plugin,
the plugin throws an error creating dependencies.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

The plugin uses the `CreateDependenciesContext` to get the name of a
project at the project root and uses that to create the dependency.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
This commit is contained in:
Jason Jean 2024-08-26 18:17:32 -04:00 committed by GitHub
parent f02e2fc76e
commit 036e5fcf3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 48 additions and 12 deletions

View File

@ -17,12 +17,21 @@ describe('processGradleDependencies', () => {
processGradleDependencies( processGradleDependencies(
depFilePath, depFilePath,
new Map([ new Map([
[':my-utils:number-utils', 'number-utils'], [':my-utils:number-utils', 'utilities/number-utils'],
[':my-utils:string-utils', 'string-utils'], [':my-utils:string-utils', 'utilities/string-utils'],
]), ]),
'app', 'app',
'app', 'app',
{} as any, {
projects: {
'utilities/number-utils': {
name: 'number-utils',
},
'utilities/string-utils': {
name: 'string-utils',
},
},
} as any,
dependencies dependencies
); );
expect(Array.from(dependencies)).toEqual([ expect(Array.from(dependencies)).toEqual([
@ -51,13 +60,25 @@ describe('processGradleDependencies', () => {
processGradleDependencies( processGradleDependencies(
depFilePath, depFilePath,
new Map([ new Map([
[':my-utils:number-utils', 'number-utils'], [':my-utils:number-utils', 'utilities/number-utils'],
[':my-utils:string-utils', 'string-utils'], [':my-utils:string-utils', 'utilities/string-utils'],
[':utilities', 'utilities'], [':utilities', 'utilities'],
]), ]),
'app', 'app',
'app', 'app',
{} as any, {
projects: {
'utilities/number-utils': {
name: 'number-utils',
},
'utilities/string-utils': {
name: 'string-utils',
},
utilities: {
name: 'utilities',
},
},
} as any,
dependencies dependencies
); );
expect(Array.from(dependencies)).toEqual([ expect(Array.from(dependencies)).toEqual([

View File

@ -7,7 +7,7 @@ import {
validateDependency, validateDependency,
} from '@nx/devkit'; } from '@nx/devkit';
import { readFileSync } from 'node:fs'; import { readFileSync } from 'node:fs';
import { basename } from 'node:path'; import { basename, dirname } from 'node:path';
import { import {
GRADLE_BUILD_FILES, GRADLE_BUILD_FILES,
@ -27,7 +27,7 @@ export const createDependencies: CreateDependencies = async (
const gradleDependenciesStart = performance.mark('gradleDependencies:start'); const gradleDependenciesStart = performance.mark('gradleDependencies:start');
const { const {
gradleFileToGradleProjectMap, gradleFileToGradleProjectMap,
gradleProjectToProjectName, gradleProjectNameToProjectRootMap,
buildFileToDepsMap, buildFileToDepsMap,
gradleProjectToChildProjects, gradleProjectToChildProjects,
} = getCurrentGradleReport(); } = getCurrentGradleReport();
@ -35,13 +35,13 @@ export const createDependencies: CreateDependencies = async (
for (const gradleFile of gradleFiles) { for (const gradleFile of gradleFiles) {
const gradleProject = gradleFileToGradleProjectMap.get(gradleFile); const gradleProject = gradleFileToGradleProjectMap.get(gradleFile);
const projectName = gradleProjectToProjectName.get(gradleProject); const projectName = context.projects[dirname(gradleFile)].name;
const depsFile = buildFileToDepsMap.get(gradleFile); const depsFile = buildFileToDepsMap.get(gradleFile);
if (projectName && depsFile) { if (projectName && depsFile) {
processGradleDependencies( processGradleDependencies(
depsFile, depsFile,
gradleProjectToProjectName, gradleProjectNameToProjectRootMap,
projectName, projectName,
gradleFile, gradleFile,
context, context,
@ -88,7 +88,7 @@ function findGradleFiles(fileMap: FileMap): string[] {
export function processGradleDependencies( export function processGradleDependencies(
depsFile: string, depsFile: string,
gradleProjectToProjectName: Map<string, string>, gradleProjectNameToProjectRoot: Map<string, string>,
sourceProjectName: string, sourceProjectName: string,
gradleFile: string, gradleFile: string,
context: CreateDependenciesContext, context: CreateDependenciesContext,
@ -122,9 +122,10 @@ export function processGradleDependencies(
const [_, projectName] = dep.split('-> project'); const [_, projectName] = dep.split('-> project');
gradleProjectName = projectName.trim(); gradleProjectName = projectName.trim();
} }
const target = gradleProjectToProjectName.get( const targetProjectRoot = gradleProjectNameToProjectRoot.get(
gradleProjectName gradleProjectName
) as string; ) as string;
const target = context.projects[targetProjectRoot]?.name;
if (target) { if (target) {
const dependency: RawProjectGraphDependency = { const dependency: RawProjectGraphDependency = {
source: sourceProjectName, source: sourceProjectName,

View File

@ -34,6 +34,9 @@ describe('@nx/gradle/plugin', () => {
['proj', new Map([['test', 'Verification']])], ['proj', new Map([['test', 'Verification']])],
]), ]),
gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]), gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]),
gradleProjectNameToProjectRootMap: new Map<string, string>([
['proj', 'proj'],
]),
gradleProjectToChildProjects: new Map<string, string[]>(), gradleProjectToChildProjects: new Map<string, string[]>(),
}; };
cwd = process.cwd(); cwd = process.cwd();
@ -136,6 +139,9 @@ describe('@nx/gradle/plugin', () => {
['proj', new Map([['test', 'Verification']])], ['proj', new Map([['test', 'Verification']])],
]), ]),
gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]), gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]),
gradleProjectNameToProjectRootMap: new Map<string, string>([
['proj', 'proj'],
]),
gradleProjectToChildProjects: new Map<string, string[]>(), gradleProjectToChildProjects: new Map<string, string[]>(),
}; };
await tempFs.createFiles({ await tempFs.createFiles({
@ -218,6 +224,9 @@ describe('@nx/gradle/plugin', () => {
['proj', new Map([['test', 'Test']])], ['proj', new Map([['test', 'Test']])],
]), ]),
gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]), gradleProjectToProjectName: new Map<string, string>([['proj', 'proj']]),
gradleProjectNameToProjectRootMap: new Map<string, string>([
['proj', 'proj'],
]),
gradleProjectToChildProjects: new Map<string, string[]>(), gradleProjectToChildProjects: new Map<string, string[]>(),
}; };
await tempFs.createFiles({ await tempFs.createFiles({

View File

@ -11,6 +11,7 @@ import { combineGlobPatterns } from 'nx/src/utils/globs';
import { execGradleAsync } from './exec-gradle'; import { execGradleAsync } from './exec-gradle';
import { hashWithWorkspaceContext } from 'nx/src/utils/workspace-context'; import { hashWithWorkspaceContext } from 'nx/src/utils/workspace-context';
import { dirname } from 'path';
export const fileSeparator = process.platform.startsWith('win') export const fileSeparator = process.platform.startsWith('win')
? 'file:///' ? 'file:///'
@ -26,6 +27,7 @@ export interface GradleReport {
gradleFileToOutputDirsMap: Map<string, Map<string, string>>; gradleFileToOutputDirsMap: Map<string, Map<string, string>>;
gradleProjectToTasksTypeMap: Map<string, Map<string, string>>; gradleProjectToTasksTypeMap: Map<string, Map<string, string>>;
gradleProjectToProjectName: Map<string, string>; gradleProjectToProjectName: Map<string, string>;
gradleProjectNameToProjectRootMap: Map<string, string>;
gradleProjectToChildProjects: Map<string, string[]>; gradleProjectToChildProjects: Map<string, string[]>;
} }
@ -125,6 +127,7 @@ export function processProjectReports(
*/ */
const gradleProjectToTasksTypeMap = new Map<string, Map<string, string>>(); const gradleProjectToTasksTypeMap = new Map<string, Map<string, string>>();
const gradleProjectToProjectName = new Map<string, string>(); const gradleProjectToProjectName = new Map<string, string>();
const gradleProjectNameToProjectRootMap = new Map<string, string>();
/** /**
* Map of buildFile to dependencies report path * Map of buildFile to dependencies report path
*/ */
@ -225,6 +228,7 @@ export function processProjectReports(
gradleFileToOutputDirsMap.set(buildFile, outputDirMap); gradleFileToOutputDirsMap.set(buildFile, outputDirMap);
gradleFileToGradleProjectMap.set(buildFile, gradleProject); gradleFileToGradleProjectMap.set(buildFile, gradleProject);
gradleProjectToProjectName.set(gradleProject, projectName); gradleProjectToProjectName.set(gradleProject, projectName);
gradleProjectNameToProjectRootMap.set(projectName, dirname(buildFile));
} }
if (line.endsWith('taskReport')) { if (line.endsWith('taskReport')) {
const gradleProject = line.substring( const gradleProject = line.substring(
@ -276,6 +280,7 @@ export function processProjectReports(
gradleFileToOutputDirsMap, gradleFileToOutputDirsMap,
gradleProjectToTasksTypeMap, gradleProjectToTasksTypeMap,
gradleProjectToProjectName, gradleProjectToProjectName,
gradleProjectNameToProjectRootMap,
gradleProjectToChildProjects, gradleProjectToChildProjects,
}; };
} }