How Moonrepo Recognizes Project Languages
Tags: moonrepo, moon
Published: 2024-05-30 01:13:31

---
title: How Moonrepo Recognizes Project Languages
published: true
description: 
tags: Moonrepo, moon
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
# published_at: 2023-04-07 01:57 +0000
---


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](https://moonrepo.dev/)

## 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:

```yaml
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](https://moonrepo.dev/docs/concepts/task-inheritance).

## 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](https://github.com/moonrepo/moon/blob/master/crates/platform-detector/src/project_language.rs).

## 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.