This repository uses Yarn Workspaces to manage multiple packages efficiently and concurrently
to run scripts across these packages simultaneously.
- Introduction
- Getting Started
- Project Structure
- Yarn Workspaces
- Running Scripts Concurrently
- Useful Commands
- Tips and Tricks
This repository is a monorepo that houses multiple packages. It uses Yarn Workspaces to streamline dependency management and the concurrently
package to run multiple scripts in parallel.
- Node.js (v14 or later)
- Yarn (v1.22 or later)
- How workspaces works? Link Here
./reset-aspel-workspace.sh
or
npm run reset
-
Clone the repository:
git clone --recurse-submodules https://github.com/UKHomeOffice/aspel-workspace
-
Install dependencies:
yarn install
-
Working on a ticket Each repo's CI/CD expect package-lock.json, when you are working on a ticket you should commit the changes with package-lock.json for a successful build. If you notice the workspace splits out common dependencies in the root's node_modules folder which is not checked in and not a part of the submodule. When committing code from a repo use
npm install || npm install --package-lock-only
-
InteliJ IDE Troubleshoot: After cloning the repo, you will see all the repositories in the packages folder. Check git settings and align manually.
IDE settings => version control => directory mapping => click + Add and add the packages from the aspel-workspace/packages location.
After this, you will see git will show in IDE plugins.
aspel-workspace/
│
├── packages/
│ ├── asl/
│ ├── asl-internal-ui/
│ ├── asl-resolver/
│ └── ....
│
├── package.json
└── yarn.lock
The workspace configuration is defined in the root package.json
:
{
"name": "aspel-workspace",
"private": true,
"workspaces": [
"packages/*"
]
}
To add a dependency to a specific package:
cd packages/asl
yarn add package-name
To add a dependency to all workspaces:
yarn add -W package-name
To remove a dependency to a specific package: When it is version conflict or only required in one module.
cd packages/asl
yarn remove package-name
To remove a dependency to all workspaces: When a dependencies are used in multiple modules.
yarn remove -W package-name
To run a script in a specific package:
yarn workspace asl run script-name
To run a script in all workspaces:
yarn workspaces run script-name
asl and asl-internal-ui are the services you will be running in an IDE environment, The ideal way so far we discovered is to run the
asl-conductor with this script:
npm start -- --local asl --local asl-internal-ui
The above script will run asl-conductor container tunnelling asl & asl-internal-ui to your IDE's local host AKA this workspace. The best way to run the workspace is as follow:
1 - aspel-workspace/packages/asl & asl-internal-ui/package.json => click on the start button next to dev.
Happy coding :)
Use the concurrently
package to run scripts across multiple packages. Add it as a dev dependency if not already installed:
yarn add concurrently --dev
In the root package.json
, add a script to run multiple dev servers:
{
"scripts": {
"dev": "concurrently --kill-others-on-fail \"yarn workspace asl run dev\" \"yarn workspace asl-com run dev\" \"yarn workspace asl-serv run dev\""
}
}
Run the script:
yarn run dev
Here is the revised text in Markdown format:
- Install dependencies:
yarn install
- Run a script in a specific package:
yarn workspace <package-name> run <script-name>
- Run a script in all workspaces:
yarn workspaces run <script-name>
- Add a dependency to a specific package:
yarn workspace <package-name> add <dependency-name>
- Checkout master/main in all submodules:
git submodule foreach 'git checkout main || git checkout master'
- Pull latest changes in all branches
git submodule foreach git pull
Feel free to adjust the repository URL and package names as needed!
ESLint relative extends don't work in both the workspace and CI/CD at the same time, as the installation path changes
between the two. The rules have been moved to @ukhomeoffice/eslint-config-asl
, so if a module hasn't been updated yet
update the package.json to use "@ukhomeoffice/eslint-config-asl": "^3.0.0"
and update .eslintrc to
extends:
- "@ukhomeoffice/asl"
You can get ESLint feedback and automatic fixes as you work in IntelliJ. Go to IntelliJ settings > Languages & Frameworks > JavaScript > ESLint. Change the radio group to "Automatic ESLint configuration", and check "Run eslint --fix on save".
Please ensure the package-lock.json
is available when you are committing. Bump up the package.json
version along with the changes. Once you are happy with the work, always reset the workspace and stash changes to prevent workspace breakage.
To reset the workspace, delete the node_modules
folder in packages/*
so that when you re-run the command below, it recreates the dependency tree suitable for the workspace:
yarn run dev