apeescape2.com
  • メイン
  • モバイル
  • 投資家と資金調達
  • 技術
  • トレンド
モバイル

フロントエンドコードのMonoreposガイド

モノレポは議論のホットトピックです。最近、プロジェクトでこのタイプのアーキテクチャを使用する必要がある理由と使用しない理由について多くの記事がありますが、それらのほとんどは何らかの形で偏っています。このシリーズは、モノリポジトリをいつどのように使用するかを理解するために、可能な限り多くの情報を収集して説明する試みです。

に モノリポジトリ は建築の概念であり、基本的にそのタイトルにすべての意味が含まれています。複数のリポジトリを管理する代わりに、分離されたすべてのコード部分を1つのリポジトリ内に保持します。言葉を覚えておいてください 孤立 —monorepoにはモノリシックアプリとの共通点がないことを意味します。 1つのリポジトリ内にさまざまな種類の論理アプリを保持できます。たとえば、WebサイトとそのiOSアプリ。

モノレポ、シングルレポ、マルチレポの比較



この概念は比較的古く、約10年前に登場しました。 Googleは、コードベースを管理するためにこのアプローチを採用した最初の企業の1つでした。それが10年間存在していたのなら、なぜ今だけそんなにホットな話題なのかと疑問に思うかもしれません。ほとんどの場合、過去5〜6年の間に、多くのことが劇的な変化を遂げました。 ES6、SCSSプリプロセッサ、タスクマネージャー、npmなど。現在、小さなReactベースのアプリを維持するには、プロジェクトバンドラー、テストスイート、CI / CDスクリプト、Docker構成、および他に何を知っているかを処理する必要があります。そして今、小さなアプリの代わりに、多くの機能領域で構成される巨大なプラットフォームを維持する必要があると想像してください。アーキテクチャについて考えている場合は、主に2つのことを行う必要があります。関心の分離とコードの重複の回避です。

これを実現するには、大きな機能をいくつかのパッケージに分離してから、メインアプリの単一のエントリポイントを介してそれらを使用することをお勧めします。しかし、これらのパッケージをどのように管理しますか?各パッケージには独自のワークフロー環境構成が必要です。つまり、新しいパッケージを作成するたびに、新しい環境を構成したり、すべての構成ファイルをコピーしたりする必要があります。または、たとえば、ビルドシステムで何かを変更する必要がある場合は、各リポジトリを確認し、コミットを実行し、プルリクエストを作成して、ビルドごとに待機する必要があります。これにより、処理速度が大幅に低下します。このステップで、私たちはモノレポに会っています。

独自の構成を持つ多くのリポジトリを用意する代わりに、信頼できる唯一の情報源、つまり、1つのテストスイートランナー、1つのDocker構成ファイル、およびWebpackの1つの構成のみを使用します。そして、スケーラビリティ、関心の分離の機会、共通パッケージとのコード共有、および他の多くの長所がまだあります。いいですね。そうですね。しかし、いくつかの欠点もあります。野生でモノレポを使用することの正確な長所と短所を詳しく見てみましょう。

Monorepo Advantages:

  • すべての構成とテストを保存する1つの場所。 すべてが1つのリポジトリ内にあるため、CI / CDとバンドラーを一度構成してから、構成を再利用してすべてのパッケージをビルドしてから、リモートに公開できます。ユニット、e2e、統合テストについても同じことが言えます。CIは、追加の構成を処理しなくても、すべてのテストを起動できます。
  • アトミックコミットを使用してグローバル機能を簡単にリファクタリングします。 リポジトリごとにプルリクエストを実行して、変更をビルドする順序を特定する代わりに、対象の機能に関連するすべてのコミットを含むアトミックプルリクエストを作成する必要があります。
  • 簡素化されたパッケージ発行。 共有コードを持つ別のパッケージに依存するパッケージ内に新しい機能を実装することを計画している場合は、1つのコマンドでそれを実行できます。これは、いくつかの追加構成が必要な関数です。これについては、この記事のツールレビューの部分で後で説明します。現在、Lerna、Yarn Workspaces、Bazelなどの豊富なツールがあります。
  • より簡単な依存関係管理。 唯一 package.json 。依存関係を更新するたびに、各リポジトリに依存関係を再インストールする必要はありません。
  • 共有パッケージを分離したまま、コードを再利用します。 Monorepoを使用すると、パッケージを互いに分離したまま、他のパッケージからパッケージを再利用できます。リモートパッケージへの参照を使用して、単一のエントリポイントを介してそれらを利用できます。ローカルバージョンを使用するには、ローカルシンボリックリンクを使用できます。この機能は、bashスクリプトを介して、またはLernaやYarnなどの追加ツールを導入することで実装できます。

モノレポのデメリット:

  • アプリの一部にのみアクセスを制限する方法はありません。 残念ながら、モノリポジトリの一部のみを共有することはできません。コードベース全体へのアクセスを許可する必要があり、セキュリティ上の問題が発生する可能性があります。
  • 大規模なプロジェクトで作業する場合のGitのパフォーマンスが低い。 この問題はにのみ表示され始めます 巨大 100万を超えるコミットと数百の開発者が同じリポジトリで毎日同時に作業を行っているアプリケーション。 Gitは有向非巡回グラフ(DAG)を使用してプロジェクトの履歴を表すため、これは特に厄介になります。コミット数が多いと、履歴が深くなるにつれて、グラフをウォークするコマンドが遅くなる可能性があります。参照の数(つまり、ブランチやタグ、不要になった参照を削除することで解決可能)と追跡されるファイルの量(および、重いファイルの問題は次の方法で解決できますが、その重み)により、パフォーマンスも低下します。 LFSに行く )。

    注意: 現在、FacebookはVCSのスケーラビリティに関する問題を解決しようとしています Mercurialにパッチを適用する そして、おそらくすぐに、これはそれほど大きな問題にはならないでしょう。

  • ビルド時間が長くなります。 1つの場所に多くのソースコードがあるため、すべてのPRを承認するために、CIがすべてを実行するのにはるかに長い時間がかかります。

ツールレビュー

モノリポジトリを管理するためのツールのセットは絶えず成長しており、現在、モノリポジトリのさまざまな構築システムのすべてで迷子になるのは非常に簡単です。あなたはいつでも使用することによって人気のある解決策を知ることができます このレポ 。しかし今のところ、JavaScriptで最近頻繁に使用されているツールを簡単に見てみましょう。

  • バーゼル Googleのモノレポ指向のビルドシステムです。 Bazelの詳細: 素晴らしい-bazel
  • 糸 は、ワークスペースを介したモノリポジトリをサポートするJavaScript依存関係管理ツールです。
  • 学ぶ Yarn上に構築された複数のパッケージでJavaScriptプロジェクトを管理するためのツールです。

ほとんどのツールは非常によく似たアプローチを使用していますが、微妙な違いがあります。

monorepogitリポジトリの図

この記事のパート2はかなり大きなトピックであるため、Lernaワークフローと他のツールについて詳しく説明します。とりあえず、中身の概要を見てみましょう。

学ぶ

このツールは、セマンティックバージョンの処理、ビルドワークフローの設定、パッケージのプッシュなどに非常に役立ちます。Lernaの背後にある主なアイデアは、プロジェクトにパッケージフォルダーがあり、そこにすべての分離されたコードパーツが含まれていることです。また、パッケージの他に、たとえばsrcフォルダーに配置できるメインアプリがあります。 Lernaのほとんどすべての操作は、単純なルールで機能します。すべてのパッケージを反復処理し、パッケージバージョンの増加、すべてのパッケージの依存関係の更新、すべてのパッケージのビルドなど、いくつかのアクションを実行します。

Lernaでは、パッケージの使用方法について2つのオプションがあります。

  1. それらをリモート(NPM)にプッシュせずに
  2. パッケージをリモートにプッシュする

最初のアプローチを使用している間、パッケージにローカル参照を使用することができ、基本的にそれらを解決するためにシンボリックリンクを気にする必要はありません。

ただし、2番目のアプローチを使用している場合は、リモートからパッケージをインポートする必要があります。 (例:import { something } from @yourcompanyname/packagename;)、これは、パッケージのリモートバージョンを常に取得することを意味します。ローカル開発の場合、node_modules/内にあるパッケージを使用する代わりに、フォルダーのルートにシンボリックリンクを作成して、バンドラーにローカルパッケージを解決させる必要があります。そのため、Webpackまたはお気に入りのバンドラーを起動する前に、起動する必要があります lerna bootstrap 、すべてのパッケージを自動的にリンクします。

単一ノードパッケージ内のモジュールの名前空間の図

糸

Yarnは当初、NPMパッケージの依存関係マネージャーであり、当初はモノリポジトリをサポートするように構築されていませんでした。しかし、バージョン1.0では、 糸開発者 と呼ばれる機能をリリースしました ワークスペース 。リリース時にはそれほど安定していませんでしたが、しばらくすると本番プロジェクトで使用できるようになりました。

ワークスペース 基本的には独自のパッケージです package.json いくつかの特定のビルドルールを持つことができます(たとえば、個別の tsconfig.json プロジェクトでTypeScriptを使用する場合)。実際には、bashを使用してYarn Workspacesなしで管理でき、まったく同じセットアップが可能ですが、このツールは、パッケージごとの依存関係のインストールと更新のプロセスを容易にするのに役立ちます。

一目で、Yarnとそのワークスペースは次の便利な機能を提供します。

  1. シングルnode_modulesすべてのパッケージのルートにあるフォルダー。たとえば、packages/package_aがある場合およびpackages/package_b —独自のpackage.json —すべての依存関係はルートにのみインストールされます。これは、YarnとLernaの動作の違いの1つです。
  2. ローカルパッケージ開発を可能にする依存関係のシンボリックリンク。
  3. すべての依存関係に対する単一のロックファイル。
  4. 1つのパッケージのみの依存関係を再インストールする場合に備えて、焦点を絞った依存関係の更新。これは、-focusを使用して実行できます。国旗。
  5. レルナとの統合。 Yarnにすべてのインストール/シンボリックリンクを簡単に処理させ、Lernaに公開とバージョン管理を任せることができます。これは、手間がかからず、操作が簡単なため、これまでで最も人気のあるセットアップです。

便利なリンク:

  • 毛糸ワークスペース
  • TypeScriptモノリポジトリプロジェクトを構築する方法

バーゼル

Bazelは、多言語の依存関係を処理し、多くの最新言語(Java、JS、Go、C ++など)をサポートできる大規模アプリケーション用のビルドツールです。ほとんどの場合、中小規模のJSアプリケーションにBazelを使用するのはやり過ぎですが、大規模な場合は、そのパフォーマンスのために多くのメリットが得られる可能性があります。

Bazelは、その性質上、Make、Gradle、Maven、およびビルドルールとプロジェクトの依存関係の説明を含むファイルに基づいてプロジェクトをビルドできるその他のツールに似ています。 Bazelの同じファイルは 構築する Bazelプロジェクトのワークスペース内にあります。ザ・ 構築する ファイルはそのを使用します スターラーク 、Pythonによく似た、人間が読める高レベルのビルド言語。

通常、あなたは多くを扱うことはありません 構築する Webで簡単に見つけることができ、すでに構成されて開発の準備ができている定型文がたくさんあるからです。プロジェクトをビルドするときはいつでも、Bazelは基本的に次のことを行います。

  1. 負荷 インクルード 構築する ターゲットに関連するファイル。
  2. 分析 入力とその 依存関係 、指定されたビルドルールを適用し、 アクション グラフ。
  3. 実行します 最終的なビルド出力が生成されるまで、入力に対するビルドアクション。

便利なリンク:

  • JavaScriptとBazel –JS用のBazelプロジェクトを最初から設定するためのドキュメント。
  • BazelのJavaScriptおよびTypeScriptルール –JS用ボイラープレート。

結論

モノレポは単なるツールです。未来があるかどうかについては多くの議論がありますが、真実は、場合によっては、このツールがその仕事をし、効率的な方法でそれを処理するということです。過去数年の間に、このツールは進化し、柔軟性が大幅に向上し、多くの問題を克服し、構成の面で複雑なレイヤーを削除しました。

