言語のためのスタンドアロン IDE を構築する
導入
スタンドアロン IDE とは、特定の業務目的に必要な要素のみを含む、機能を絞り込んだ IDE のことです。スタンドアロン IDE は、エンドユーザーに DSL を配布する便利な方法を提供します。ユーザーは、専用 IDE の快適な環境で、言語設計者が用意した IDE サポート、リファクタリング、コード分析などの機能をすべて利用して言語を使用できます。言語設計に関連する煩雑な機能や不要な言語はすべて排除されています。
言語の設計が完了したら、MPS は、これらのドメイン固有言語を使用するために必要な要素のみを含む、MPS の簡略版を作成できます。MPS のさまざまな要素を削除またはカスタマイズすることで、特定のユーザーグループに合わせたユーザーエクスペリエンスを提供できます。この記事では、その方法について説明します。
特に、MPS の以下の側面をカスタマイズできます。
さまざまなアイコン、スローガン、スプラッシュスクリーン、イメージ
ヘルプ URL
ユーザーが利用できる一連の言語
MPS で利用可能なプラグインのセット
プロセスの概要
MPS のカスタム RCP バージョンをビルドするには、いわゆるビルドスクリプトを含むソリューションを作成する必要があります。ビルドスクリプトは、RCP アプリケーション(および MPS プラグイン)のビルドに最適化されている MPS ビルド言語で記述されています。このビルドスクリプトのジェネレーターを実行すると、MPS は実際の RCP ディストリビューションを作成する ant ファイルを生成します。
サンプル RCP ビルドの構築
このドキュメントでは、MPS ディストリビューションに同梱されているロボット Kaja サンプル用の RCP ビルドスクリプトの開発について説明します。MPS でプロジェクトを開き、ここに記載されている手順に従ってください。
ソリューションとビルドスクリプトの作成
ウィザードの方法
必要なビルドスクリプトを作成するための望ましい方法は、現在のプロジェクトでソリューション構築ウィザードを実行することです。プロジェクトビューツールウィンドウから起動します。

ウィザードは、スクリプトを保持し、必要なインポートと使用言語を設定するための新しいソリューションとモデルを作成します。新しいソリューションを作成する代わりに、既存のソリューションまたはモデルを再利用するようにウィザードに指示できます。


次に、3 つの使用可能なオプションからスタンドアロン IDE オプションを選択する必要があります。

ウィザードの最後のページでは、IDE に組み込まないモジュールの選択を解除します。通常は、サンドボックスモジュールをスキップし、言語、プラグイン、ランタイムソリューションはそのまま残します。

新しいソリューションはプロジェクトビューにリストされ、3 つのルートノード (そのうち 2 つは新しいビルドスクリプト) が保持されるはずです。

依存関係も適切に設定されています。


生成されたビルドスクリプトを正しく動作させるには、いくつかの変更が必要です。その一つは、汎用 MPS ディストリビューションをダウンロードし、ドライブ上で解凍して、生成された両方のビルドスクリプトの mps_home マクロを、解凍した汎用ディストリビューションのフォルダーに指定することです。

次に、エディターが次のような問題を報告した場合:

実際の依存関係を再ロードしてスクリプトを更新するインテンションをトリガーする必要があります。

ここでの言語ランタイムにはイメージが付属しているため、ビルドスクリプトによって作成される言語プラグインにイメージを適切にパッケージ化する必要があります。

次に、ビルドモデルを再構築し、後のセクションで説明するようにビルドスクリプトを実行してみてください。

手動による方法
あるいは、スクリプトを手動で作成することもできます。その場合は、新しいモデルを含む新しいソリューションを作成する必要があります。モデルで使用する言語を設定します。
jetbrains.mps.build
jetbrains.mps.build.mps
jetbrains.mps.build.startup
また、jetbrains.mps.ide.build モデルを依存関係にインポートします。これで、モデル内に新しいビルドプロジェクトを作成できます(名前が分かりにくいですが、実際には新しいビルドプロジェクトではなく、ビルドスクリプトです)。

ビルドスクリプトの調査
ビルドスクリプトにはいくつかのセクションが含まれており、空のビルドスクリプトでは次のセクションを確認できます。

