Monorepo——大規模先端項目のコード管理方式


最近はプロジェクトを引き継いでいますが、コード量が多くて、ちょっと複雑です.仓库cloneの下のコードは50+MBで、npm installのインストール済みの体积は2 GB近くに膨れ上がっています.熟知してください.このプロジェクトは复雑で、monopoの方式を采用してコードの管理を行います.何日か繰り返した後に、monomore poに対しても大体の理解があります.
Monorepo
Monorepoとは、プロジェクトコードを管理する一つの方法であり、一つのプロジェクト倉庫で複数のモジュール/パッケージを管理し、一般的なモジュールごとにrepoを構築することを意味する.
現在多くの大型オープンソースプロジェクトがこの方式を採用しています.
How is the repo structured?
The Babel repo is managed as a monoorop that is compsed of manpm packages.
クリアー-react-ap、react-routerなどがあります.これらの項目の第1級ディレクトリの内容は足場を中心としており、主な内容はpackagesディレクトリにあり、複数のパッケージに分けて管理されている.
├── packages
|   ├── pkg1
|   |   ├── package.json
|   ├── pkg2
|   |   ├── package.json
├── package.json
monopoの最も主要な利点は、統一されたワークフローとCode Sharingです.例えば、pacakgeのコードを見たいです.論理を理解したいです.そのrepoを探す必要がないです.直接に現在のrepoにあります.複数のpacakgeを修正する必要がある場合、それぞれのrepoに修正、テスト、リリースまたはnpm linkを行う必要はなく、直接に現在のrepoに修正し、統一テスト、統一版を出す.足場をセットにするだけで、複数のパッケージを管理(構築、テスト、リリース)することができます.
悪いところは主にrepoの体積が大きいです.特に、各packageは理論的には独立しているので、各packageは自分のdependenciesを維持していますが、大きな可能性があります.packageの間には多くの同じ依存があります.これはinstallの時に重複してインストールされ、元々大きなnode_moduesを膨張させ続けることができます.
以上の理解に基づいて、プロジェクトが一定の複雑度に達すると、モジュールを区分することができますが、モジュール間の連絡が緊密で、monocompでコードを組織するのに適していると思います.
現在最も一般的なmonopoソリューションは、Lernaおよびyarnworkspaces特性である.この中で、lernaは独立したカバンで、その公式サイトの紹介は以下の通りです.
a tool that optimizes the workflow around maaging multi-package repositoris with git and npm.
上記のBabel、creat-react-apなどはlernaで管理しています.プロジェクトrepoにおいて、lerna.jsonでpackagesを宣言した後、lernaはプロジェクトに対して統一的なrepo依存インストール(lerna bootstrap)を提供し、統一的にpackage scripts(lerna run)を実行し、統一的なnpmリリース(lerna publish)などの特性を提供した.「依存爆発」の問題に対して、lernaはインストール依存時に--hoistオプションを提供しています.同じ依存で、repoルートディレクトリに「アップグレード」をインストールします.
具体的な使い方はLerna公式サイトに移ります.https://lerna.js.org
yarnをパケットマネージャとして使用する学生は、package.jsonにおいて、packagesをworkspacesフィールドで宣言することができ、yarnは、moorpoとしてpackagesを管理することができる.lernaに比べて、yarnが突出しているのは、packagesの相互依存、packagesの第三者への依存、yarnがsemver約束でdependenciesのバージョンを分析しています.インストール依存がより速く、占有体積がより小さいです.しかし、「統一ワークフロー」面での実現が欠けています.
yarn公式サイトはworkspaceの詳細について説明します.Workspaces Yarn
lernaとyarn-workspaceはその一つしか選べないわけではありません.多くのmonomore poはlernaを使ってまたpackage.jsonworkspacesを宣言します.このようにすれば、あなたのバッグマネージャがnpmであろうと、yarnであろうと、モノラックの強みを発揮できます.パッケージ管理がyarnなら、lernaは依存インストールをyarn処理に任せます.
もう一回私のプロジェクトに戻ります.インストールに依存した後、体積は本当に大きくて、二日間を苦しめました.最適化したいですが、大量の脚本はnpmに依存しています.
やはり後はゆっくりyarnに移りたいと思います.
Reference
  • babel/moorpo.md at master・babel/babel
  • EHOIST_ROOT_VERION warning hoisting question・Issue_・lerna/lerna
  • Others
    git-submodule
    Gitサブモジュールにより、現在のrepoに他のreposを含め、現在のrepoのサブディレクトリとして使用することができ、同時にrepos間の独立を維持することができる.
    #     repo        
    git submodule add [email protected]:xxx/xxx.git path/to/xxx
    .gitmoduleファイルでは、現在のrepoにはどのようなsubmoduleがあり、それぞれのnamebranchなどが見られます.
    # clone    submodule   repo  :
    #     git submodule   
    git submodule init
    #    submodule,    git pull  
    git submodule update
    サブモジュールファイルを修正した後、現在のrepoでgit statusを実行すると、特定のサブモジュールファイルではなく、モジュールがあるchangesのみが見られます.
    diff --git a/path/to/submodule b/path/to/submodule
    --- a/path/to/submodule
    +++ b/path/to/submodule
    @@ -1 +1 @@
    -Subproject commit xxxxxxx
    +Subproject commit xxxxxxx-dirty
    dirtyは、サブモジュールの修正がまだcomitではないことを示しています.サブモジュールの修正で、この変更は具体的なmit idになります.
    サブモジュールの他のcommitpullなどの各動作は、そのディレクトリの下で、普通のrepoで操作すれば良いです.
    Reference
  • Git-サブモジュール:
  • https://git-scm.com/book/zh/v...
  • man git-submodule
  • git submodules-Git diff says subproject is dirty-Stock Overflow
  • https://stackoverflow.com/que...
  • git-bisect
    gitには、問題の位置を二分法で助けるコマンドがあります.bisect.
    #         
    git bisect start
    #        
    git bisect bad
    #      commit   tag       
    git bisect good v1.0.0
    
    #    git   checkout          commit,
    #          :
    git bisect bad
    #         :
    git bisect good
    #    git   checkout    「   」 「   」    commit
    
    #        ,git    :xxxxxxx is first bad commit
    Reference
  • Gitを使ってデバッグする
  • https://git-scm.com/book/zh/v...
  • 私の購読番号に注目してください.「車のファンと私たち」は、フロントエンド、自動車、面白いことを不定期に共有しています.