Introducing Monorepo Tasks #6564
Replies: 29 comments 103 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.
-
|
Can monorepo work with autocompletion? I can't get this working |
Beta Was this translation helpful? Give feedback.
-
|
do we already have project alias? e.g
|
Beta Was this translation helpful? Give feedback.
-
|
I hit a bug with cat ./mise.toml cat a/mise.toml Only the last run works as intended, it seems that sources doesn't correctly change directory before As anyone been hit by this and has a workaround? Thanks, |
Beta Was this translation helpful? Give feedback.
-
|
I was trying to run something like this: mise //project-a:ci ::: //project-b:ciwith something like this: # project-a/mise.toml
[tasks.lint]
run = "echo 'project-a lint'"
[tasks.test]
run = "echo 'project-a test'"
[tasks.ci]
depends = [":lint", ":test"]# project-b/mise.toml
[tasks.lint]
run = "echo 'project-b lint'"
[tasks.test]
run = "echo 'project-b test'"
[tasks.ci]
depends = [":lint", ":test"]but getting an error like Reproduction here: https://github.com/chadxz/mise-monorepo-multiple-deps-repro |
Beta Was this translation helpful? Give feedback.
-
|
When running monorepo tasks like Example structure that fails: Workaround: mise -C ./parent/child run //parent/child:task works because it forces mise to load configs from that directory. |
Beta Was this translation helpful? Give feedback.
-
|
Will there be support for task caching in the future? |
Beta Was this translation helpful? Give feedback.
-
|
Hello, a recent version added tasks heritage, were tasks from mise.toml in other directories than the current one are magically available. There is no |
Beta Was this translation helpful? Give feedback.
-
|
Thanks for implementing this! Are there any plans on implementing affected files detection? This is the main missing link that is needed in a monorepo. |
Beta Was this translation helpful? Give feedback.
-
|
Hmm, I think you might also not want "prepare" to be inherited. (or, like tasks, have some explicit way to reuse prepare tasks.) My use case: I'm working in a monorepo that has some base setup steps to get things working after checkout. So in my root config.toml, I've got a prepare task to take care of that. But, now every project seems to have inherited the "prepare" so when I run Additionally, unlike the way inherited tasks worked, the prepare task seems to be using the pwd of the inner projects, not the root, so some of my prepare tasks fail. One of my prepare tasks is running I really like making the tasks have unified namespace so I can run or depend on tasks from everywhere in the repo, but inheritance is having very unexpected behavior. 😅 (I'm using 2026.1.9) |
Beta Was this translation helpful? Give feedback.
-
|
Hello, I am preparing to migrate away from automatic discovery as per the deprecation notice. However, maintaining a static list of explicit paths in [monorepo].config_roots is difficult for our workflow, as projects are frequently added or moved. Currently, I work around this by generating the TOML configuration dynamically using git ls-files to locate all mise.toml instances: git ls-files --exclude-standard "*/mise.toml" | sed "s#/mise.toml\$##;s#^\(.*\)\$#'\1',#;1i [monorepo]\nconfig_roots = [" && echo ']'Would it be possible to add a configuration option that allows mise to execute a command to populate config_roots? This would provide the best of both worlds: explicit control over discovery logic (e.g., respecting .gitignore) without the manual maintenance of a hardcoded list. Thanks, |
Beta Was this translation helpful? Give feedback.
-
Remaining task inheritance issuesMost of the task inheritance was removed in 2026.1.9, but I'm still seeing a bit of it. (using v2026.1.11) For example, given: ## --- mise/common.tasks.toml ---
[common-task]
run = "echo common-task ran"
[build]
description = "common build task"
run = "echo common build ran"## --- mise/config.toml ---
experimental_monorepo_root = true
monorepo.config_roots = [ "packages/*" ]
settings.experimental = true
[tasks.root-task]
run = "echo ran root task"
[tasks.build]
description = "monorepo-wide build"
run = "echo ran root build"## --- packages/foo/mise/config.toml ---
task_config.includes = [
"../../../mise/common.tasks.toml"
]
[tasks.foo-task]
run = "echo foo-task ran"Then:
But within one of the single packages, there's odd behavior:
(I do see all tasks with Additionally, running local tasks doesn't work as expected: foo-task works, though: |
Beta Was this translation helpful? Give feedback.
-
Prepare steps not executed in sub-directories(aside: Should we report monorepo-related bugs here? Or just make new top-level discussions?) v2026.2.15-16 In a monorepo, I have: # foo/.mise/config.toml
[prepare.npm-ci]
# rerun `npm ci` as needed:
auto = true
sources = [
"package.json",
"package-lock.json",
]
outputs = [
"node_modules",
]
run = "npm ci"When I run But if I IMO it should either run both, or give an error/warning about prepare steps not being valid in inner directories. |
Beta Was this translation helpful? Give feedback.
-
|
Is overriding tasks from included files supposed to work? I have a case where I define a task with the same name as from the included file, but Mise still runs the included task. |
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