Back to Moon

.moon/tasks

website/docs/config/tasks.mdx

2.2.46.1 KB
Original Source

import HeadingApiLink from '@site/src/components/Docs/HeadingApiLink'; import VersionLabel from '@site/src/components/Docs/VersionLabel';

The .moon/tasks/**/* files configures file groups and tasks that are inherited by every matching project in the workspace based on inheritance conditions. Learn more about task inheritance!

Projects can override or merge with these settings within their respective moon.*.

extends

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#extends" />

Defines one or many external .moon/tasks/**/*'s to extend and inherit settings from. Perfect for reusability and sharing configuration across repositories and projects. When defined, this setting must be an HTTPS URL or relative file system path that points to a valid YAML document!

yaml
extends: 'https://raw.githubusercontent.com/organization/repository/master/.moon/tasks/all.yml'

:::caution

For map-based settings, fileGroups and tasks, entries from both the extended configuration and local configuration are merged into a new map, with the values of the local taking precedence. Map values are not deep merged!

:::

fileGroups

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#fileGroups" />

For more information on file group configuration, refer to the fileGroups section in the moon.* doc.

Defines file groups that will be inherited by projects, and also enables enforcement of organizational patterns and file locations. For example, encourage projects to place source files in a src folder, and all test files in tests.

yaml
fileGroups:
  configs:
    - '*.config.{js,cjs,mjs}'
    - '*.json'
  sources:
    - 'src/**/*'
    - 'types/**/*'
  tests:
    - 'tests/**/*'
    - '**/__tests__/**/*'
  assets:
    - 'assets/**/*'
    - 'images/**/*'
    - 'static/**/*'
    - '**/*.{scss,css}'

:::info

File paths and globs used within a file group are relative from the inherited project's root, and not the workspace root.

:::

implicitDeps

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#implicitDeps" />

Defines task deps that are implicitly inserted into all inherited tasks within a project. This is extremely useful for pre-building projects that are used extensively throughout the repo, or always building project dependencies. Defaults to an empty list.

yaml
implicitDeps:
  - '^:build'

:::info

Implicit dependencies are always inherited, regardless of the mergeDeps option.

:::

implicitInputs

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#implicitInputs" />

Defines task inputs that are implicitly inserted into all inherited tasks within a project. This is extremely useful for the "changes to these files should always trigger a task" scenario.

Like inputs, file paths/globs defined here are relative from the inheriting project. Project and workspace relative file patterns are supported and encouraged.

yaml
implicitInputs:
  - 'package.json'

:::info

Implicit inputs are always inherited, regardless of the mergeInputs option.

:::

inheritedBy<VersionLabel version="2.0.0" />

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#inheritedBy" />

A map of conditions that must be met for the configuration within the file to be inherited by a project. When this field is not defined, or is an empty map, the configuration will be inherited by all projects.

yaml
inheritedBy:
  # Project belongs to either javascript or typescript toolchain, but not the ruby toolchain
  toolchains:
    or: ['javascript', 'typescript']
    not: ['ruby']
  # And project is either a frontend or backend stack
  stacks: ['frontend', 'backend']
  # And project is either a library or tool layer
  layers: ['library', 'tool']

:::info

View the official task inheritance guide for more information!

:::

tasks

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#tasks" />

For more information on task configuration, refer to the tasks section in the moon.* doc.

As mentioned in the link above, tasks are actions that are ran within the context of a project, and commonly wrap a command. For most workspaces, every project should have linting, typechecking, testing, code formatting, so on and so forth. To reduce the amount of boilerplate that every project would require, this setting offers the ability to define tasks that are inherited by many projects within the workspace, but can also be overridden per project.

yaml
tasks:
  format:
    command: 'prettier --check .'

  lint:
    command: 'eslint --no-error-on-unmatched-pattern .'

  test:
    command: 'jest --passWithNoTests'

  typecheck:
    command: 'tsc --build'

:::info

Relative file paths and globs used within a task are relative from the inherited project's root, and not the workspace root, or the location of the .moon/tasks/* file.

:::

taskOptions<VersionLabel version="1.20.0" />

<HeadingApiLink to="/api/types/interface/InheritedTasksConfig#taskOptions" />

For more information on task options, refer to the options section in the moon.* doc.

Like tasks, this setting allows you to define task options that will be inherited by all tasks within the configured file, and by all project-level inherited tasks. This setting is the 1st link in the inheritance chain, and can be overridden within each task.

yaml
taskOptions:
  # Never cache builds
  cache: false
  # Always re-run flaky tests
  retryCount: 2

tasks:
  build:
    # ...
    options:
      # Override the default cache setting
      cache: true