Turborepo 2.0
Turborepo 2.0 improves the developer experience of JavaScript and TypeScript repositories, with features including:
- New terminal UI: Interactive tasks and clearer logs
- Watch Mode: Dependency-aware task watcher for any tooling in your repository
- All-new documentation: Core monorepo concepts, refreshed API reference, and ecosystem tooling guides
- Licensing and maintenance updates: Upgraded to MIT license and added Long Term Support policy
Update today by running npx @turbo/codemod migrate
or get started with npx create-turbo@latest
.
Visit the upgrading guide for update instructions. Breaking changes are listed below.
New terminal UI
In Turborepo 1.13, we released an experimental interface to learn how a refined terminal UI could improve development velocity. Through the RFC process, we were able to work with the community on designing a revamped local experience, driven by your feedback. Thank you to those who participated.
Today, we’re releasing the new UI as stable, along with the highly requested features that it enables.
Improved clarity for logs
Before 2.0, turbo
would output logs as a stream while you were working on your libraries and applications. This could be overwhelming at times, since the intermixed logs made it difficult to understand what was going on with a specific task.
In this iteration of the UI, you can select individual tasks using your arrow keys to inspect their logs one at a time, making it easier to read the logs that you want to focus on.
Good to know:
The streamed logs view from prior versions of turbo
is still available for
local development by using the --log-order
flag. Note that tasks will not be
interactive with this option and some tools may clear the terminal
unexpectedly.
Interactive tasks
Many tools allow for interacting with a script for important functionality. But, in previous versions of Turborepo, your scripts were trapped inside turbo
so you couldn’t interact with them.
You can now enter the shell of individual tasks and pass inputs to your scripts via stdin
by typing directly into the interface. This enables workflows like running specific test suites with Jest or Vitest, handling database migrations with Drizzle or Prisma, and much more.
To mark a task as interactive, add "persistent": true
to its definition:
With the task selected in the UI, use the Enter
key to enter the task’s shell and CTRL+Z
to exit.
To learn more about persistent and interactive tasks, visit the documentation.
Watch Mode
Turborepo's ability to run many tasks at once gives you tighter feedback loops that help you ship faster. To get the most out of Turborepo's parallelization when working locally, your tools need to have a "watcher" feature available to re-run your code whenever you make changes. Unfortunately, many common tools don't, and most tools aren't monorepo-aware, leading to problems with scripts that depend on other scripts in your repository.
Today, we're releasing Watch Mode to bring this functionality to all your tooling:
Using turbo watch
, Turborepo will re-run tasks whenever you make changes to your source code. Tasks will be ran using your dependency graph and configuration from turbo.json
, just like turbo run
.
Learn more about Watch Mode in the documentation.
All-new documentation
With this release, we’re also publishing revitalized documentation that builds on the strengths of prior versions. We’ve heard your feedback, so the docs now include:
- More monorepo fundamentals and how-tos
- Guides on integrating your favorite tools with Turborepo
- Clearer information architecture and improved search
Visit the Turborepo documentation.
Breaking changes
Visit the upgrading guide for instructions on how to update to 2.0.
Configuration
Breaking changes for turbo.json
can be updated using npx @turbo/codemod migrate
.
- Ignore
turbo
field inpackage.json
(PR) - Turborepo’s default disk cache location moved to
.turbo/cache
fromnode_modules/.cache
(PR) pipeline
key inturbo.json
renamed totasks
(PR)- File globs for directories in
inputs
/outputs
include the directory's contents (e.g.dist
anddist/
equaldist/**
) (PR) outputMode
key renamed tooutputLogs
for clarity and to match the--output-logs
flag (PR)- This change will be reflected in Run Summaries in
resolvedTaskConfig
- This change will be reflected in Run Summaries in
- Error on environment variable syntax in
dependsOn
andglobalDependencies
(deprecated since 1.4) (PR) globalDotEnv
anddotEnv
removed in favor of including.env
files ininputs
(PR)--ignore
removed in favor of--filter
and graph correctness changes below (PR)
Correctness
- Strict Mode for environment variables is now the default, moving from Loose Mode (PR)
- Workspace root directory is now an implicit dependency of all packages (PR)
- Removed
--scope
flag (deprecated since 1.2) (PR) - Packages must have a
name
inpackage.json
(PR) packageManager
field in rootpackage.json
is now required (PR)engines
field in rootpackage.json
is now used in hashing (PR)--filter
no longer infers namespaces for package names (PR)--filter
now errors when no package names or directories are matched (PR)--only
restricts task dependencies instead of only package dependencies (PR)
Other
- Minimum package manager version support for npm and pnpm updated to 8 (Source)
- Remove package manager argument from
create-turbo
, replaced by option (PR)
Community
We're excited to see the continued growth and adoption of Turborepo:
- 25.2k+ GitHub Stars
- 2.3m+ weekly NPM downloads
- 347 years of compute time saved using Vercel Remote Cache
Turborepo is the result of the combined work of all of its contributors, including our core team: Anthony, Chris, Greg, Mehul, Mitch, Nicholas, and Tom.
Thank you for your continued support, feedback, and collaboration to make Turborepo your build tool of choice. If you haven't already, join the conversation on GitHub and Discord.