この一連の記事では、以下の仕様に従ってローバーソフトウェアを構築します 。 これにより、次のアプローチを実践できます。
- モノリシックリポジトリ-MonoRepo (モノリシックリポジトリ)
- コマンド/クエリの責任分離-CQRS (読み取りと書き込みの責任分離)
- イベントソーシング-ES (ソースとしてのイベント)
- テスト駆動開発-TDD (テストによる開発)
目次
まず、プロジェクトを初期化する必要があります。
リポジトリを作成
新しいgitリポジトリを作成することから始めましょう:
mkdir rover cd rover git init
Composerを使用するため、
composer.json
を作成します。
{ "name": "mars-rover/mars-rover", "license": "MIT", "type": "project", "description": "Mars Rover", "require": { "php": "^7.0" } }
リポジトリ内のサードパーティライブラリファイルを無視するには、
.gitignore
を追加します。
# Third Party libraries /vendor/
リポジトリの作成が完了したら、
composer
実行します。
composer install --optimize-autoloader
これは最初のコミットに十分です:
git add composer.json .gitignore git commit -m '0: Created project'
navigation
パッケージの作成
タスクの分解を見ると、タスクは
write-only
と
read-only
write-only
区別できることがわかります。
- ローバーを火星に着陸させる-
write-only
- ローバーの運転-
write-only
- ロケーションリクエスト-
read-only
CQRSの原則を遵守したいので、
read-only
別に
write-only
ロジックを配置し
write-only
。 着陸と運転はすべてナビゲーションに関連しているため、始めましょう。
git checkout -b 1-navigation mkdir -p packages/navigation cd packages/navigation
新しいパッケージの
composer.json
を作成します。
{ "name": "mars-rover/navigation", "license": "MIT", "type": "library", "description": "Mars Rover - Navigation", "autoload": { "psr-4": { "MarsRover\\Navigation\\": "src/MarsRover/Navigation" } }, "require": { "php": "^7.0" }, "require-dev": { "memio/spec-gen": "^0.6" } }
テストプラットフォームとしてphpspecを使用してみましょう。ほとんどのテストでは、 SpecGen拡張機能を使用します。 これを行うには、プロジェクト
phpspec.yml.dist
を作成します。
extensions: Memio\SpecGen\MemioSpecGenExtension: ~
注 :phpspecの詳細については、記事を参照してください 。
最後に、
.gitignore
ファイルを作成して、このパッケージの
git
を構成する必要があります。
# Configuration /phpspec.yml # Third Party libraries /vendor/ /composer.lock
これでパッケージの構成が完了し、
Composer
を実行できるようになりました。
composer install --optimize-autoloader
2回目のコミットでアクションを修正します。
git add -A git commit -m '1: Created Navigation package'
navigation
パッケージをプロジェクトに追加する
プロジェクトのルートに戻りましょう。
cd ../../
MonoRepoの利点の1つは、1つのコマンドですべてのパッケージでテストを実行できることです。 これを行うには、メインプロジェクトの
composer.json
ファイルに
navigation
への依存関係を記述する必要があります。
{ "name": "mars-rover/mars-rover", "license": "MIT", "type": "project", "description": "Mars Rover", "repositories": [ { "type": "path", "url": "./packages/*" } ], "require": { "mars-rover/navigation": "*@dev", "php": "^7.0" } }
デフォルトでは、
Composer
はPackagistのパッケージのみを検索します。 新しい
repositories
セクションを追加することにより、./packagesでもパッケージをローカルでチェックするように指示します。これにより、
require
セクションで見つかったパッケージを使用できます。
また、どのバージョンを使用するかをパッケージマネージャーに伝える必要がありますが、モノリポジトリではすべてのパッケージのバージョンが同じであるため、
*
(any)を使用します。 ただし、バージョンタグだけでなく、最新の変更を使用できるようにするには、優先する安定性(
@dev
)を指定する必要があります。
テストに
phpspec
を使用して
phpspec
ため、メインプロジェクトとそのプロジェクトにdev依存関係を配置します。
composer require --dev phpspec/phpspec:^3.0
phpspec
は、プロジェクトのルートでテストを検索します。
phpspec.yml.dist
を作成して、
navigation
パッケージの存在を報告する必要があります。
suites: navigation: namespace: 'MarsRover\Navigation' src_path: packages/navigation/src spec_path: packages/navigation
ローカル設定を無視するには、
.gitignore
も更新し
.gitignore
:
# Configuration /phpspec.yml # Third Party libraries /vendor/
ここにある!
Composer
を実行してから
phpspec
実行できます。
composer update --optimize-autoloader ./vendor/bin/phpspec run
これをすべてコミットしましょう:
git add -A git commit -m '1: Added navigation package to main project'
そしてmasterブランチで悪臭を放ちます:
git checkout master git merge --no-ff 1-navigation
おわりに
Composer
を使用すると、同じリポジトリ内に多くのレイアウトを作成でき、
MonoRepo
アプローチを使用して、1つのコマンドですべてのテストを実行できます。
次は何ですか
次の記事では、「火星へのローバーの着陸」タスクの内部部分を扱い、 イベントソーシングとTDDの操作の例を示します。
前: ローバー、はじめに
次のパート: ローバー、着陸