ビルドスクリプトのさまざまなセクションを見てみましょう。
ベースディレクトリベースディレクトリは、他のすべてのパスの絶対パスを定義します。デフォルトでは、このディレクトリに ant ファイルが生成され、実行されます。また、ビルドスクリプトから参照するには、MPS モジュール記述子ファイルをこのフォルダーまたはそのサブフォルダーに配置する必要があります。
プラグインの使用ビルド言語自体は、ビルドスクリプトプラグインを介して拡張できます(ただし、これらは MPS 自体を構成するプラグインではありません。これらは後で設定します)。これらのプラグインは、追加のビルド言語構文を提供します。通常、Java コンパイルと MPS 生成タスクを指定するには、java プラグインと mps プラグインが必要です。以下では、これらのプラグインが提供する構文を使用します。jetbrains.mps.build.mps.tests で利用可能な module-tests プラグインを使用すると、ビルドスクリプトからテストを実行できます。
マクロマクロは基本的に名前と値のペアです。マクロのセクションでは、これらの名前が定義され、値が割り当てられます。ビルドスクリプトの残りの部分では、これらのマクロ変数が使用されます。MPS は 2 種類のマクロをサポートしています。var マクロは文字列であり、任意の値を割り当てることができます。folder マクロは、上記で定義されたベースディレクトリからの相対パスを表し、他のマクロに基づいています。MPS では、folder マクロのパスコンポーネントにコード補完が提供されることに注意してください。
依存関係このセクションでは、他のビルドスクリプトへの依存関係を定義します。MPS には、ビルドスクリプトのセット (buildStandalone、buildWorkbench、buildMPS など) がバンドルされています。これらのいずれかに依存関係を設定することで、参照先のビルドスクリプトで定義されている構造を、参照元のビルドスクリプトで使用できるようになります。例: 参照先のビルドスクリプトで定義されているマクロを使用できます。
プロジェクト構造このセクションでは、構築する RCP アプリケーションの実際の内容を定義します。そのようなコンテンツは MPS モジュール(言語、ソリューション、devkits)、Java ライブラリ、IDEA ブランディングおよびプラグインかもしれません。
デフォルトレイアウトこのセクションは出力されるファイルを定義し、新しい RCP ディストリビューションのディレクトリ、ファイルと JAR 構造を作成します。これは、プロジェクト構造セクションおよびこれが依存する他のビルドスクリプトで定義されているアーティファクトを参照して含めます。
ウィザードは 2 つのビルドスクリプトを作成しました。それぞれのスクリプトは異なる目的を持っています。
Kajak- モジュールを生成し、生成されたソースをコンパイルして、IDEA プラグインにパッケージ化します (IntelliJ IDEA プラットフォーム用のプラグイン)
KajakDistribution - Kajak によって作成されたアーティファクトからプラットフォーム固有のディストリビューションを作成します
ビルドスクリプトを編集する
まずは Kajak のビルドスクリプトに注目してみましょう。
生成されたビルドスクリプトの名前
各 MPS ビルドスクリプトから生成する ant xml ファイルのデフォルト名は build.xml です。複数のビルドスクリプト間の衝突を避けるために、名前を変更することをお勧めします。


