Run Only Tasks Affected by a PR

As your workspace grows, re-testing, re-building and re-linting all projects becomes too slow. To address this Nx implements code change analysis to determine the minimum set of projects that were affected by the change. How does this work?

nx affected -t <task>

When you run nx affected -t test, Nx uses Git to determine the files you changed in your PR, it will look at the nature of change (what exactly did you update in those files), and it uses this to determine the list of projects in the workspace that can be affected by this change. It then runs the run-many command with that list.

For instance, if my PR changes lib10, and we then run nx affected -t test, Nx leverages the project graph to determine all the projects that depend on lib10, marks them as "affected" and runs test on just that subset of projects.

Making a change in lib10 only affects a sub-part of the project graph
Loading...

Visualize Affected Projects

You can also visualize the affected projects using the Nx graph. Simply run:

nx graph --affected

Specify Which SHAs to Use to Calculate Affected Code

To understand which projects are affected, Nx uses the Git history and the project graph. Git knows which files changed, and the Nx project graph knows which projects those files belong to.

The affected command takes a base and head commit. The default base is your main branch and the default head is your current file system. This is generally what you want when developing locally, but in CI, you need to customize these values.

nx affected:build --base=origin/main --head=$PR_BRANCH_NAME # where PR_BRANCH_NAME is defined by your CI system

nx affected:build --base=origin/main~1 --head=origin/main # rerun what is affected by the last commit in main

You can also set the base and head SHAs as env variables:

NX_BASE=origin/main~1

NX_HEAD=origin/main

Typically, you want to set the base SHA not the most recent commit on the main branch, but rather that latest commit that successfully passed in CI. In other words, in order to be certain that the repo is in a good state, we need to check all the changes that have happened since the last time the repo was in a good state. Depending on your CI provider this might differ:

Ignoring Files from Affected Commands

Nx provides two methods to exclude glob patterns (files and folders) from affected:* commands.

  • Glob patterns defined in your .gitignore file are ignored.
  • Glob patterns defined in an optional .nxignore file are ignored.

Marking Projects Affected by Dependency Updates

By default, Nx will mark all projects as affected whenever your package manager's lock file changes. This behavior is a failsafe in case Nx misses a project that should be affected by a dependency update. If you'd like to opt in to a smarter behavior you can configure Nx to only mark projects as affected if they actually depend on the updated packages.

nx.json
1{ 2 "pluginsConfig": { 3 "@nx/js": { 4 "projectsAffectedByDependencyUpdates": "auto" 5 } 6 } 7} 8

The flag projectsAffectedByDependencyUpdates can be set to auto, all, or an array that contains project specifiers. The default value is all.

Not Using Git

If you aren't using Git, you can pass --files to any affected command to indicate what files have been changed.