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

View File

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

View File

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

View File

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