ベースディレクトリ
ビルドスクリプトが生成されるディレクトリを指定します。デフォルトはプロジェクトのディレクトリです。
プラグインを使う
ビルド言語は、その機能をプラグインにパッケージ化しています。ビルドスクリプトで使用されるプラグインは、その使用プラグインセクションにリストされています。
java - Java ソースをコンパイルする機能を含みます
mps - MPS モデルを生成する機能を含みます
module-tests - ビルドスクリプトでテストを実行する機能を追加します (jetbrains.mps.build.mps.tests 言語をインポートする必要があります)
ウィザードはすでに java と mps を設定しています。
マクロ
スクリプト全体で再利用できるマクロをいくつか定義する必要があります。最初の 2 つはビルドで使用する文字列変数を表します。mps_home フォルダーのマクロは、MPS の汎用ディストリビューション版を解凍したディレクトリを指します。これらのフォルダーはすべてベースディレクトリからの相対パスになっていることに注意してください。
マクロは未定義のまま(つまり、名前だけを指定)にしておき、プロジェクト設定ダイアログの MPS パス変数セクションで定義するか、プロパティ定義を使用して ant を呼び出す際に定義することができます。
依存関係
次に、依存関係を定義します。依存関係とは、このスクリプトが依存する他のビルドスクリプトやプラットフォームを示すものです。
必要な依存関係は mpsStandalone (スタンドアロンの MPS インストールの最小限のセットを表します) と、オプションでスタンドアロン IDE でビルドスクリプトを作成できるようにする mpsMakePlugin、mpsDebuggerPlugin (ロボット Kaja サンプルではデバッガーと Java 実行の統合が必要なため)、および mps ExecutionPlugin (ロボット Kaja サンプル言語の 1 つが実行フレームワークを使用して外部実行可能ファイルを実行するため) です。ほとんどの RCP はおそらく mpsStandalone のみを使用するでしょう。
アーティファクトの場所は、アーティファクトのコピー元を指定します。ビルドスクリプトは、既存の汎用 MPS インストールからコードをコピーすることで動作するため、MPS ソースをチェックアウトする必要はありません。アーティファクトの場所は MPS ホームディレクトリを指す必要があります。
プロジェクト構造
ビルドスクリプトのプラグインの使用セクションで指定されたプラグインは、ここで利用可能なオプションに影響します。java、mps、module-tests プラグインを有効にすると、以下のオプションが利用可能になります。
ジェネレーターオプション - ジェネレーターを設定する
アイデアブランディング - アイコン、スプラッシュスクリーン、URL、イメージなどのスタンドアロン IDE の視覚的側面を設定します。
アイデアプラグイン - 生成されたアーティファクトを基盤となる IntelliJ IDEA プラットフォームにフックするための情報の詳細
Java ライブラリ - グループ化された瓶やクラスは、一つの単位として参照できます。
Java モジュール - Java ソースをグループ化して、単位として参照できるようにする
Java オプション - java コンパイラープロセスを設定します
mps グループ - MPS モジュール(ソリューション、言語、開発キット)をグループ化し、一つの単位として参照できるようにします。
ソリューション - ソリューションを表します
language - 言語を表します
devkit - devkit を表します
ヒントとコツ - さまざまなヒントの説明を新しい IDE にどのようにバンドルするかを定義します
アイデアブランディング
プロジェクト構造では、まずブランディングから始めます。アイデアブランディングセクションでは、あらゆる種類のアイコンやスプラッシュスクリーンなどの定義をサポートしています。MPS ディストリビューションからイメージを取得し、サイズと透明度の値を維持しながら、ニーズに合わせてイメージを修正することをお勧めします。Version プロパティには構造化された値が保持されていることに注意してください。ヘルプファイルや更新 Web サイトを指定することもできます。

Kaja サンプルプロジェクトでは、MPS アイコンを ./icons フォルダーにコピーしました。
アイデアプラグイン
次に、バンドルする言語とソリューションを含むアイデアプラグインを定義します。アイデアプラグインは、 MPS が構築されている IDEA プラットフォームへのプラグインです。

名前とバージョン、他のプラグインへの依存関係、実際のコンテンツを定義できます。RCP に言語が含まれる場合は、BaseConcept や INamedConcept インターフェースなどを提供する jetbrains.mps.core が必要になります。コンテンツの Kajak エントリは、以下で定義されている mps グループへの参照です。mps グループは、MPS アーティファクトのグループです。mps ビルドスクリプトプラグイン (ビルドスクリプトの最上部) を含めているため、MPS 固有の言語構造を使用できます。mps グループはその一例です。
MPS グループ
Kajak グループを見てみましょう。このグループは、一連の言語とソリューションを参照します。言語参照は、MPS プロジェクトで定義された言語を指します。グループ内の言語参照は、名前(実際の言語名と同じである必要があります)と、対応する mpl ファイルへのポインタで構成されます。最も簡単な入力方法は、mpl ファイルへのパスから始め、次にファイルインテンション (Alt+Enter) から必要な情報を読み込む機能を使用して参照名を調整することです。

グループには、すべての言語の推移閉包が含まれている必要があることに注意してください。たとえば、言語 A が別の言語 B を参照している場合、B もグループに含める必要があります。これは、そうしないと依存関係を解決できないため、結果として得られる RCP アプリケーションが実行されないためです。言語が欠落している場合は、ビルドスクリプトでエラーが報告されます (赤い波線)。必要な言語を追加した後、エラーが発生した言語に対して、ファイルインテンション (Alt+Enter) から必要な情報を読み込む処理を再度実行して、変更があったことを言語に認識させる必要がある場合があります。
言語に加えて、ソリューション構成要素を使用してソリューションを参照したり、devkit 構成要素を使用して devkit を参照したりすることもできます。
デフォルトレイアウト
このレイアウトは、RCP ディストリビューションのディレクトリ構造とファイル構造を構築します。様々なソース、特に前節で説明したプロジェクト構造からファイルをコピーします。必要に応じて、これらのファイルをコンパイル、ビルド、パッケージ化します。また、このスクリプトが依存する他のビルドスクリプトで定義されたアーティファクトを参照することもできます。

まず、次のコードから始めます。

これら 3 つのインポートは、参照先の mpsStandalone ビルドスクリプト内のフォルダーとファイルの要素です。これらをインポートすることで、これらのフォルダーの内容が RCP ディストリビューションにコピーされます。
ウィザードには、bin フォルダーを作成し、共通の構成ファイルとプロパティファイルをそのフォルダーにコピーするコードが追加されています。さらにカスタマイズすることも、そのままにしておくこともできます。

次に、新しいフォルダー lib を作成し、そこに mpsStandalone::lib から MPS ソースと既存の branding.jar (デフォルトの MPS スプラッシュ画面やその他のブランディングアセットが含まれています) を除くすべてのコンテンツをインポートします。その後、新しい jar ファイル branding.jar (この名前でないと動作しません。IDEA プラットフォームはこの名前を想定しています) を作成し、上記で定義したプロジェクト構造の branding セクションで定義されているすべてのファイルをそこに配置します。

次に、plugins フォルダーを作成します。mps -core プラグインはどの RCP アプリにも必須なので、必ずインポートする必要があります。次に、mpsStandalone ビルドスクリプトで定義されている様々なバージョン管理プラグイン(SVN および Git)をインポートします。当然のことながら、スタンドアロンの Kaja IDE にはバージョン管理サポートが必要なので、これらのプラグインをインポートするのは理にかなっています。

次に、上記のプロジェクト構造で定義されている Kajak プラグインを統合します。プラグイン構造を使用して、その完全な定義をインポートします。
ウィザードが自動的に行わないことの一つは、プラグイン内部で、様々なライブラリ jar ファイルを含むサブディレクトリを定義することです。これらの jar ファイルは、プラグインのクラスパスに自動的に追加されます。ファイル構造を使用して、先に定義したマクロを用いて、様々なファイルをプラグインディレクトリにコピーします。
このプラグインには、コピーした jar だけでなく、必要なすべての言語アーティファクトも含まれていることに注意してください。これは、これらの mps グループを定義し、プラグインから参照することで実現されています。これらの mps グループを使用できるのは、mps ビルド言語プラグインのおかげです。MPS アーティファクトを直接サポートし、必要なすべてのファイルとメタデータが自動的に処理されます。
プロパティファイル
最後に、実行中の RCP アプリケーションで使用されるメタデータを含む build.number というプロパティファイルを作成します。これは、基盤となる IntelliJ プラットフォームで必要とされるファイルです。

次に、スクリプトはビルド番号の値を build.txt ファイルに挿入します。

ヒントとコツ
MPS をベースに構築されたすべてのスタンドアロン IDE は、ユーザーがツールに慣れるのに役立つヒントを提供する「ヒントとコツ」ダイアログをユーザーに提供できます。

MPS のヒントとコツの内容はカスタマイズ可能です。これは、ビルドスクリプトのヒントとコツの概念を使用して行うことができます。

ヒントは、MPS 一般ディストリビューション物から再利用することも、ディレクトリまたはソリューションからインポートすることもできます。

最初のオプションは、ディストリビューションにすべての MPS のヒントを追加するだけです。これは、ビルドスクリプトウィザードで生成されたビルドスクリプトのデフォルトオプションです。
2 つ目は、正しいヒントの構造を持つ手動で作成されたフォルダーを必要とします。目的の構造は、mps-tips.jar ファイル自体から取得できます。すべての HTML ファイルに加えて css と image フォルダーを含むフォルダーを必要とします。
最後のオプションでは、MPS 自体の jetbrains.mps.build.tips および jetbrains.mps.core.xml 言語を使用してヒントを定義できます。
最後に、ヒントをビルドスクリプトのレイアウトに含めて lib フォルダーに配置する必要があります。ウィザードで生成されたビルドスクリプトでは、MPS のヒントとコツはデフォルトで lib フォルダーにパッケージ化されます。

ヒントとコツの言語
ソリューションからヒントとコツをインポートするには、モデルを使用してソリューションを作成し、モデルの使用言語に言語 jetbrains.mps.build.tips と jetbrains.mps.core.xml を追加します。その後、MPSTipsAndTricks の概念のインスタンスを作成して、そこに複数のヒントを作成することができます。各ヒントは HTML 形式のテキストです。各ヒントに 1 つのイメージを追加できます。

ソリューションからビルドスクリプトヒントとコツへのインポートは、ソリューションと MPSTipsAndTricks の概念から生成された xml を指すことによって行われます。

プラットフォーム固有のディストリビューションの作成
この時点で生成されたディレクトリ構造は、プラットフォームに依存しない、簡素化された MPS ディストリビューションの中核部分を構成し、カスタムブランディングを含む、設定したすべてのアーティファクトが含まれています。ただし、プラットフォーム固有の要素がまだ欠落しているため、実行することはできません。
2 番目に生成されたビルドスクリプトである KajakDistribution を見てみましょう。

このビルドスクリプトは、プラットフォームに依存しないアーティファクトをプラットフォーム固有のディストリビューションに適切にパッケージ化するために、Kajak ビルドスクリプトに依存しています。mps_home マクロは汎用 MPS インストールを指しています。これは、単一プラットフォーム (macOS、Linux、Windows) を対象としたディストリビューションでは、他のプラットフォームで必要なアーティファクトが欠落する可能性があるためです。汎用ディストリビューションは、MPS Web サイトからもダウンロードできます。
生成されたビルドスクリプトは、複数のプラットフォーム向けのディストリビューションを作成し、パッケージ化します。MPS には、Windows、macOS、Linux 用のネイティブバイナリランチャーが含まれています。これらのランチャーは、スクリプトベースのランチャーよりも堅牢で便利な方法で MPS を起動できます。たとえば、アプリケーションをタスクバーやスタートメニューにピン留めすることができます。
ネイティブランチャーのアイコンをカスタマイズする
ビルドスクリプトウィザードは、適切に設定されたネイティブランチャーを含むビルドスクリプトを作成します。ビルドスクリプトで指定されたアイコンも適切に設定されます。ただし、Windows では、以下のアイコンをカスタマイズするために追加の作業が必要です。
タスクバー
タスク Bar のツールチップ
ファイルエクスプローラー
タスクスイッチャー
タスクマネージャー
カスタム IDE のネイティブランチャーを識別するために使用します。そうでない場合は、標準の MPS アイコンが表示されます。
Windows のファイルマネージャー、タスクマネージャー、その他前述の場所で使用されるアイコンは、Windows によって .exe ファイル自体から取得されます。タスクマネージャーで使用されるプロセスのテキスト説明も同様です。
rcedit ユーティリティは、.exe ファイル内のリソースを編集するために使用できます。これらの Windows の場所すべてのアイコンを変更するには、rcedit ユーティリティを入手し、次のコマンドを実行する必要があります。
$ rcedit mps64.exe --set-icon "path-to-ico"
ここで mps64.exe は、アイコンをカスタマイズする実行可能ファイルのパスを指します。rcedit は GitHub リポジトリ(英語)から入手できます。特に Windows 用の rcedit 実行可能ファイルはここから(英語)入手できます。
レガシービルドスクリプトにネイティブランチャーを追加する
MPS 起動スクリプト
ウィザードによって作成される 3 番目のビルドファイルは、MpsStartupScript のインスタンスです。IDE の起動方法を詳細に記述しています。
使用するブランド情報
ブートクラスのパス
vm オプション

ビルドスクリプトの生成と実行
ビルドスクリプトにエラーがないと仮定すると、エラーを生成できます(モデルの再構築または Ctrl-F9)。これにより、各ビルドスクリプトの上部で定義されている名前が設定された 2 つの ant ファイルが作成されます。
この myBuild.xml (この場合)は、プロジェクトディレクトリに直接存在します。ファイルは、コマンドラインから(ant -buildfile myBuild.xml を使用して)実行することも、MPS 内から直接(プロジェクトエクスプローラーのビルドスクリプトのコンテキストメニューを介して)実行することもできます。

