How Moonrepo Recognizes Project Languages

RMAG news

In this article, we will explain how the monorepo management tool Moon recognizes the languages of projects.

What is Moon?

Moon is a monorepo management tool. A monorepo is a method of managing multiple projects or packages within a single repository. Moon helps manage these projects efficiently and integrates tasks such as building, testing, and deploying. It manages dependencies between projects and improves development efficiency while maintaining consistency across the repository.

For more details: Moon Official Site

Managing Language Information

Moon maintains language information for each project and selects tasks to execute based on the language. The language information of a project can be set by describing it in the language field of the moon.yml file.

Example for a TypeScript project:

language: typescript

With this setting, tasks defined in the .moon/tasks/typescript.yml file will be executed for that project. This feature is known as task inheritance. For more details, see here.

When No Language is Specified

If no language is specified in moon.yml, Moon will analyze the project’s files and automatically identify the language. Thanks to Moon’s intelligent design, it determines the programming language based on specific files.

How Language Detection Works

Moon determines the project’s programming language based on specific files found in the project’s root directory. The following is how Moon detects each language.

1. Checking for Go Files

If any of the following files are found, the project’s language is determined to be Go:

go.mod
go.sum
g.lock
.gvmrc
.go-version

2. Checking for PHP Files

If any of the following files are found, the project’s language is determined to be PHP:

composer.json
composer.lock
.phpenv-version
.phpbrewrc

3. Checking for Python Files

If any of the following files are found, the project’s language is determined to be Python:

requirements.txt
constraints.txt
pyproject.toml
.pylock.toml
.python-version
Pipfile
Pipfile.lock
poetry.toml
poetry.lock

4. Checking for Ruby Files

If any of the following files are found, the project’s language is determined to be Ruby:

Gemfile
Gemfile.lock
.bundle
.ruby-version

5. Checking for Rust Files

If any of the following files are found, the project’s language is determined to be Rust:

Cargo.toml
Cargo.lock
.cargo
rust-toolchain.toml
rust-toolchain

6. Checking for TypeScript Files

If any of the following files are found, the project’s language is determined to be TypeScript:

tsconfig.json
tsconfig.tsbuildinfo

Additionally, Deno files are also checked:

deno.json
deno.jsonc
deno.lock
.dvmrc

7. Checking for JavaScript Files

If any of the following files are found, the project’s language is determined to be JavaScript:

package.json
.nvmrc
.node-version
package-lock.json
.npmrc
.pnpmfile.cjs
pnpm-lock.yaml
pnpm-workspace.yaml
yarn.lock
.yarn
.yarnrc
.yarnrc.yml

Additionally, Bun files are also checked:

bunfig.toml
bun.lockb
.bunrc

8. If No Files Are Found

If none of the specific files are found, the project’s language is determined to be unknown.

This specification allows Moon to determine the programming language based on the file structure within the project. For more details, see here.

Explicitly Specifying the Language

If you do not want Moon to estimate the project’s language, it is recommended to explicitly specify the language field in the moon.yml file. However, be sure to specify a value other than unknown because specifying unknown will trigger the detection feature described above.

I hope this article helps deepen your understanding of how Moon recognizes project languages.