Марсохід, Ініціалізація



У цій серії статей ми будуємо програмне забезпечення марсохода в відповідно з наступними специфікаціями. Це дозволить застосувати на практиці такі підходи:

  • Monolithic Repositories — MonoRepo (Монолітні репозиторії)
  • Command/Query Responsibility Segregation CQRS (Сегрегація відповідальності на читання і запис)
  • Event Sourcing — ES (Події як джерело)
  • Test Driven Development — TDD (Розробка через тестування)
ЗмістМарсохід, Введення
Марсохід, Ініціалізація

Спочатку нам потрібно ініціалізувати наш проект.

Створення репозиторію
Давайте почнемо з створення нового git-репозиторію:

mkdir rover
cd rover
git init

Оскільки ми збираємося використовувати Composer, створимо
composer.json
:

{
"name": "mars-rover/mars-rover",
"license": "З",
"type": "project",
"description": "Mars Rover",
"require": {
"php": "^7.0"
}
}

Додамо
.gitignore
для ігнорування файлів сторонніх бібліотек в репозиторії:

# Third Party libraries
/виробника/

Закінчивши з створенням репозиторію, запустимо
composer
:

composer install --optimize-autoloader

Цього буде достатньо для першого коміта:

git add composer.json .gitignore
git commit -m '0: Created project'

Створення
navigation
-пакета
Подивившись на декомпозицію задачі, ми побачимо, що завдання можна виділити в
write-only
та
read-only
:

  1. Посадка ровера на Марс —
    write-only
  2. Водіння ровера —
    write-only
  3. Запит розташування —
    read-only
Оскільки ми хочемо дотримуватися принципу CQRS, наприклад
write-only
логіку окремо від
read-only
. Посадка і водіння — це все про навігацію, тому почнемо з нього:

git checkout -b 1-navigation
mkdir -p packages/navigation
cd packages/navigation

Створюємо
composer.json
для нового пакету:

{
"name": "mars-rover/navigation",
"license": "З",
"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 дивіться статтю.
Нарешті, нам потрібно налаштувати
git
для цього пакета шляхом створення
.gitignore
файл:

# Configuration
/phpspec.yml

# Third Party libraries
/виробника/
/composer.lock

На цьому ми закінчили конфігурування нашого пакету, і тепер можемо запустити
Composer
:

composer install --optimize-autoloader

Зафіксуємо наші дії у другому коммите:

git add -A
git commit -m '1: Created Navigation package'

Додати
navigation
-пакету в проект
Повернемося до кореня проекту:

cd ../../

Одним з переваг MonoRepo є можливість виконувати тести всіх пакетів однією командою. Для цього нам потрібно прописати залежність від
navigation
на
composer.json
файлі нашого основного проекту:

{
"name": "mars-rover/mars-rover",
"license": "З",
"type": "project",
"description": "Mars Rover",
"repositories": [
{
"type": "path",
"url": "./packages/*"
}
],
"require": {
"mars-rover/navigation": "*@dev",
"php": "^7.0"
}
}

За замовчуванням
Composer
шукає пакети тільки в Packagist. Додавши нову секцію
repositories
ми говоримо йому перевірити наявність пакетів ще і локально в
./packages
, що дозволяє нам використовувати знайдені пакети в секції
require
.

Також нам потрібно повідомити менеджеру пакетів яку версію ми би хотіли, але у монорепозитории всі пакети мають однакову версію, тому ми просто використовуємо
*
(будь-яка). Але щоб мати можливість використовувати останні зміни, не тільки з тегами версій, нам необхідно вказати бажану стабільність (
@dev
).

Ну і раз вже ми використовуємо
phpspec
для наших тестів, поставимо дів-залежність в основному проекті і на нього:

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
:

# Configuration
/phpspec.yml

# Third Party libraries
/виробника/

Ось воно! Тепер ми можемо запустити
Composer
, потім
phpspec
:

composer update --optimize-autoloader
./vendor/bin/phpspec run

Закоммитим все це:

git add -A
git commit -m '1: Added navigation package to main project'

І смерджимся з майстер-гілкою:

git checkout master
git merge --no-ff 1-navigation

Висновок
C
Composer
ми можемо створювати багато макетів всередині одного репозиторію, а застосовуючи підхід
MonoRepo
— запускати всі тести однією командою.

далі
У наступній статті ми займемося внутрішньою частиною завдання «Посадка ровера на Марс», продемонструвавши приклад роботи Event Sourcing і TDD.

Попередня частина: Марсохід, Введення
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.