diff --git a/packages/nx/src/native/tasks/hash_planner.rs b/packages/nx/src/native/tasks/hash_planner.rs index c840d67354..ad999f1b9c 100644 --- a/packages/nx/src/native/tasks/hash_planner.rs +++ b/packages/nx/src/native/tasks/hash_planner.rs @@ -163,9 +163,11 @@ impl HashPlanner { )) } else { let mut external_deps: Vec<&'a String> = vec![]; + let mut has_external_deps = false; for input in self_inputs { match input { Input::ExternalDependency(deps) => { + has_external_deps = true; for dep in deps.iter() { let external_node_name = find_external_dependency_node_name(dep, &self.project_graph); @@ -203,8 +205,10 @@ impl HashPlanner { .map(|s| HashInstruction::External(s.to_string())) .collect(), )) - } else { + } else if !has_external_deps { Ok(Some(vec![HashInstruction::AllExternalDependencies])) + } else { + Ok(None) } } } diff --git a/packages/nx/src/native/tests/planner.spec.ts b/packages/nx/src/native/tests/planner.spec.ts index 7a1e176146..51ded1c364 100644 --- a/packages/nx/src/native/tests/planner.spec.ts +++ b/packages/nx/src/native/tests/planner.spec.ts @@ -492,6 +492,56 @@ describe('task planner', () => { expect(plans).toMatchSnapshot(); }); + it('should build plans where a project specifies no external dependencies', async () => { + let projectFileMap = { + proj: [{ file: '/file.ts', hash: 'file.hash' }], + }; + let builder = new ProjectGraphBuilder(undefined, projectFileMap); + builder.addNode({ + name: 'proj', + type: 'lib', + data: { + root: 'libs/proj', + targets: { + build: { + executor: 'nx:run-commands', + inputs: [ + { + externalDependencies: [], + }, + ], + }, + }, + }, + }); + builder.addNode({ + name: 'child', + type: 'lib', + data: { + root: 'libs/child', + targets: { build: { executor: 'nx:run-commands' } }, + }, + }); + let projectGraph = builder.getUpdatedProjectGraph(); + let taskGraph = createTaskGraph( + projectGraph, + {}, + ['proj'], + ['build'], + undefined, + {} + ); + let nxJson = {} as any; + const planner = new HashPlanner( + nxJson, + transferProjectGraph(transformProjectGraphForRust(projectGraph)) + ); + const taskIds = Object.keys(taskGraph.tasks); + + const plans = planner.getPlans(taskIds, taskGraph); + expect(plans['proj:build']).not.toContain('AllExternalDependencies'); + }); + it('should include npm projects', async () => { let projectFileMap = { app: [{ file: '/filea.ts', hash: 'a.hash' }],