Working with Monorepos
Flightcontrol supports the use of monorepos to deploy one or more Flightcontrol services. A monorepo is a shared source code repository for many projects, which can be useful for keeping all of the projects in sync.
Monorepos are a complicated subject - and many software development organizations have different strategies for organizing their source code. Often times, you might be using custom tooling or a specialized build tool to help manage the monorepo.
We give general guidance here on how to deploy your code out of a monorepo. We’re also happy to help you out if you have a question that isn’t covered in this guide.
Configuration File
You can place the flightcontrol.json
configuration file at the root of your Git repository and use one file to configure each Flightcontrol service in the monorepo.
Using buildType: nixpacks
Packages managed with monorepo tooling
For a JS monorepo using npm
, yarn
, pnpm
or a monorepo that requires running command from the root, you’ll need to point basePath
to the repo root. Then manually specify the install/build command and account for the right path depending on the command needed, like so:
{
"environments": [
{
...
"services": [
{
"id": "api",
"buildType": "nixpacks",
"ci": {
"type": "ec2"
},
"basePath": ".",
"startCommand": "cd packages/api && npm run start",
"buildCommand": "cd packages/api && npm run build"
...
},
...
]
}
]
}
If you have a nx package-based monorepo, then you’ll need to specify the nx
command, including the package name, but basePath
should be empty or set to .
(it’s .
by default):
{
"environments": [
{
...
"services": [
{
"id": "api",
"basePath": ".",
"buildType": "nixpacks",
"ci": {
"type": "ec2"
},
"buildCommand": "nx build blog",
"startCommand": "nx serve blog --verbose",
...
},
...
]
}
]
}
Independent packages in a repo
You should indicate a basePath
alongside the [install|build|start]
commands for each service, like illustrated in the contrived config example below.
{
"environments": [
{
"id": "development",
"name": "Development",
"region": "us-east-2",
"source": {
"branch": "main"
},
"services": [
{
"id": "api",
"name": "Rails API",
"type": "web",
"target": {
"type": "fargate"
},
"buildType": "nixpacks",
"ci": {
"type": "ec2"
},
"basePath": "./packages/api",
"buildCommand": "bundle exec rake assets:precompile",
"startCommand": "rails start"
},
{
"id": "frontend",
"name": "Frontend Web",
"type": "static",
"buildType": "nixpacks",
"ci": {
"type": "ec2"
},
"singlePageApp": true,
"basePath": "./packages/frontend",
"buildCommand": "npm build",
"outputDirectory": "packages/frontend/dist"
}
]
}
]
}
Further customization
If there are specific needs for building/installing your service, such as custom phases or specific OS packages, then you can use a nixpacks.toml
file. The .toml
file is specific to each package and should be placed in the package’s folder.
If you’re using basePath
in your flightcontrol configuration, you don’t need to do anything else and the file will be picked up.
If you’re not using basePath
, you’ll need to set a NIXPACKS_CONFIG_FILE
environment variable with the service’s nixpacks.toml
file path, like the following:
{
id: "production",
name: "production",
services: [
{
id: "frontend",
buildType: "nixpacks",
envVariables: {
"NIXPACKS_CONFIG_FILE": "./apps/frontend/nixpacks.toml"
}
...
},
{
id: "api",
buildType: "nixpacks",
envVariables: {
"NIXPACKS_CONFIG_FILE": "./packages/api/nixpacks.toml"
}
...
},
],
}
Watch Paths
Most monorepo users will want to use Watch Paths so that only services with changes are deployed instead of everything.