Introducing Monorepo Tasks #6564
Replies: 16 comments 37 replies
-
|
Does this support |
Beta Was this translation helpful? Give feedback.
-
|
Excited to see this! We're currently using turbo in a mixed Rust/wasm/TS/Python/Go repo, and it's been a bit of a mixed bag (admittedly, I don't know how much of that is because we're unwilling to invest effort into modelling task inputs/outputs correctly in turbo). Compounding the issue is that what we really want a whole bunch of things out of it:
Absent these, I don't really see us adopting this anytime soon unfortunately. |
Beta Was this translation helpful? Give feedback.
-
|
The |
Beta Was this translation helpful? Give feedback.
-
|
I was playing around with tasks that trigger other tasks, but I can't get a project task to run when it's called from the root. If I have a task # file: projects/backend/mise.toml
[tasks.hello]
run = "echo 'hello world'"And in the root I have: # file: mise.toml
[tasks.hello]
run = [
{ task = "//projects/backend:hello" }
]Executing And for completeness: $ mise tasks --all
//:hello
//projects/backend:hello
$ mise run //projects/backend:hello
[//projects/backend:hello] $ echo 'hello world'
hello worldI've only started using Mise with tasks recently, so maybe I'm missing something. Otherwise, this feature looks like it's going to be really useful, so thank you. |
Beta Was this translation helpful? Give feedback.
-
|
Exciting! Been playing around a bit with this today and I really like the concept! One problem I ran into: Repo structure: For setups like this it would be great if the "sub projects" could independently define their tasks without being "aware" that they are also used in a monorepo context. This works to some degree for basic tasks since they are auto discovered as child tasks, but because task names in "local contexts" need to be My expectation would be that would be the same as With the current "local task" references having different syntax depending on monorepo-ness, I think it's impossible to get the above setup to work in both contexts - am I correct in that assumption? |
Beta Was this translation helpful? Give feedback.
-
|
Bravo, mise continues to improve, it's one of my favorite tools (also when it was I migrated a multi-project to mono-repo, and I noticed this issue (or maybe it's expected):
To reproduce (minimal sample): .
├── mise.toml
└── submodule
└── mise.toml
min_version = "2025.10.6" # "2025.9.7"
experimental_monorepo_root = true
[settings]
experimental = true
[tasks.before]
run = "echo 'before'"
[tasks."do:item-1"]
depends = [":before"]
run = "echo 'do:item-1'"❯ mise run //submodule:do:item-1
mise ERROR task not found: :before
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more informationMy current workaround is to replace |
Beta Was this translation helpful? Give feedback.
-
|
It seems that monorepo tasks do not propagate Configuration Environments afaict. E.g: running It seems that the root (If anything is unclear, I can make a better reproduction if needed) Side note: it seems that Configuration Environments are a little unwieldy to use in real applications, is there a better way to do things like "run the PRODUCTION build + publish instead of STAGING, while switching out all the env vars" with all the same commands, or close to the same? |
Beta Was this translation helpful? Give feedback.
-
|
I have been getting ProjectA/mise.toml ProjectB/mise.toml running command:
|
Beta Was this translation helpful? Give feedback.
-
|
I seem to be unable to test this functionnality I have the following setup: |
Beta Was this translation helpful? Give feedback.
-
|
I'm trying to use this feature on my Windows using pwsh. My project structure is as follows: Root experimental_monorepo_root = true
[env]
MISE_EXPERIMENTAL = true
[tasks.hello]
run = "//apps/...:hello"Sub-project [tasks.hello]
run = "echo 'hello from [backend|frontend]'"When I run: $ mise tasks
Name Description
//:hello And then: $ mise :hello
[//:hello] $ //apps/...:hello
The network path was not found.
[//:hello] ERROR task failed |
Beta Was this translation helpful? Give feedback.
-
|
it's just me or? monorepo tasks broken on 2025.10.18 macos-arm64 (2025-10-25) Show all tasks: Root mise.toml: Frontend mise toml: |
Beta Was this translation helpful? Give feedback.
-
|
|
Beta Was this translation helpful? Give feedback.
-
|
Unless mistaken, tasks are still inherited in monorepo mode. However, I would expect to see At the moment, the following does not work |
Beta Was this translation helpful? Give feedback.
-
|
For some reason, adding [env]
MISE_EXPERIMENTAL = trueto each Any explanations/workarounds? |
Beta Was this translation helpful? Give feedback.
-
|
I've been try to use default tasks in monorepo, but when I either set Another minor issues I've found is |
Beta Was this translation helpful? Give feedback.
-
|
I think my search for defining the default shell for mise tasks fits best in this discussion. Q: Is there a way to define the default shell for all tasks? File: experimental_monorepo_root = true
[env]
[tasks]
shell = 'zsh -ic'
[tasks.build]
# shell = 'zsh -ic'
depends = ['//webui:build']
description = "Build Ansible Lint Reporter"
run = [
'pip install -e .',
#
] |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
We're excited to announce Monorepo Tasks, a powerful new feature that brings first-class monorepo support to mise tasks! 🚀
What is it?
Monorepo Tasks allows you to manage tasks across multiple projects in a single repository, with each project maintaining its own tools, environment variables, and tasks. Think of it as bringing the power of tools like Bazel or Turborepo to mise's task system, but with mise's signature simplicity.
Key Features
🎯 Unified Task Namespace
All tasks across your monorepo are automatically discovered and prefixed with their location:
🌳 Smart Tool & Environment Inheritance
Define common tools at the root, override them where needed:
🎭 Powerful Wildcard Patterns
Run tasks across multiple projects with ease:
✨ Consistent Execution Anywhere
Run tasks from anywhere in the monorepo - they always execute with the correct context, tools, and environment from their config_root.
🔒 Automatic Trust Propagation
Trust your monorepo root once, and all descendant configs are automatically trusted.
Quick Start
1. Enable the feature in your root
mise.toml:2. Set the experimental flag:
export MISE_EXPERIMENTAL=13. Add tasks to your projects:
4. Run tasks from anywhere:
mise //projects/frontend:build mise //...:test # Run tests in all projects!Example Monorepo Structure
Run all service builds:
mise //services/...:buildRun all app tests:
mise //apps/...:testRun everything:
mise '//...:*'(if you're brave! 😄)Why This Matters
Managing monorepos is hard. Coordinating tools, tasks, and environments across dozens of projects is even harder. With Monorepo Tasks, you get:
How Does This Compare to Other Tools?
The monorepo ecosystem is rich with excellent tools, each with different strengths. Here's how mise's Monorepo Tasks compares:
Simple Task Runners
Taskfile and Just are fantastic for single-project task automation. They're lightweight and easy to set up, but they weren't designed with monorepos in mind. While you can have multiple Taskfiles/Justfiles in a repo, they don't provide unified task discovery, cross-project wildcards, or automatic tool/environment inheritance across projects.
mise's advantage: Automatic task discovery across the entire monorepo with a unified namespace and powerful wildcard patterns.
JavaScript-Focused Tools
Nx, Turborepo, and Lerna are powerful tools specifically designed for JavaScript/TypeScript monorepos.
mise's advantage: Language-agnostic support. While these tools excel in JS/TS ecosystems, mise works equally well with Rust, Go, Python, Ruby, or any mix of languages. You also get unified tool version management (not just tasks) and environment variables across your entire stack.
Large-Scale Build Systems
Bazel (Google) and Buck2 (Meta) are industrial-strength build systems designed for massive, multi-language monorepos at companies with thousands of engineers.
Both are extremely powerful but come with significant complexity:
mise's advantage: Simplicity through non-hermetic builds. mise doesn't try to control your entire build environment in isolation - instead, it manages tools and tasks in a flexible, practical way. This "non-hermetic" approach means you can use mise without restructuring your entire codebase or learning a new language. You get powerful monorepo task management with simple TOML configuration - enough power for most teams without the enterprise-level complexity that hermetic builds require.
Other Notable Tools
Rush (Microsoft) offers strict dependency management and build orchestration for JavaScript monorepos, with a focus on safety and convention adherence.
Moon is a newer Rust-based build system that aims to be developer-friendly while supporting multiple languages.
The mise Sweet Spot
mise's Monorepo Tasks aims to hit the sweet spot between simplicity and power:
When to choose mise:
When to consider alternatives:
The best tool is the one that fits your team's needs. mise's Monorepo Tasks is designed for teams who want powerful monorepo management without the complexity overhead, especially when working across multiple languages.
Try It Out!
This feature is experimental, which means:
Read the full documentation: Monorepo Tasks Guide
We Want Your Feedback!
Please try it out and let us know:
Share your experience in the comments below! 👇
Special shoutout to the mise community for the feedback and ideas that led to this feature. Happy building! 🛠️
Beta Was this translation helpful? Give feedback.
All reactions