@c0rewell

Оптимальный способ автоматической модификации исходного кода?

Всем доброго времени суток.

Есть большой модуль к одной из популярных e-commerce платформ. Модуль успешно существует и функционирует.
У заказчика появилось требование сделать возможным т.н. whitelabelling: т.е. заменить все, что связано с конторой заказчика на нечто иное.
Т.е. был модуль BrandName_PaymentGateway, а необходимо его превратить в OtherName_PaymentGateway вместе со всем его содержимым. Файлов в модуле много, более 1.5к. А еще больше строковых констант, переменных, неймспейсов и прочего с упоминанием BrandName.

Собственно, непонятно с какой стороны подойти к задаче, максимально избегая изобретения колеса.

Для PHP кода есть https://github.com/nikic/PHP-Parser и даже https://github.com/rectorphp/rector
Для JS, XML и CSS, вероятно, тоже есть подобные вещи.

Вопросы и мысли следующие:
1) Руками с помощью IDE все это делается достаточно быстро, но нужно будет сделать 200+ разных копий - не вариант.
2) До сих пор не найден достаточно универсальный инструмент для работы с текстом на PHP.
3) Есть мысли каким-то образом использовать git (patch) для более гибкой замены кусков кода, даже если искомая строка сместилась (основная ветка модуля активно развивается), чтобы после каждого релиза не переписывать правила замены.
4) Делать зоопарк из библиотек для обработки разных типов файлов - не хочется, тем более не хочется разносить правила замены по разным конфигам.
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro Куратор тега PHP
Я бы сделал версию проекта, которую можно считать шаблонной.
Все места где BrandName заменил бы на уникальный placeholder на подобии TEMPLATE_BRAND_NAME
Далее замену исходного кода в файлах можно делать любой консольной утилитой типа sed при деплое или при необходимости.

sed -i -- 's/foo/bar/g' *

find . -type f -exec sed -i 's/foo/bar/g' {} +

То есть делаете основной модуль как обычно, и делаете билды под нужный бренд, в котором при сборке производится замена placeholder'ов на нужные строки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы