mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2025-12-22 01:20:46 +00:00
docs(readme): обновить структуру и содержание README.md, улучшить оформление (#27)
Co-authored-by: petrovyuri <petrovyuri@example.com>
This commit is contained in:
4
.github/pull_request_template.md
vendored
4
.github/pull_request_template.md
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
<!-- markdownlint-disable MD033 -->
|
||||||
|
<!-- markdownlint-disable MD041 -->
|
||||||
## Ссылка на задачу или issue (обязательно)
|
## Ссылка на задачу или issue (обязательно)
|
||||||
<!--- https://tracker.yandex.ru/XXX -->
|
<!--- https://tracker.yandex.ru/XXX -->
|
||||||
|
|
||||||
@@ -5,6 +7,7 @@
|
|||||||
<!--- Напишите здесь какую проблему решают изменения в этом запросе. -->
|
<!--- Напишите здесь какую проблему решают изменения в этом запросе. -->
|
||||||
|
|
||||||
## Чек лист (обязательно)
|
## Чек лист (обязательно)
|
||||||
|
|
||||||
- [ ] Код соответствует рекомендациям и требованиям проекта.
|
- [ ] Код соответствует рекомендациям и требованиям проекта.
|
||||||
- [ ] Проверил анализатор на предмет ошибок и предупреждений.
|
- [ ] Проверил анализатор на предмет ошибок и предупреждений.
|
||||||
- [ ] Название ПР соответствует [требованиям проекта](../tools/rfc/RFC-documentation.md).
|
- [ ] Название ПР соответствует [требованиям проекта](../tools/rfc/RFC-documentation.md).
|
||||||
@@ -12,6 +15,7 @@
|
|||||||
- [ ] Добавлены необходимые тесты, если требуется.
|
- [ ] Добавлены необходимые тесты, если требуется.
|
||||||
|
|
||||||
## Скриншоты (желательно)
|
## Скриншоты (желательно)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Показать</summary>
|
<summary>Показать</summary>
|
||||||
|
|
||||||
|
|||||||
27
README.md
27
README.md
@@ -1,21 +1,15 @@
|
|||||||
<div align="center">
|
|
||||||
|
|
||||||
# 🚀 Friflex Flutter Starter - Корпоративный шаблон
|
# 🚀 Friflex Flutter Starter - Корпоративный шаблон
|
||||||
|
|
||||||
</div>
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
**Корпоративный стартовый шаблон для разработки масштабируемых Flutter-приложений**
|
Корпоративный стартовый шаблон для разработки масштабируемых Flutter-приложений
|
||||||
|
|
||||||
[📋 Документация](#-документация) • [🏗️ Архитектура](#️-архитектура) • [🚀 Быстрый старт](#-быстрый-старт) • [🔧 Конфигурация](#-конфигурация)
|
[📋 Документация](#-документация) • [🏗️ Архитектура](#️-архитектура) • [🚀 Быстрый старт](#-быстрый-старт) • [🔧 Конфигурация](#-конфигурация)
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📖 Описание проекта
|
## 📖 Описание проекта
|
||||||
@@ -162,33 +156,33 @@ enum AppEnv {
|
|||||||
|
|
||||||
### 🛠️ Установка
|
### 🛠️ Установка
|
||||||
|
|
||||||
1. **Клонирование проекта**
|
#### Клонирование проекта
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/smmarty/friflex_starter.git
|
git clone https://github.com/smmarty/friflex_starter.git
|
||||||
cd friflex_starter
|
cd friflex_starter
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Установка зависимостей**
|
#### Установка зависимостей
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
flutter pub get
|
flutter pub get
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Генерация файлов**
|
#### Генерация файлов
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
dart run build_runner build --delete-conflicting-outputs
|
dart run build_runner build --delete-conflicting-outputs
|
||||||
flutter packages pub run flutter_gen
|
flutter packages pub run flutter_gen
|
||||||
```
|
```
|
||||||
|
|
||||||
4. **Запуск приложения**
|
#### Запуск приложения
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
flutter run
|
flutter run
|
||||||
```
|
```
|
||||||
|
|
||||||
5. **Замените название пакета на ваш**
|
#### Замените название пакета на ваш
|
||||||
|
|
||||||
### 🎯 Запуск с разными окружениями
|
### 🎯 Запуск с разными окружениями
|
||||||
|
|
||||||
@@ -263,7 +257,7 @@ dart run build_runner build --delete-conflicting-outputs
|
|||||||
| 🏗️ [RFC-projects_structure.md](./tools/rfc/RFC-projects_structure.md) | Структура проекта |
|
| 🏗️ [RFC-projects_structure.md](./tools/rfc/RFC-projects_structure.md) | Структура проекта |
|
||||||
| 📝 [RFC-documentation.md](./tools/rfc/RFC-documentation.md) | Правила документирования |
|
| 📝 [RFC-documentation.md](./tools/rfc/RFC-documentation.md) | Правила документирования |
|
||||||
| 🔧 [RFC-managing_generated_files.md](./tools/rfc/RFC-managing_generated_files.md) | Рекомендации по управлению сгенерированными файлами |
|
| 🔧 [RFC-managing_generated_files.md](./tools/rfc/RFC-managing_generated_files.md) | Рекомендации по управлению сгенерированными файлами |
|
||||||
| 🌐 [RFC-managing_pubspec_lock.md](./tools/rfc/RFC-managing_pubspec_lock.md) | Рекомендации по управлению pubspec.lock
|
| 🌐 [RFC-managing_pubspec_lock.md](./tools/rfc/RFC-managing_pubspec_lock.md) | Рекомендации по управлению pubspec.lock |
|
||||||
|
|
||||||
## 🎯 Особенности и нюансы
|
## 🎯 Особенности и нюансы
|
||||||
|
|
||||||
@@ -294,9 +288,4 @@ Copyright © 2025 Friflex LLC. Все права защищены.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Разработано с любовью командой Friflex ❤️
|
||||||
<div align="right">
|
|
||||||
|
|
||||||
*Разработано с любовью командой Friflex ❤️*
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
## Рекомендованный Readme для проектов
|
# Приложение [ProjectName]
|
||||||
#### Приложение [ProjectName]
|
|
||||||
|
|
||||||
## Структура проекта
|
## Структура проекта
|
||||||
|
|
||||||
- проект архитектурно делится на три слоя: data, domain и presentation;
|
- проект архитектурно делится на три слоя: data, domain и presentation;
|
||||||
- все [features] реализуются в отдельных папках, с внутренним делением на слои;
|
- все [features] реализуются в отдельных папках, с внутренним делением на слои;
|
||||||
|
|
||||||
## Основные пакеты и реализации (обновляется при добавлении или изменении)
|
## Основные пакеты и реализации (обновляется при добавлении или изменении)
|
||||||
|
|
||||||
- управление роутингом: [go_router](https://pub.dev/packages/go_router);
|
- управление роутингом: [go_router](https://pub.dev/packages/go_router);
|
||||||
- основной state manager: [flutter_bloc](https://pub.dev/packages/flutter_bloc);
|
- основной state manager: [flutter_bloc](https://pub.dev/packages/flutter_bloc);
|
||||||
- di: ручная реализация через InheritedWidget;
|
- di: ручная реализация через InheritedWidget;
|
||||||
@@ -16,16 +17,21 @@
|
|||||||
- для работы с API - [dio](https://pub.dev/packages/dio);
|
- для работы с API - [dio](https://pub.dev/packages/dio);
|
||||||
|
|
||||||
## Инструкция по запуску проекта
|
## Инструкция по запуску проекта
|
||||||
|
|
||||||
- [Инструкция по запуску проекта](./tools/rfc/RFC-build.md)
|
- [Инструкция по запуску проекта](./tools/rfc/RFC-build.md)
|
||||||
|
|
||||||
## Стиль написания кода
|
## Стиль написания кода
|
||||||
|
|
||||||
- [Стиль написания кода](./*ools*/rfc/RFC-codestyle.md)
|
- [Стиль написания кода](./*ools*/rfc/RFC-codestyle.md)
|
||||||
|
|
||||||
## Внесение изменений в код
|
## Внесение изменений в код
|
||||||
|
|
||||||
- [Внесение изменений в код](./tools/rfc/RFC-gitflow.md)
|
- [Внесение изменений в код](./tools/rfc/RFC-gitflow.md)
|
||||||
|
|
||||||
## Структура проекта
|
## Документация по структуре проекта
|
||||||
|
|
||||||
- [Структура проекта](./tools/rfc/RFC-projects_structure.md)
|
- [Структура проекта](./tools/rfc/RFC-projects_structure.md)
|
||||||
|
|
||||||
## Ведение документации и комментариев в проекте
|
## Ведение документации и комментариев в проекте
|
||||||
|
|
||||||
- [Ведение документации и комментариев в проекте](./tools/rfc/RFC-documentation.md)
|
- [Ведение документации и комментариев в проекте](./tools/rfc/RFC-documentation.md)
|
||||||
@@ -8,13 +8,16 @@
|
|||||||
## Именование
|
## Именование
|
||||||
|
|
||||||
### Интерфейсы
|
### Интерфейсы
|
||||||
|
|
||||||
Утверждены два вида объявления интерфейсов:
|
Утверждены два вида объявления интерфейсов:
|
||||||
|
|
||||||
1. Все интерфейсы в приложении должны начинаться с заглавной буквы "**I**".
|
1. Все интерфейсы в приложении должны начинаться с заглавной буквы "**I**".
|
||||||
|
|
||||||
Например: **IAuthRepository**, **IProfileRepository**, **IMainRunner** и т.д.
|
Например: **IAuthRepository**, **IProfileRepository**, **IMainRunner** и т.д.
|
||||||
|
|
||||||
Таким образом, сразу видно, что работаешь с интерфейсом.
|
Таким образом, сразу видно, что работаешь с интерфейсом.
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// Интерфейс - **IUserRepository**
|
/// Интерфейс - **IUserRepository**
|
||||||
abstract interface class IUserRepository {}
|
abstract interface class IUserRepository {}
|
||||||
@@ -29,6 +32,7 @@ class UserRepositoryLocal implements IUserRepository {}
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Классы - Репозитории
|
### Классы - Репозитории
|
||||||
|
|
||||||
Репозитории должны содержать в конце название источника данных (если используется мок или локальное хранилище).\
|
Репозитории должны содержать в конце название источника данных (если используется мок или локальное хранилище).\
|
||||||
Основная реализация, не должна содержать постфикса.
|
Основная реализация, не должна содержать постфикса.
|
||||||
|
|
||||||
@@ -38,18 +42,21 @@ class UserRepositoryLocal implements IUserRepository {}
|
|||||||
Локальное хранилище (например бд или просто имитация данных) - **AuthRepositoryLocal**
|
Локальное хранилище (например бд или просто имитация данных) - **AuthRepositoryLocal**
|
||||||
|
|
||||||
### Файлы
|
### Файлы
|
||||||
|
|
||||||
Используется snake_case.
|
Используется snake_case.
|
||||||
Название файла должно иметь следующую структуру: [раздел]_[тип].dart
|
Название файла должно иметь следующую структуру: [раздел]_[тип].dart
|
||||||
|
|
||||||
Пример: user_details_screen.dart, shop_entity.dart
|
Пример: user_details_screen.dart, shop_entity.dart
|
||||||
|
|
||||||
### Классы
|
### Классы
|
||||||
|
|
||||||
Название классов UpperCamelCase.
|
Название классов UpperCamelCase.
|
||||||
Для создание приватных классов используем префикс _ . Название класса в конце должно содержать в себе тип.
|
Для создание приватных классов используем префикс _ . Название класса в конце должно содержать в себе тип.
|
||||||
|
|
||||||
Пример: **UserEntity**, **AdultDialog**
|
Пример: **UserEntity**, **AdultDialog**
|
||||||
|
|
||||||
## Методы
|
## Методы
|
||||||
|
|
||||||
Название метода в начале должно содержать в себе действие(глагол):
|
Название метода в начале должно содержать в себе действие(глагол):
|
||||||
|
|
||||||
- fetch
|
- fetch
|
||||||
@@ -58,44 +65,59 @@ class UserRepositoryLocal implements IUserRepository {}
|
|||||||
- delete и так далее
|
- delete и так далее
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
int fetchFirstElement(){}
|
int fetchFirstElement(){}
|
||||||
```
|
```
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
void updateFirstElement(){};
|
void updateFirstElement(){};
|
||||||
```
|
```
|
||||||
|
|
||||||
Название метода не должно содержать в себе And/Or
|
Название метода не должно содержать в себе And/Or
|
||||||
и метод соответственно не должен выполнять подобную логику.
|
и метод соответственно не должен выполнять подобную логику.
|
||||||
|
|
||||||
## Переменные и константы
|
## Переменные и константы
|
||||||
|
|
||||||
Константы именуются также lowerCamelCase.
|
Константы именуются также lowerCamelCase.
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
const String carItem
|
const String carItem
|
||||||
```
|
```
|
||||||
|
|
||||||
или
|
или
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
final userName;
|
final userName;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Виджеты
|
## Виджеты
|
||||||
|
|
||||||
Виджеты именуются UpperCamelCase.
|
Виджеты именуются UpperCamelCase.
|
||||||
В названии виджетов не должно содержаться слово widget.
|
В названии виджетов не должно содержаться слово widget.
|
||||||
|
|
||||||
### Экраны
|
### Экраны
|
||||||
|
|
||||||
Экраны, используемые в роутинге, именуются с постфиксом Screen.
|
Экраны, используемые в роутинге, именуются с постфиксом Screen.
|
||||||
Например, **ShopListScreen**.
|
Например, **ShopListScreen**.
|
||||||
|
|
||||||
### Содержимое экрана
|
### Содержимое экрана
|
||||||
|
|
||||||
Виджеты, отображающие содержимое экрана, именуются с постфиксом View.
|
Виджеты, отображающие содержимое экрана, именуются с постфиксом View.
|
||||||
Например, **ShopListView**.
|
Например, **ShopListView**.
|
||||||
|
|
||||||
### Глобальные виджеты
|
### Глобальные виджеты
|
||||||
|
|
||||||
Глобальные виджеты именуются с приставкой App.
|
Глобальные виджеты именуются с приставкой App.
|
||||||
Например, **AppButton**.
|
Например, **AppButton**.
|
||||||
|
|
||||||
## Структура класса
|
## Структура класса
|
||||||
|
|
||||||
Объявления элементов класса должны располагаться в следующем порядке:
|
Объявления элементов класса должны располагаться в следующем порядке:
|
||||||
|
|
||||||
1. **Constructors**
|
1. **Constructors**
|
||||||
- constructors
|
- constructors
|
||||||
- named-constructors
|
- named-constructors
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
## Документация
|
## Документация
|
||||||
|
|
||||||
### Основные правила ведения документации в проекте:
|
### Основные правила ведения документации в проекте
|
||||||
|
|
||||||
- документация оформляется над описываемым объектом с использованием '///';
|
- документация оформляется над описываемым объектом с использованием '///';
|
||||||
- документацией необходимо покрывать все классы, конструкторы, поля, геттеры, сеттеры, методы, фабрики, все кастомные объекты;
|
- документацией необходимо покрывать все классы, конструкторы, поля, геттеры, сеттеры, методы, фабрики, все кастомные объекты;
|
||||||
- документация должна:
|
- документация должна:
|
||||||
@@ -13,14 +14,17 @@
|
|||||||
|
|
||||||
## Шаблоны и примеры документации объектов
|
## Шаблоны и примеры документации объектов
|
||||||
|
|
||||||
### Документация классов:
|
### Документация классов
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// {@template new_class}
|
/// {@template new_class}
|
||||||
/// Класс для реализации {описание назначения и реализуемого функционала в классе}.
|
/// Класс для реализации {описание назначения и реализуемого функционала в классе}.
|
||||||
/// {@endtemplate}
|
/// {@endtemplate}
|
||||||
class NewClass {}
|
class NewClass {}
|
||||||
```
|
```
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// {@template app_button}
|
/// {@template app_button}
|
||||||
/// Класс для реализации кастомизированной кнопки.
|
/// Класс для реализации кастомизированной кнопки.
|
||||||
@@ -28,11 +32,12 @@
|
|||||||
class AppButton {}
|
class AppButton {}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Документация конструкторов и фабрик:
|
### Документация конструкторов и фабрик
|
||||||
|
|
||||||
Если конструктор один, то достаточно указать {@macro new_class}.
|
Если конструктор один, то достаточно указать {@macro new_class}.
|
||||||
{@macro new_class} дублирует на конструктор указанную в рамках описания класса документацию, поэтому описание класса должно в таком случае включать все передаваемые в конструктор параметры
|
{@macro new_class} дублирует на конструктор указанную в рамках описания класса документацию, поэтому описание класса должно в таком случае включать все передаваемые в конструктор параметры
|
||||||
Если конструкторов несколько, описания должны отражать их отличия друг от друга. Фабрики описываются по такому же принципу.
|
Если конструкторов несколько, описания должны отражать их отличия друг от друга. Фабрики описываются по такому же принципу.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
///{@macro new_class}
|
///{@macro new_class}
|
||||||
const NewClass();
|
const NewClass();
|
||||||
@@ -43,8 +48,10 @@
|
|||||||
factory NewClass.fromJson(Map<String, dynamic> json)
|
factory NewClass.fromJson(Map<String, dynamic> json)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Документация полей классов:
|
### Документация полей классов
|
||||||
|
|
||||||
В классе необходимо описывать каждое поле по отдельности. Если поле ссылается на другое поле или зависит от него, необходимо это указывать в описании.
|
В классе необходимо описывать каждое поле по отдельности. Если поле ссылается на другое поле или зависит от него, необходимо это указывать в описании.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// Возраст пользователя.
|
/// Возраст пользователя.
|
||||||
final int age;
|
final int age;
|
||||||
@@ -53,7 +60,8 @@
|
|||||||
final bool isAdult;
|
final bool isAdult;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Документация геттеров/сеттеров:
|
### Документация геттеров/сеттеров
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// Получения доступа к {описание данных, которые получает геттер}
|
/// Получения доступа к {описание данных, которые получает геттер}
|
||||||
int get newGetter => ...
|
int get newGetter => ...
|
||||||
@@ -62,8 +70,10 @@
|
|||||||
set newSetter (int setterValue) => ...
|
set newSetter (int setterValue) => ...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Документация методов:
|
### Документация методов
|
||||||
|
|
||||||
Методы должны описывать их основное назначение. Если метод сложный, требуется указывать дополнительное описание его работы ниже через пропущенную строку. Если метод принимает какие-либо параметры, каждый параметр должен быть описан по отдельности списком с прямой ссылкой. Если метод возвращает какие-либо значения, они должны быть описаны. Желательно указать, что вернет метод в случае возникновения ошибки.
|
Методы должны описывать их основное назначение. Если метод сложный, требуется указывать дополнительное описание его работы ниже через пропущенную строку. Если метод принимает какие-либо параметры, каждый параметр должен быть описан по отдельности списком с прямой ссылкой. Если метод возвращает какие-либо значения, они должны быть описаны. Желательно указать, что вернет метод в случае возникновения ошибки.
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// Метод для {описание назначения метода}.
|
/// Метод для {описание назначения метода}.
|
||||||
/// {описание особенностей работы метода}.
|
/// {описание особенностей работы метода}.
|
||||||
@@ -73,7 +83,9 @@
|
|||||||
...
|
...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
/// Метод для расчета температуры.
|
/// Метод для расчета температуры.
|
||||||
/// Принимает:
|
/// Принимает:
|
||||||
@@ -88,16 +100,20 @@
|
|||||||
|
|
||||||
## Комментарии
|
## Комментарии
|
||||||
|
|
||||||
### Основные правила комментирования кода в проекте:
|
### Основные правила комментирования кода в проекте
|
||||||
|
|
||||||
- комментарии оформляются над описываемым участком кода с использованием '//';
|
- комментарии оформляются над описываемым участком кода с использованием '//';
|
||||||
- комментировать необходимо те участки кода, которые действительно нуждаются в дополнительном описании;
|
- комментировать необходимо те участки кода, которые действительно нуждаются в дополнительном описании;
|
||||||
- комментарий не должен повторять легко читаемые участки кода
|
- комментарий не должен повторять легко читаемые участки кода
|
||||||
|
|
||||||
Например:
|
Например:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
if(flag != true) // не нужно описывать как "Если значение не равно true...
|
if(flag != true) // не нужно описывать как "Если значение не равно true...
|
||||||
```
|
```
|
||||||
|
|
||||||
Например:
|
Например:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
if(isAurora){
|
if(isAurora){
|
||||||
// Так как Аврора не может открывать WebView,
|
// Так как Аврора не может открывать WebView,
|
||||||
@@ -107,7 +123,8 @@
|
|||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
### Основные правила создания TODO в проекте:
|
### Основные правила создания TODO в проекте
|
||||||
|
|
||||||
- TODO оформляются согласно условиям форматирования линтера с указанием имени разработчика, кто находится в контексте проблемы и сможет ее прокомментировать;
|
- TODO оформляются согласно условиям форматирования линтера с указанием имени разработчика, кто находится в контексте проблемы и сможет ее прокомментировать;
|
||||||
- TODO необходимо оставлять на тех участках кода, которые требуют дальнейшей доработки;
|
- TODO необходимо оставлять на тех участках кода, которые требуют дальнейшей доработки;
|
||||||
- если известно, в рамках какой задачи будет доработан помечаемый участок кода, ссылку на задаче необходимо оставить в скобках.
|
- если известно, в рамках какой задачи будет доработан помечаемый участок кода, ссылку на задаче необходимо оставить в скобках.
|
||||||
@@ -1,21 +1,26 @@
|
|||||||
|
|
||||||
# Ведение проекта в git
|
# Ведение проекта в git
|
||||||
|
|
||||||
## Создание commits/pull-request
|
## Создание commits/pull-request
|
||||||
|
|
||||||
- язык описания PR - Русский;
|
- язык описания PR - Русский;
|
||||||
- описание должно отражать краткую суть изменений;
|
- описание должно отражать краткую суть изменений;
|
||||||
- коммит/PR должен содержать:
|
- коммит/PR должен содержать:
|
||||||
- исчерпывающую информацию об изменениях;
|
- исчерпывающую информацию об изменениях;
|
||||||
- ссылку на задачу в таск-трекер;
|
- ссылку на задачу в таск-трекер;
|
||||||
- Перечисление deprecated-кода (если есть).
|
- Перечисление deprecated-кода (если есть).
|
||||||
|
|
||||||
### Типы коммитов согласно convention
|
### Типы коммитов согласно convention
|
||||||
* **feat**: — новая функция
|
|
||||||
* **fix**: — исправление ошибок
|
- **feat**: — новая функция
|
||||||
* **refactor**: — Изменение кода, которое не исправляет ошибку и не добавляет функции (рефакторинг кода).
|
|
||||||
* **build**: — изменения, влияющие на систему сборки или внешние зависимости (примеры областей (scope): android, ios, linux и так далее).
|
- **fix**: — исправление ошибок
|
||||||
* **docs**: — изменения только в документации
|
- **refactor**: — Изменение кода, которое не исправляет ошибку и не добавляет функции (рефакторинг кода).
|
||||||
* **chore** - добавление/обновление/настройка инструментов и библиотек (пример: pubspec.yaml).
|
- **build**: — изменения, влияющие на систему сборки или внешние зависимости (примеры областей (scope): android, ios, linux и так далее).
|
||||||
* **test**: — добавление недостающих тестов или исправление существующих тестов.
|
- **docs**: — изменения только в документации
|
||||||
* **ci**: — изменения в файлах конфигурации и скриптах CI (примеры областей: папка CI).
|
- **chore** - добавление/обновление/настройка инструментов и библиотек (пример: pubspec.yaml).
|
||||||
|
- **test**: — добавление недостающих тестов или исправление существующих тестов.
|
||||||
|
- **ci**: — изменения в файлах конфигурации и скриптах CI (примеры областей: папка CI).
|
||||||
|
|
||||||
### Правила именования веток
|
### Правила именования веток
|
||||||
|
|
||||||
@@ -28,29 +33,33 @@
|
|||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
* `feat/PRIME-123_authentication`
|
- `feat/PRIME-123_authentication`
|
||||||
* `fix/PRIME-456_typo_in_button`
|
- `fix/PRIME-456_typo_in_button`
|
||||||
* `fix/PRIME-456-typo-in-button`
|
- `fix/PRIME-456-typo-in-button`
|
||||||
|
|
||||||
## Схема разработки новой features
|
## Схема разработки новой features
|
||||||

|
|
||||||
|

|
||||||
|
|
||||||
## Создание релиза
|
## Создание релиза
|
||||||

|
|
||||||
|

|
||||||
|
|
||||||
### Добавление новых features
|
### Добавление новых features
|
||||||
|
|
||||||
- создаем ветку feat/(уникальный номер задачи) (название feature),
|
- создаем ветку feat/(уникальный номер задачи) (название feature),
|
||||||
Пример: <b>PRIME-17 Добавить_локальный_репозиторий</b>;
|
Пример: **PRIME-17 Добавить_локальный_репозиторий**;
|
||||||
- вносим изменения;
|
- вносим изменения;
|
||||||
- делаем коммит только на то, что касается изменений связанных с этой задачей;
|
- делаем коммит только на то, что касается изменений связанных с этой задачей;
|
||||||
- по завершению задачи - создаем Pull Request с названием по правилам https://commitlint.io/.
|
- по завершению задачи - создаем Pull Request с названием по правилам <https://commitlint.io/>.
|
||||||
Пример: <b>feat(app,di,auth,scripts,pubspec): PRIME-17 Добавить локальный репозиторий</b>.
|
Пример: **feat(app,di,auth,scripts,pubspec): PRIME-17 Добавить локальный репозиторий**.
|
||||||
Где, PRIME- это обязательный префикс(с помощью него автоматически подтягивается ссылка на задачу), число 17 это уникальный номер задачи из трекера.
|
Где, PRIME- это обязательный префикс(с помощью него автоматически подтягивается ссылка на задачу), число 17 это уникальный номер задачи из трекера.
|
||||||
В описание к PR добавляем ссылку на задачу и описание внесенных изменений, и пояснения(если требуется);
|
В описание к PR добавляем ссылку на задачу и описание внесенных изменений, и пояснения(если требуется);
|
||||||
- после завершения CodeReview создаем squash commit в ветку main (название коммит(а), должно быть такое же как название pull request) ;
|
- после завершения CodeReview создаем squash commit в ветку main (название коммит(а), должно быть такое же как название pull request) ;
|
||||||
- после того как ветка с новой feature попало в main - удаляем ветку;
|
- после того как ветка с новой feature попало в main - удаляем ветку;
|
||||||
|
|
||||||
### Создание release
|
### Создание release
|
||||||
|
|
||||||
- создаем ветку из main (release/release_0.0.1+1);
|
- создаем ветку из main (release/release_0.0.1+1);
|
||||||
- добавляем в changelog.md описание изменений в этой версии (обычно это список коммитов, от предыдущей версии):
|
- добавляем в changelog.md описание изменений в этой версии (обычно это список коммитов, от предыдущей версии):
|
||||||
- делаем сборки, отправляем на тестирование;
|
- делаем сборки, отправляем на тестирование;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
### Управление сгенерированными файлами
|
# Управление сгенерированными файлами
|
||||||
|
|
||||||
На проекте встречаются файлы, автоматически создаваемые инструментами генерации кода
|
На проекте встречаются файлы, автоматически создаваемые инструментами генерации кода
|
||||||
(например, файлы с расширениями *.g.dart,*.freezed.dart,
|
(например, файлы с расширениями *.g.dart,*.freezed.dart,
|
||||||
@@ -6,21 +6,21 @@
|
|||||||
Необходимость контролировать такие файлы в репозитории вызывает ряд обсуждений.
|
Необходимость контролировать такие файлы в репозитории вызывает ряд обсуждений.
|
||||||
См [issue](https://github.com/smmarty/flutter_team/issues/22).
|
См [issue](https://github.com/smmarty/flutter_team/issues/22).
|
||||||
|
|
||||||
### Проблемы включения сгенерированных файлов в репозиторий
|
## Проблемы включения сгенерированных файлов в репозиторий
|
||||||
|
|
||||||
1. Частые изменения. Сгенерированные файлы могут автоматически обновляться даже при отсутствии изменений в исходном коде, что приводит к ненужным изменениям в репозитории.
|
1. Частые изменения. Сгенерированные файлы могут автоматически обновляться даже при отсутствии изменений в исходном коде, что приводит к ненужным изменениям в репозитории.
|
||||||
2. Конфликты при слиянии веток. Различия в таких файлах могут вызывать конфликты, которые не связаны с реальными изменениями, усложняя процесс работы над кодом.
|
2. Конфликты при слиянии веток. Различия в таких файлах могут вызывать конфликты, которые не связаны с реальными изменениями, усложняя процесс работы над кодом.
|
||||||
3. Усложнение кода при проверке. Изменения в автоматически сгенерированных файлах попадают в PR, затрудняя код-ревью.
|
3. Усложнение кода при проверке. Изменения в автоматически сгенерированных файлах попадают в PR, затрудняя код-ревью.
|
||||||
4. Недостоверность содержимого main. Нет гарантии, что в основной ветке всегда будут корректные версии сгенерированных файлов.
|
4. Недостоверность содержимого main. Нет гарантии, что в основной ветке всегда будут корректные версии сгенерированных файлов.
|
||||||
|
|
||||||
### Проблемы при добавлении сгенерированных файлов в .gitignore
|
## Проблемы при добавлении сгенерированных файлов в .gitignore
|
||||||
|
|
||||||
1. Необходимость предварительной генерации. При добавлении таких файлов в .gitignore для проверки кода в пайплайне необходимо добавлять этап генерации при каждом изменении в PR.
|
1. Необходимость предварительной генерации. При добавлении таких файлов в .gitignore для проверки кода в пайплайне необходимо добавлять этап генерации при каждом изменении в PR.
|
||||||
Это критично на крупных проектах, так как генерация файлов может занимать несколько минут.
|
Это критично на крупных проектах, так как генерация файлов может занимать несколько минут.
|
||||||
2. Неудобства для разработчиков. Разработчикам потребуется вручную генерировать файлы на локальной машине при каждом чекауте.
|
2. Неудобства для разработчиков. Разработчикам потребуется вручную генерировать файлы на локальной машине при каждом чекауте.
|
||||||
3. Неактуальный код в main. Основная ветка без предварительно сгенерированных файлов станет неработоспособной, а сборка потребует добавления этапа генерации, что увеличит время и нагрузку на серверы.
|
3. Неактуальный код в main. Основная ветка без предварительно сгенерированных файлов станет неработоспособной, а сборка потребует добавления этапа генерации, что увеличит время и нагрузку на серверы.
|
||||||
|
|
||||||
### Рекомендации:
|
## Рекомендации
|
||||||
|
|
||||||
1. Оставлять сгенерированные файлы в репозитории.
|
1. Оставлять сгенерированные файлы в репозитории.
|
||||||
Это позволит сохранить работоспособность основного кода без необходимости постоянной генерации файлов на всех этапах.
|
Это позволит сохранить работоспособность основного кода без необходимости постоянной генерации файлов на всех этапах.
|
||||||
|
|||||||
@@ -5,18 +5,18 @@
|
|||||||
Оба варианта имеют свои преимущества и недостатки, которые следует учесть.
|
Оба варианта имеют свои преимущества и недостатки, которые следует учесть.
|
||||||
См [issue](https://github.com/smmarty/flutter_team/issues/20)
|
См [issue](https://github.com/smmarty/flutter_team/issues/20)
|
||||||
|
|
||||||
#### Аргументы за хранение pubspec.lock
|
## Аргументы за хранение pubspec.lock
|
||||||
|
|
||||||
1. Повторяемость сборки. Файл фиксирует конкретные версии зависимостей, обеспечивая единообразие версий для всех разработчиков и сред сборки.
|
1. Повторяемость сборки. Файл фиксирует конкретные версии зависимостей, обеспечивая единообразие версий для всех разработчиков и сред сборки.
|
||||||
2. Избежание неожиданных изменений. Новые версии зависимостей могут внести изменения, способные нарушить сборку или логику приложения. Наличие pubspec.lock позволяет контролировать изменения и избегать неожиданных обновлений.
|
2. Избежание неожиданных изменений. Новые версии зависимостей могут внести изменения, способные нарушить сборку или логику приложения. Наличие pubspec.lock позволяет контролировать изменения и избегать неожиданных обновлений.
|
||||||
3. Стабильность CI/CD. Зафиксированные версии зависимостей способствуют стабильным сборкам и тестам в CI-процессах.
|
3. Стабильность CI/CD. Зафиксированные версии зависимостей способствуют стабильным сборкам и тестам в CI-процессах.
|
||||||
4. Рекомендации Dart. Dart рекомендует хранить pubspec.lock в репозитории для приложений, чтобы обеспечить стабильность окружения. (См. документацию.)
|
4. Рекомендации Dart. Dart рекомендует хранить pubspec.lock в репозитории для приложений, чтобы обеспечить стабильность окружения. (См. документацию.)
|
||||||
|
|
||||||
#### Аргументы против хранения pubspec.lock
|
## Аргументы против хранения pubspec.lock
|
||||||
|
|
||||||
1. Частые изменения. pubspec.lock обновляется при каждом изменении зависимостей, что увеличивает количество коммитов и PR, связанных только с обновлением зависимостей.
|
1. Частые изменения. pubspec.lock обновляется при каждом изменении зависимостей, что увеличивает количество коммитов и PR, связанных только с обновлением зависимостей.
|
||||||
|
|
||||||
### Рекомендации:
|
## Рекомендации
|
||||||
|
|
||||||
1. ХРАНИТЬ pubspec.lock для ПРИЛОЖЕНИЙ.
|
1. ХРАНИТЬ pubspec.lock для ПРИЛОЖЕНИЙ.
|
||||||
2. НЕ ХРАНИТЬ pubspec.lock ДЛЯ ПАКЕТОВ.
|
2. НЕ ХРАНИТЬ pubspec.lock ДЛЯ ПАКЕТОВ.
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
- **/dev.dart** - сборка разработки на моковых репозиториях
|
- **/dev.dart** - сборка разработки на моковых репозиториях
|
||||||
- **/stage.dart** - сборка для stage окружения
|
- **/stage.dart** - сборка для stage окружения
|
||||||
|
|
||||||
|
|
||||||
## Пример структуры feature папок
|
## Пример структуры feature папок
|
||||||
|
|
||||||
- **/data** - слой данных
|
- **/data** - слой данных
|
||||||
@@ -44,31 +43,37 @@
|
|||||||
- **/presentation** - слой представления
|
- **/presentation** - слой представления
|
||||||
- **/screens** - все экраны должны заканчиваться на Screen, например UserProfileScreen.
|
- **/screens** - все экраны должны заканчиваться на Screen, например UserProfileScreen.
|
||||||
- **/components** - виджеты, которые необходимы для работы в presentation слое. Например: SuperButton, AppTextFields итд.
|
- **/components** - виджеты, которые необходимы для работы в presentation слое. Например: SuperButton, AppTextFields итд.
|
||||||
# Пояснение к структуре feature папок
|
|
||||||
|
|
||||||
## Data (слой данных) Этот слой является поставщиком данных.
|
## Пояснение к структуре feature папок
|
||||||
|
|
||||||
|
### Data (слой данных) Этот слой является поставщиком данных
|
||||||
|
|
||||||
- Repository - сущность, которая реализует внутри себя предоставление данных. Должен реализовывать какой либо интерфейс репозитория из domain слоя.
|
- Repository - сущность, которая реализует внутри себя предоставление данных. Должен реализовывать какой либо интерфейс репозитория из domain слоя.
|
||||||
- DTO - Dto(Data Transfer Object) модели, и модели с которыми происходит работа в data слое. Например: UserDto;
|
- DTO - Dto(Data Transfer Object) модели, и модели с которыми происходит работа в data слое. Например: UserDto;
|
||||||
|
|
||||||
## Domain (слой бизнес логики)
|
### Domain (слой бизнес логики)
|
||||||
|
|
||||||
- Entity - должны быть в максимально удобном виде для работы внутри Domain и Presentation. Например: UserEntity, ShopEntity;
|
- Entity - должны быть в максимально удобном виде для работы внутри Domain и Presentation. Например: UserEntity, ShopEntity;
|
||||||
- State - управления состоянием - state manager
|
- State - управления состоянием - state manager
|
||||||
- Service - различные сервисы, для выполнения различных задач.
|
- Service - различные сервисы, для выполнения различных задач.
|
||||||
- interfaces - интерфейсы репозиториев, которые используются в domain слое.
|
- interfaces - интерфейсы репозиториев, которые используются в domain слое.
|
||||||
|
|
||||||
## Presentation (слой представления)
|
### Presentation (слой представления)
|
||||||
|
|
||||||
- сomponents - widget'ы которые реализуют работу какого либо визуального компонента(Buttons,TextFields,Lists, итд). Например: ShopList, RateButton. Модальные окна.
|
- сomponents - widget'ы которые реализуют работу какого либо визуального компонента(Buttons,TextFields,Lists, итд). Например: ShopList, RateButton. Модальные окна.
|
||||||
- screens - widget'ы которые представляют собой экран приложения. Например: UserInfoScreen.
|
- screens - widget'ы которые представляют собой экран приложения. Например: UserInfoScreen.
|
||||||
|
|
||||||
# Основные правила общения объектов между папками
|
## Основные правила общения объектов между папками
|
||||||
|
|
||||||
|
### В рамках всего приложения
|
||||||
|
|
||||||
## В рамках всего приложения
|
|
||||||
- объекты внутри фичи должны быть инкапсулированы и не могут использоваться в других feature;
|
- объекты внутри фичи должны быть инкапсулированы и не могут использоваться в других feature;
|
||||||
- если есть необходимость использовать объект в нескольких feature, его нужно вынести в папку app и использовать как глобальный для всего приложения;
|
- если есть необходимость использовать объект в нескольких feature, его нужно вынести в папку app и использовать как глобальный для всего приложения;
|
||||||
- сервис, который должен быть использован в нескольких feature, создается как отдельная feature;
|
- сервис, который должен быть использован в нескольких feature, создается как отдельная feature;
|
||||||
- если создаваемый сервис является платформно-зависимым, его необходимо выносить в app_services. В приложении должен быть только интерфейс.
|
- если создаваемый сервис является платформно-зависимым, его необходимо выносить в app_services. В приложении должен быть только интерфейс.
|
||||||
|
|
||||||
## В рамках одной feature
|
### В рамках одной feature
|
||||||
|
|
||||||
- объекты data слоя не должны ничего знать про объекты слоя presentation. Имеют доступ к объектам entity из domain слоя для преобразования DTO в Entity ;
|
- объекты data слоя не должны ничего знать про объекты слоя presentation. Имеют доступ к объектам entity из domain слоя для преобразования DTO в Entity ;
|
||||||
- объекты domain слоя не должны ничего знать про объекты слоя data, используемый экземпляр репозитория передается в объекты domain слоя через интерфейс репозитория, расположенного в этом же domain слое;
|
- объекты domain слоя не должны ничего знать про объекты слоя data, используемый экземпляр репозитория передается в объекты domain слоя через интерфейс репозитория, расположенного в этом же domain слое;
|
||||||
- объекты domain слоя не должны ничего знать про слой presentation, не должны использовать компоненты библиотек ui, material, cupertino, widget и прочих, не должны использовать context;
|
- объекты domain слоя не должны ничего знать про слой presentation, не должны использовать компоненты библиотек ui, material, cupertino, widget и прочих, не должны использовать context;
|
||||||
|
|||||||
Reference in New Issue
Block a user