chrome-devtools-frontend
Version:
Chrome DevTools UI
145 lines (110 loc) • 5.1 kB
Markdown
# Workflow: Merging a DevTools Submodule into its Parent
This document outlines the process for merging a submodule (e.g., `panels/timeline/extensions`) into its parent module (e.g., `panels/timeline`) within the DevTools build system. The goal is to simplify the build configuration by consolidating `BUILD.gn` files while keeping the original source file directory structure.
## Prerequisites
You will need the following information:
- **Parent Module Path:** The path to the directory containing the primary module.
- **Child Module Path:** The path to the directory of the submodule to be merged.
## Workflow Steps
### 1. Analyze Build Configurations
Read the contents of the `BUILD.gn` file from both the child module and the parent module. Identify the following from the child's `BUILD.gn`:
- The list of `sources` in the `devtools_module`.
- The list of `deps` (dependencies) in the `devtools_module`.
- The `entrypoint` for the `devtools_entrypoint("bundle")`.
### 2. Modify the Parent `BUILD.gn`
Edit the `BUILD.gn` file in the parent module's directory to incorporate the child module's configuration.
1. **Add Child's Sources:** Append the list of `sources` from the child's `devtools_module` to the parent's `sources` list. Remember to maintain the relative path from the parent's directory (e.g., `extensions/ExtensionUI.ts`).
2. **Merge Dependencies:** Add the `deps` from the child's `devtools_module` to the parent's `deps` list. Remove any duplicate entries.
3. **Remove Child Bundle Dependency:** Delete the dependency on the child's bundle from the parent's `deps` list (e.g., remove `./extensions:bundle`).
### 3. Delete the Child `BUILD.gn`
Once the parent `BUILD.gn` is updated and contains all the necessary information, the child's `BUILD.gn` is no longer needed. Delete it.
```bash
rm <child_module_path>/BUILD.gn
```
### 4. Update `devtools_grd_files.gni`
The global `.gni` file that lists all resources needs to be updated to reflect that the child module is no longer a separate, bundled entrypoint.
1. **Locate and Read the File:** Open `config/gni/devtools_grd_files.gni`.
2. **Remove Bundled Source:** Find and remove the line for the child's bundled JavaScript file from the `grd_files_bundled_sources` list. This path usually corresponds to the child's `entrypoint`.
3. **Add Unbundled Sources:** Add the paths to all of the child's original TypeScript source files (`.ts`) to the `grd_files_unbundled_sources` list.
---
## Example: Merging `panels/timeline/extensions` into `panels/timeline`
- **Parent Module:** `panels/timeline`
- **Child Module:** `panels/timeline/extensions`
### 1. `panels/timeline/BUILD.gn` Modification
**Before:**
```gni
devtools_module("timeline") {
sources = [
...
"UIDevtoolsUtils.ts",
]
deps = [
...
"./components:bundle",
"./extensions:bundle",
"./overlays:bundle",
...
]
}
```
**After:**
```gni
devtools_module("timeline") {
sources = [
...
"UIDevtoolsUtils.ts",
"extensions/ExtensionUI.ts", # Added from child
]
deps = [
...
"./components:bundle",
# "./extensions:bundle", # Removed
"./overlays:bundle",
...
# Dependencies from extensions/BUILD.gn are merged here
"../../../ui/components/helpers:bundle",
"../../../ui/components/render_coordinator:bundle",
"../../../ui/legacy:bundle",
]
}
```
### 2. `panels/timeline/extensions/BUILD.gn` Deletion
```bash
rm front_end/panels/timeline/extensions/BUILD.gn
```
### 3. `config/gni/devtools_grd_files.gni` Modification
**Before:**
```gni
grd_files_bundled_sources = [
...
"front_end/panels/timeline/components/components.js",
"front_end/panels/timeline/extensions/extensions.js",
"front_end/panels/timeline/overlays/overlays.js",
...
]
grd_files_unbundled_sources = [
...
"front_end/panels/timeline/extensions/ExtensionUI.ts", # This might not have been present before
...
]
```
**After:**
```gni
grd_files_bundled_sources = [
...
"front_end/panels/timeline/components/components.js",
# "front_end/panels/timeline/extensions/extensions.js", # Removed
"front_end/panels/timeline/overlays/overlays.js",
...
]
grd_files_unbundled_sources = [
...
"front_end/panels/timeline/extensions/extensions.ts", # Added
"front_end/panels/timeline/extensions/ExtensionUI.ts", # Added
...
]
```
## Removing Barrel Files
After merging modules, you may still have remaining barrel files (e.g. `index.ts` or `extensions.ts` that just re-export other files). These should be removed to simplify the module structure.
Manually updating all imports that rely on these barrels can be tedious and error-prone. The tool [unbarrelify](https://github.com/webpro/unbarrelify) can automate this process. It analyzes your codebase and replaces imports from barrel files with direct imports from the source files.
**Usage:**
Follow the instructions in the [unbarrelify repository](https://github.com/webpro/unbarrelify) to install and run the tool on your project. This is highly recommended to complete the refactoring process efficiently.