You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Правила разработки
## Основные принципы
### Система контроля версий
Код проекта X размещен на GitHub:
- Ядро Xray [Xray-core](https://github.com/XTLS/Xray-core)
- Скрипты установки [Xray-install](https://github.com/XTLS/Xray-install)
- Шаблоны конфигурации [Xray-examples](https://github.com/XTLS/Xray-examples)
- Документация по Xray [Xray-docs-next](https://github.com/XTLS/Xray-docs-next)
Вы можете использовать [Git](https://git-scm.com/) для получения кода.
### Ветки (Branch)
- Основной веткой проекта является main.
- Основной веткой для выпуска релизов также является main.
- Необходимо убедиться, что main в любой момент времени может быть скомпилирован и работает корректно.
- Если вам нужно разработать новую функцию, создайте новую ветку для разработки. После завершения разработки и тщательного тестирования объедините ее с основной веткой.
- Удалите ветки, которые были объединены с основной веткой и больше не нужны.
### Релизы (Release)
<Badge text="В РАЗРАБОТКЕ" type="warning"/>
- Создайте два канала выпуска: для предварительных версий и для стабильных версий.
- Предварительные версии могут быть ежедневными сборками, в основном используются для тестирования в определенных ситуациях, ознакомления с новыми функциями и получения обратной связи для дальнейшего улучшения.
- Стабильные версии выпускаются по расписанию (например, ежемесячно) и содержат стабильные изменения.
### Использование других проектов
- Golang
- В коде рекомендуется использовать стандартную библиотеку Golang и библиотеки из [golang.org/x/](https://pkg.go.dev/search?limit=25&m=package&q=golang.org%2Fx).
- Если вам нужно использовать другие проекты, сначала создайте issue для обсуждения.
- Другие
- Можно использовать любые инструменты, которые не нарушают лицензии обеих сторон и полезны для проекта.
## Процесс разработки
### Перед написанием кода
Если вы обнаружили какую-либо проблему или у вас есть идеи по улучшению проекта, создайте [issue](https://github.com/XTLS/Xray-core/issues) для обсуждения, чтобы избежать дублирования усилий и траты времени на написание кода.
### Изменение кода
- Golang
- См. [Effective Go](https://golang.org/doc/effective_go.html).
- Перед каждой отправкой (push) выполните команду: `go generate core/format.go`.
- Если вам нужно изменить protobuf, например, добавить новый параметр конфигурации, выполните команду: `go generate core/proto.go`.
- Перед отправкой pull request рекомендуется запустить тесты: `go test ./...`.
- Перед отправкой pull request рекомендуется, чтобы новый код имел покрытие кода (code coverage) не менее 70%.
- Другие
- Обратите внимание на читаемость кода.
### Запрос на включение изменений (Pull Request)
- Перед отправкой PR сначала выполните команду `git pull https://github.com/XTLS/Xray-core.git`, чтобы убедиться, что слияние пройдет гладко.
- Один PR должен решать только одну задачу. Если вы исправляете несколько ошибок, отправьте по одному PR для каждой ошибки.
- Из-за особенностей Golang (пути к пакетам) процесс PR для проектов Go отличается от других проектов. Рекомендуемый процесс следующий:
1. Сначала сделайте форк (fork) проекта, создайте свой собственный репозиторий `github.com/<your_name>/Xray-core.git`.
2. Клонируйте свой репозиторий Xray локально: `git clone https://github.com/<your_name>/Xray-core.git`.
3. Создайте новую ветку на основе ветки `main`, например, `git branch issue24 main`.
4. Внесите изменения в новую ветку и зафиксируйте их (commit).
5. Перед отправкой (push) измененной ветки в свой репозиторий переключитесь на ветку `main` и выполните команду `git pull https://github.com/XTLS/Xray-core.git`, чтобы получить последнюю версию кода.
6. Если на предыдущем шаге были получены новые изменения, переключитесь на созданную вами ветку и выполните команду `git rebase main` для слияния веток. Если возникнут конфликты файлов, их необходимо разрешить.
7. После завершения предыдущего шага вы можете отправить свою ветку в свой репозиторий: `git push -u origin your-branch`.
8. Наконец, отправьте PR из своей ветки в ветку `main` репозитория `XTLS/Xray-core`.
9. В заголовке и описании PR четко опишите проблему, которую решает этот PR / новую функцию / цель изменений кода.
10. Дождитесь ответа разработчиков.
### Изменения кода
#### Проблемы с функциональностью
Отправьте хотя бы один тестовый пример (Test Case), чтобы проверить изменения в существующей функциональности.
#### Проблемы с производительностью
Отправьте необходимые тестовые данные, чтобы подтвердить проблемы с производительностью существующего кода или улучшение производительности нового кода.
#### Новые функции
- Если новая функция не влияет на существующую функциональность, предоставьте переключатель (например, флаг) для ее включения/отключения и оставьте ее отключенной по умолчанию.
- Перед разработкой новой крупной функции (например, добавления нового протокола) создайте issue для обсуждения.
#### Другое
Зависит от конкретной ситуации.
## Стандарты кодирования Xray
Следующие правила применяются к коду Golang в Xray.
### Структура кода
```
Xray-core
├── app // Модули приложений
│ ├── router // Маршрутизация
├── common // Общий код
├── proxy // Протоколы связи
│ ├── blackhole
│ ├── dokodemo-door
│ ├── freedom
│ ├── socks
│ ├── vmess
├── transport // Транспортные модули
```
### Стандарты кодирования
В основном соответствуют рекомендациям Golang, за некоторыми исключениями. Приведены здесь для удобства ознакомления с Golang.
#### Именование
- Для имен файлов и каталогов по возможности используйте одно английское слово, например, hello.go.
- Если это невозможно, используйте дефисы для разделения слов в имени каталога и подчеркивания для разделения слов в имени файла, например, hello-world/hello_again.go.
- Тестовый код должен иметь суффикс _test.go.
- Для типов используйте нотацию PascalCase, например, ConnectionHandler.
- Сокращения не обязательно писать в нижнем регистре, то есть HTML не нужно писать как Html.
- Для публичных переменных-членов также используйте нотацию PascalCase.
- Для приватных переменных-членов используйте [нотацию camelCase](https://ru.wikipedia.org/wiki/CamelCase), например, `privateAttribute`.
- Для удобства рефакторинга рекомендуется использовать нотацию PascalCase для всех методов.
- Полностью приватные типы помещайте в каталог `internal`.
#### Организация кода
- Один файл должен содержать один основной тип и связанные с ним приватные функции.
- Тестовые файлы, такие как Mock и другие утилиты, помещайте в подкаталог testing.