Monorepo——大規模先端項目のコード管理方式
4423 ワード
最近はプロジェクトを引き継いでいますが、コード量が多くて、ちょっと複雑です.仓库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級ディレクトリの内容は足場を中心としており、主な内容は
悪いところは主にrepoの体積が大きいです.特に、各packageは理論的には独立しているので、各packageは自分のdependenciesを維持していますが、大きな可能性があります.packageの間には多くの同じ依存があります.これは
以上の理解に基づいて、プロジェクトが一定の複雑度に達すると、モジュールを区分することができますが、モジュール間の連絡が緊密で、monocompでコードを組織するのに適していると思います.
現在最も一般的なmonopoソリューションは、Lernaおよび
a tool that optimizes the workflow around maaging multi-package repositoris with git and npm.
上記のBabel、creat-react-apなどはlernaで管理しています.プロジェクトrepoにおいて、
具体的な使い方はLerna公式サイトに移ります.https://lerna.js.org
yarnをパケットマネージャとして使用する学生は、
yarn公式サイトは
lernaとyarn-workspaceはその一つしか選べないわけではありません.多くのmonomore poはlernaを使ってまた
もう一回私のプロジェクトに戻ります.インストールに依存した後、体積は本当に大きくて、二日間を苦しめました.最適化したいですが、大量の脚本は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間の独立を維持することができる.
サブモジュールの他の
Reference Git-サブモジュール: https://git-scm.com/book/zh/v... git submodules-Git diff says subproject is dirty-Stock Overflow https://stackoverflow.com/que... git-bisect
gitには、問題の位置を二分法で助けるコマンドがあります. Gitを使ってデバッグする https://git-scm.com/book/zh/v... 私の購読番号に注目してください.「車のファンと私たち」は、フロントエンド、自動車、面白いことを不定期に共有しています.
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および
yarn
のworkspaces
特性である.この中で、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 Yarnlernaとyarn-workspaceはその一つしか選べないわけではありません.多くのmonomore poはlernaを使ってまた
package.json
でworkspaces
を宣言します.このようにすれば、あなたのバッグマネージャがnpmであろうと、yarnであろうと、モノラックの強みを発揮できます.パッケージ管理がyarnなら、lernaは依存インストールをyarn処理に任せます.もう一回私のプロジェクトに戻ります.インストールに依存した後、体積は本当に大きくて、二日間を苦しめました.最適化したいですが、大量の脚本はnpmに依存しています.
やはり後はゆっくりyarnに移りたいと思います.
Reference
git-submodule
Gitサブモジュールにより、現在のrepoに他のreposを含め、現在のrepoのサブディレクトリとして使用することができ、同時にrepos間の独立を維持することができる.
# repo
git submodule add [email protected]:xxx/xxx.git path/to/xxx
.gitmodule
ファイルでは、現在のrepoにはどのようなsubmoduleがあり、それぞれのname
、branch
などが見られます.# 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になります.サブモジュールの他の
commit
、pull
などの各動作は、そのディレクトリの下で、普通のrepoで操作すれば良いです.Reference
man git-submodule
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