Skip to content

Commit

Permalink
Add shared monorepo build setup (#38240)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: #38240

## Context

RFC: Decoupling Flipper from React Native core: react-native-community/discussions-and-proposals#641

## Changes

To support incoming new React Native packages around debugging (including migrating over [`react-native-community/cli-plugin-metro`](https://github.com/react-native-community/cli/tree/main/packages/cli-plugin-metro)) — which target Node.js and require a build step, this PR adds a minimal shared build setup across the `react-native` monorepo.

The setup is closely inspired/based on the build scripts in Jest, Metro, and React Native CLI — and is a simple set of script wrappers around Babel and Chokidar. These are available as build commands at the root of the repo:

- `yarn build`
- `yarn clean`
- `yarn watch`

Build configuration (i.e. Babel config) is shared as a set standard across the monorepo, and **packages are opted-in to requiring a build**, configured in `scripts/build.config.js`.

```
const buildConfig /*: BuildConfig */ = {
  // The packages to include for build and their build options
  packages: {
    'dev-middleware': {target: 'node'},
  },
};
```

For now, there is a single `target: 'node'` option — this is necessary as `react-native`, unlike the above other projects, is a repository with packages targeting several runtimes. We may, in future, introduce a build step for other, non-Node, packages — which may be useful for things such as auto-generated TypeScript definitions.

 {F1043312771}

## Current integration points

- `.circleci/config.yml` — Added to `run_yarn` (with project install).
- Root `yarn start` — Convenience for local developers.
- `yarn start` within `packages/rn-tester` — Convenience for local developers.

**Planned**: I will be adding notes on `yarn build` to the following "Contributing" website pages:

- https://reactnative.dev/contributing/overview#contributing-code
- https://reactnative.dev/contributing/how-to-open-a-pull-request#chapter-ii-implementing-your-changes

**This is not load bearing quite yet**: There are not yet any built packages added to the dependencies of `packages/react-native/`, so this will be further tested in a later PR.

### Alternative designs

**Per-package config file**

Replace `scripts/build/config.js` with a package-defined key in in `package.json`, similar to Jest's [`publishConfig`](https://github.com/jestjs/jest/blob/1f019afdcdfc54a6664908bb45f343db4e3d0848/packages/jest-cli/package.json#L87C3-L89C4).

```
"buildConfig": {
  "type": "node"
},
```

This would be the only customisation required, with a single Babel config still standardised. Another option this might receive in future is `enableTypeScriptCodgeen`.

**Rollup**

More sophisticated build tool for Node.js, used by the React codebase (albeit within a custom script setup as well).

**Lerna and Nx**

- Most sophisticated setup enabling caching and optimised cloud runs.
- Probably the most likely thing we'll move towards at a later stage.

Changelog: [Internal]

Differential Revision: D46759508

fbshipit-source-id: 4168d445b95213dd4e3123f5039914486fb3e2e8
  • Loading branch information
huntie authored and facebook-github-bot committed Jul 10, 2023
1 parent 28dfdb2 commit 8e49b22
Show file tree
Hide file tree
Showing 12 changed files with 1,911 additions and 34 deletions.
3 changes: 3 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ commands:
paths:
- ~/.cache/yarn
key: << parameters.yarn_base_cache_key >>-{{ arch }}-{{ checksum "yarn.lock" }}
- run:
name: Build packages
command: yarn build

brew_install:
parameters:
Expand Down
Loading

0 comments on commit 8e49b22

Please sign in to comment.