生成されたディレクトリ構造の確認
両方のビルドスクリプトを実行します。次の図は、ビルドスクリプトを実行した後のプロジェクト構造を示しています。特に、build/artifacts ディレクトリ内には、ビルドスクリプトのデフォルトのレイアウトセクションで定義された構造が作成されています。


ディレクトリとファイル構造を参照して、表示されているものをビルドスクリプトの定義に接続することをお勧めします。
JDK の設定
MPS を実行するには JDK が必要です。スタンドアロン IDE も同様です。理想的には、MPS ディストリビューションに含まれる JetBrains JDK (汎用版ではない) を使用し、$MPS_HOME/jbr フォルダーで実行してください。JetBrains JDK を IDE と一緒にディストリビューションする場合は、ビルドスクリプトを使用するか、手動で MPS jbr をスタンドアロン IDE にコピーしてください。
起動すると、スタンドアロン IDE のランチャーは、次の場所をこの順序でテストして JDK が存在するかどうかを確認します。次に、最初に見つかった JDK を使用して IDE を実行します。
Windows の場合:
MPS_JDK 環境変数
mps64.exe.jdk システムプロパティ
..\jbr フォルダー(JetBrains JDK が IDE にバンドルされていると仮定)
JDK_HOME 環境変数
JAVA_HOME 環境変数
Linux の場合:
MPS_JDK 環境変数
.../mps.jdk、.../jbr、.../jbr-x86 フォルダー(JetBrains JDK が IDE にバンドルされている場合、これらのフォルダーのいずれか)
JDK_HOME 環境変数
JAVA_HOME 環境変数
システムの定義済み Java ディストリビューションセットアップの $PATH の場所に「java」
macOS の場合:
システムの定義済み Java ディストリビューションセットアップの $PATH の場所に「java」
スタンドアロン IDE での信頼プロジェクトダイアログ
IntelliJ ベースの IDE でプロジェクトを開くと、開かれているプロジェクトの一部である有害なコードが実行される可能性があることをユーザーに警告するために、プロジェクトを信頼するダイアログがプラットフォームに追加されました。
MPS 2022.2 以降、MPS および MPS ベースのスタンドアロン IDE の両方で、2 つのボタンからなるプロジェクトを信頼するダイアログが有効になっています。ビルドスクリプトウィザードは、スタンドアロン IDE でこの新しいダイアログを有効にする機能です。
スタンドアロンの MPS ベースの IDE でプロジェクトを信頼するダイアログを無効にするには、起動ビルドスクリプトまたは「vmoptions」構成ファイルで、-Didea.trust .disabled=true vm オプションを使用します。
関連ページ:
プロジェクトのセキュリティ
潜在的なセキュリティリスクを防ぐために、MPS では、プロジェクトのソースがわからない場合にプロジェクトを開く方法を決定できます。MPS は、オープニングプロセス中に実行されるタスクまたは構成について警告し、信頼できるソースを構成できるようにします。不明なソースからプロジェクトを開く:プロジェクトを開くと、MPS を使用すると、未知ソースコードを含むプロジェクトの処理方法をすぐに決定できます。プロジェクトを初めて開くたびに、IDE にプロジェクトを信頼ダイアログが表示されます。これは、プロジェ...
MPS 言語プラグインの構築
言語セットを作成し、それを対象ユーザーが利用できるようにしたいと考えています。このドキュメントでは、言語セットを、それらが依存するランタイムと一緒に、有効な MPS プラグインにパッケージ化する方法について説明します。注: MPS に付属の JavaExtensionsSample サンプルプロジェクトには、サンプルの Java 拡張機能をビルドしてプラグインにパッケージ化するための完全に機能的なビルドスクリプトが含まれています。そこからインスピレーションを受けることができます。出発点:言語の...
ブートストラップ依存関係の問題の除去
定義::いつでもそれ自体を使用する言語または、ある言語を使用するソリューションであり、その言語が機能するために同じソリューションを必要とする(つまり、間接的または直接的に依存している)ソリューション。ブートストラップ依存関係の問題があります。なぜこれが問題なのですか:ビルドスクリプトを使用してプロジェクト全体をゼロから再構築することはできません、生成されたアーティファクトを VCS リポジトリに保持する必要があります、このブートストラップ依存関係サークルは、プロジェクトが完全に一から再構築され...