Giter VIP home page Giter VIP logo

up-video-controller's Introduction

sample-monorepo

Build Status

Sample monorepo setup with yarn workspaces, typescript, and lerna.

Setup explained

Tooling

  • Monorepo is installed using yarn.

    • Packages are automatically linked together, meaning you can do cross-package work within the repo.
    • devDependencies are common, and only appear in the root package.json.
    • Each package has its own scripts and dependencies. They are being installed in the root node_modules, using the same deduping mechanism yarn uses for single packages.
    • Adding new packages is as simple as dropping an existing package in the packages folder, and re-running yarn.
  • Monorepo scripts are being executed using lerna.

    • Automatically ensures order when using lerna run [script], meaning that if package-a depends on package-b, it will run package-b's scripts first.
    • lerna updated shows changed packages.
    • Easier multi-package publishing, using lerna publish.
  • Sources and tests are written in strict TypeScript.

    • We use a single, common, tsconfig.base.json, from which all other tsconfig.json files inherit (using "extends").
    • Each project has two folders, src and test, each with their own tsconfig.json. This allows us to define which @types packages are accessible on a per-folder basis (src should not have access to test globals).
    • We use @ts-tools/node to run tests directly from sources.
  • Testing is done using mocha and chai.

    • Light, battle-tested, projects with few dependencies.
    • Can be bundled and used in the browser.

Included sample packages

  • @sample-monorepo/components

    • React components library.
    • Built as cjs (Node consumption) and esm (bundler consumption).
  • @sample-monorepo/app

    • React application.
    • Uses the @sample-monorepo/components package (also inside monorepo).
    • Built as cjs (Node consumption) and umd (browser consumption).
  • @sample-monorepo/server

Basic structure and configurations

packages/
  some-package/
    src/
      index.ts
      tsconfig.json   // extends tsconfig.base.json
    test/
      test.spec.ts
      tsconfig.json   // extends tsconfig.base.json

    LICENSE           // package-specific license. included in npm artifact
    package.json      // package-specific deps and scripts
    README.md         // shown in npmjs.com. included in npm artifact

.gitignore            // github's default node gitignore with customizations
.travis.yml           // travis configuration
lerna.json            // lerna configuration
LICENSE               // root license file. picked up by github
package.json          // common dev deps and workspace-wide scripts
README.md             // workspace-wide information. shown in github
tsconfig.base.json    // common typescript configuration
tslint.json           // monorepo wide linting configuration
yarn.lock             // the only lock file in the repo. all packages combined

Dependency management

Traditionally, working with projects in separate repositories makes it difficult to keep versions of devDependencies aligned, as each project can specify its own devDependency versions.

Monorepos simplify this, because devDependencies are shared between all packages within the monorepo.

Taking this into account, we use the following dependency structure:

  • devDependencies are placed in the root package.json
  • dependencies and peerDependencies are placed in the package.json of the relevant package requiring them, as each package is published separately

New devDependencies can be added to the root package.json using yarn:

yarn add <package name> --dev -W

Some packages depend on sibling packages within the monorepo. For example, in this repo, @sample-monorepo/app depends on @sample-monorepo/components. This relationship is just a normal dependency, and can be described in the package.json of app like so:

  "dependencies": {
    "@sample-monorepo/components": "<package version>"
  }

up-video-controller's People

Contributors

vietthang avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.