Блог/Удаление части кода из PHP

Автоматическое удаление части кода из 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)