Автоматическое удаление части кода из PHP файлов
Праздники это прекрасное время позаниматься какой-нибудь фигней, например, наконец-то реализовать идею автоматической очистки кода PHP файлов при выкладке в продакшн. Очистку будем осуществлять средствами Gulp, так как эту библиотеку все равно регулярно использую для мелкой автоматизации. Но начнем с самого начала.
Любопытный читатель может спросить, а зачем вообще очищать код PHP? Может ты хочешь уменьшить размер файла? Играешь в мифическую оптимизацию скорости работы? Нет. Это не борьба за мифическую оптимизацию скорости работы посредством уменьшения кода и удаления комментариев. Проблема не в уменьшении веса файлов, ни в очистке от комментариев или мусора. Проблема в том, что существует разница между продакшн и локальной разработкой и регулярно возникают ситуации, когда необходимо вырезать ту или иную часть из файла, чтобы он не попала в продакшн. Но давайте на примере.
Ну например, не так давно был пример с разработкой класса кодирования/декодирования URL. В нем мы использовали метод setProperties(), который был нам нужен только для задания опций при тестировании в PHPUnit. Давайте удалим его из нашего класса, когда будем выкладывать его в продакшн. Но как это сделать, чтобы не делать каждый раз руками?
Подумав какое-то время над оптимальным решением, я пришел к выводу, что в любом случае большая часть автоматизации у меня лежит на Gulp. Так давайте воспользуемся его возможностями. Мой выбор пал на плагин gulp-strip-code, который позволяет вырезать части кода в блоке комментариев по маске. Добавим в файл комментарии и обработаем.
/* remove_start */
public function setProperties($exact, $val = true)
{
if (array_key_exists($exact, $this->properties)) {
$this->properties[$exact] = $val;
return true;
} else {
return false;
}
}
/* remove_stop */
Применим gulpfile.js к нашему файлу.
var gulp = require('gulp'),
rename = require('gulp-rename'),
concat = require('gulp-concat'),
codestrip = require('gulp-strip-code');
gulp.task('prod',function() {
console.log('file preparation started');
var files = ['index.php'];
return gulp.src(files)
.pipe(codestrip({
start_comment: "remove_start",
end_comment: "remove_stop"
}))
.pipe(gulp.dest('production/'));
});
gulp.task('prod'));
Небольшие комментарии по файлу: подключаем require('gulp-strip-code'), создаем задачу с именем prod, в которой определяем файлы для обработки (переменная files), а далее передаем файлы через цепочку обработки, получая их в папке production.
После обработки мы не найдем выделенного метода в файле. На самом деле данную технику можно применять для чего угодно и даже, для вырезания, переписанных для локальной разработки значений:
$settings = [
'debug' => false,
/* remove_start */
'debug' => true,
/* remove_stop */
];
После обработки залитый на продакшн файл будет иметь нужное нам значение false. Применять данную методику можно не только к PHP файлам. Возможно это все изобретение велосипеда, но лучше решения пока не нашел. Если кто-то знает решение лучше, был бы благодарен за информацию :)
UPDATE: К сожалению данное решение сам плагин не лишен небольшого изъяна, он оставляет символы новой строки на месте удаленных комментариев, но только на файлах созданных на Windows/Max системах, где по умолчанию использует отличный от UNIX систем набор символов переноса строки. Если это напрягает, есть несколько вариантов решения:
- задать в блоке обработки собственный паттерн для обработки в gulpfile.js перед start_comment:
pattern: new RegExp("([\\t ]*\\/\\* ?remove_start ?\\*\\/)[\\s\\S]*?(\\/\\* ?remove_stop ?\\*\\/[\\t ]*\\r?\\n?)", "g"), - ручками исправить регулярное выражение в файле index.js, посмотрев, что надо поменять по ссылке,
- дождаться пока pull-request на доработку будет принят и тогда уже обновиться из npm репозитория (20 января был добавлен в master ветку, можно обновляться).
Комментарии (0)