Gitのパフォーマンスの低下など、理解すべき問題はまだたくさんありますが、近い将来、これが解決されることを願っています。

アプリ用の堅牢なCI / CDパイプラインの構築方法を学びたい場合は、お勧めします GitLabCIを使用して効果的な初期デプロイメントパイプラインを構築する方法 。

関連: 強化されたGitフローの説明

基本を理解する

モノリシック建築とはどういう意味ですか?

ソフトウェア開発におけるモノリシックアーキテクチャとは、アプリケーションを緊密に結合されたコンポーネント/機能のセットとして1つのピースに構成するアプローチを意味します。アプリの範囲外のコンポーネントを使用することはできません。

css用のスケーラブルでモジュラーなアーキテクチャ

ソースコードリポジトリとは何ですか?

リポジトリは、インストール/開発するためのソースコードを保存および取得する場所です。リポジトリは、関連するメタデータとともにすべてのバージョンのデータを保存します。これにより、履歴の改訂や、同じプロジェクトの個別の並列バージョンでの作業が可能になります。

プログラミングにおいてモジュール性が重要なのはなぜですか?

疎結合コードは、他の場所で物事を壊すことを恐れずに変更を導入できるため、より信頼性が高いことが証明されています。これにより、開発がより安全になり、リファクタリングが簡素化されます。

シンボリックリンクとは何ですか?

シンボリックリンク(シンボリックリンク)は、実際のコンテンツではなく、相対パスまたは絶対パスの形式で元のフォルダー/ファイルを参照するファイルです。この場合、これらはパス名の適切な場所への解決に影響を与えるために使用されます。

JSでモジュールを作成する最も一般的な方法は何ですか?

最近、コードを個別のモジュールに分離する最も一般的な方法は、npmパッケージを使用することです(Yarnまたはnpmで実行できます)。それらは、独自の構成ファイルを含むフォルダーにラップされてから、リモートサーバーにプッシュされます。

バイオテクノロジー評価の特異性とベストプラクティス

財務プロセス

バイオテクノロジー評価の特異性とベストプラクティス
symfonyコンポーネントによる真の依存性注入

symfonyコンポーネントによる真の依存性注入

バックエンド

人気の投稿
同じマシンでのMySQLマスタースレーブレプリケーション
同じマシンでのMySQLマスタースレーブレプリケーション
TypeScript、依存性注入、Discordボットの操作
TypeScript、依存性注入、Discordボットの操作
3つの医療技術革新:より良い結果とより低いコストの推進
3つの医療技術革新:より良い結果とより低いコストの推進
Calabashを使用したAndroidおよびiOSUIテスト
Calabashを使用したAndroidおよびiOSUIテスト
Node.js / TypeScript REST APIの構築、パート2:モデル、ミドルウェア、およびサービス
Node.js / TypeScript REST APIの構築、パート2:モデル、ミドルウェア、およびサービス
 
最高のデータ視覚化ツールの完全な概要
最高のデータ視覚化ツールの完全な概要
機械学習理論とその応用の紹介:例を含むビジュアルチュートリアル
機械学習理論とその応用の紹介:例を含むビジュアルチュートリアル
AngularJS開発者が犯す最も一般的な18の間違い
AngularJS開発者が犯す最も一般的な18の間違い
GoogleスプレッドシートとAppsScriptの操作
GoogleスプレッドシートとAppsScriptの操作
自然言語処理アプリを構築する方法
自然言語処理アプリを構築する方法
人気の投稿
  • WordPressでAPIを使用する方法
  • バーチャルリアリティまたは拡張現実
  • macosはどの言語で書かれていますか
  • ブルームバーグターミナルの1か月あたりの費用はいくらですか
  • 剛体のダイナミクスチュートリアル
  • エンジェル投資家が求めるもの
  • クラウドベースのサービスにサブスクライブして、データを同期しました
カテゴリー
財務プロセス Uiデザイン プロジェクト管理 ヒントとツール エンジニアリング管理 Webフロントエンド ブランドデザイン その他 Uxデザイン 収益性と効率性

© 2021 | 全著作権所有

apeescape2.com