Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add shared monorepo build setup #38718

Closed
wants to merge 1 commit into from
Closed

Commits on Aug 3, 2023

  1. Add shared monorepo build setup (facebook#38718)

    Summary:
    Pull Request resolved: facebook#38718
    
    > NOTE: Replaces facebook#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. These are available as build commands at the root of the repo:
    
    - `yarn build` — Builds all configured packages. Functionally, this:
      - Outputs a `dist/` directory with built files.
      - Rewrites package.json `"exports"` to update every `./src/*` reference to `./dist/*` (source of truth).
    - `scripts/build/babel-register.js` — Allows running all Node.js entry points from source, similar to the current setup in [facebook/metro](https://github.com/facebook/metro). (Example entry point file in this PR: `packages/dev-middleware/src/index.js`)
    
    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}
    
    **Differences from the Metro setup**
    
    - References (and compiles out) repo-local `scripts/build/babel-register.js` — removing need for an npm-published dependency.
    
    ## Current integration points
    
    - **CircleCI** — `yarn build` is added to the `build_npm_package` and `find_and_publish_bumped_packages` jobs.
    
    **New Node.js package(s) are 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 (and is actively being done in an internal commit stack).
    
    ### 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]
    
    Reviewed By: NickGerleman
    
    Differential Revision: D47760330
    
    fbshipit-source-id: 456b506f9e50a43bae9bc902f36910253a0681e0
    huntie authored and facebook-github-bot committed Aug 3, 2023
    Configuration menu
    Copy the full SHA
    d9f3a0e View commit details
    Browse the repository at this point in the history