
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
۩
Дата
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 4155 Пользователь №: 38635 На форуме: Карма: 223 ![]() |
Доброго всем.
В bash опыта маловато, знаком на уровне "как дела, чем вечером занимаешься?" Задача: из репозитария берется php файл а-ля конфиг. В нем присутсвуют инструкции вида define('CONST', ''); и т.д. Т.е. либо объявленны константы, либо переменые, все с пустыми значениями. Что известно: - имена констант; - имена переменных; - значения, которыми их нужно проинициализировать; Что гарантировано? - синтаксис php В чем загвоздка? Скрипт должен корекно прописать значение переменной при любом верном синтаксисе php. Подробнее в примере. Допустим, мы знаем, что $config['part']['subpart'] должно быть равно "value"; На первый взгляд напрашивается замена в лоб sed -ie s/"\$config['part']['subpart']=''"/"\$config['part']['subpart']='value'"/ "config.php" НО: Программист Иван Пертров, который последним коммитил репозитарий, изменил кавычки, заодно разнес запись о переменной на несколько строк, да еще и забыл удалить из нее тестовое значение. Итог, в репозитарии лежит не $config['part']['subpart'] = ''; а $config['part']["subpart"] Синтаксис верен, просто кавычки разные, переменная записана на нескольких строках и значение не стерто. Ну, в общем, как-то так :) В какую сторону копать? -------------------- [продано копирайтерам]
|
![]() |
۩
Дата
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 4155 Пользователь №: 38635 На форуме: Карма: 223 ![]() |
Собственно говоря, алгоритм примерно такой:
по имени переменной или константы ищем ее вхождение в файл и "нормализуем строку / строки" в удобноперевариваемый вид. Например, заменяем двойные кавычки на одинарные, если имеется значение, то удаляем его, удаляем все пробелы, табы и сиволы переноса строки. В итоге имеем нечто красивое в одну строку типа $config['part']['subpart'] = ''; Удаляем исходное, записываем "нормализованное". А дальше задача сводится к уже решенной :) Замечу, проводить данную операцию над всем файлом нельзя, т.к. в файле есть проинициилизированные переменные/константы, неизвестные скрипту, и их значения должны быть сохранены. -------------------- [продано копирайтерам]
|
![]() |
|||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1836 Пользователь №: 32147 На форуме: Карма: 35 ![]() |
О как...
Вот этим занимается интерпритатор PHP. Его создавать для решения подобной задачи - утопия. Поэтому правильная мысль "нормализовать" файл перед тем как вносить изменения через регулярки (в данном случае sed). В принципе решить подобную задачу можно и на PHP, но раз требуется shell - извольте. Я бы приводил к нормальному виду с помощью примерно такого скрипта: #!/bin/bash Он убьет разметку, но работоспособность php скрипт потерять не должен... Данный сценарий shell меняет в ключах $config все двойные кавычки на одинарные. Это недопустимо, если в качестве ключа используется переменная в двойных кавычках (хоть кавычки и не нужны, но от программиста так оформляющего текст, можно ожидать чего угодно ;) )... Тут надо смотреть. Возможно не стОит менять, а просто подумать над регуляркой по замене значений. Чтобы она воспринимала и те и другие, например. Далее применяются ваши правила по замене. P.s. Зависит от конкретного примера, так можно гадать сколь угодно долго. |
||
![]() |
|||
![]() ![]() Reality is wrong. Dreams are for real ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1815 Пользователь №: 16955 На форуме: Карма: 98 ![]() |
Я бы посоветовал Вам хранить файлы для конфугирации в других форматах.
|
||
![]() |
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1836 Пользователь №: 32147 На форуме: Карма: 35 ![]() |
Oyeme, каждый раз парсить XML и раскладывать в переменные? Не накладно это по ресурсам?
|
![]() |
۩
Дата
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 4155 Пользователь №: 38635 На форуме: Карма: 223 ![]() |
paul85
спасибо за скрипт, сейчас покурим... ![]() Остальным тоже спасибо за участие, дабы дальнейшие дебаты об php и прочих xml не плодить, поясню: Есть готовый продукт. Исходники лежат в репозитарии, переодически группой разработчиков фиксятся баги, исходники коммитятся, выпускаются новые версии. Дабы процесс установки/апдейта упростить, решено было написать скрипт-установщик. По вполне понятным причинам, апачу доступа к репозитарию нет, следовательно, вариант php отпадает. Объявить на работе: народ, теперь конфиги храним в xml, потому что так легче для установки.. нуу.. как бы неэтично по отношению к кодерам ![]() ![]() -------------------- [продано копирайтерам]
|
![]() |
|||||
![]() ![]() Reality is wrong. Dreams are for real ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1815 Пользователь №: 16955 На форуме: Карма: 98 ![]() |
О каких ресурсах идет речь?Файлы с конфигурациями обычно занимают пару десяток строк. Для этого и были придуманны форматы для хранения конфигураций.Чтобы Вы не выдумывали решения ,как это делает автор темы.
Потому что эти форматы как раз и для того чтобы Вы хранили в них свои конфигурации. Я бы Вам посоветовал формат YAML http://www.yaml.org/ Какой формат Вы бы не выбрали он будет в любом случаи удобней и лучше чем parsing $config['part']['subpart'] = ''; У Вас не верная архитектура хранения конфигураций,и не верное проектирование "обновления файлов" Вам следует разделать commits на что можно обновлять , а что нет. Файлы с конфигурациями должы быть добавлены в ignore list . |
||||
![]() |
۩
Дата
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 4155 Пользователь №: 38635 На форуме: Карма: 223 ![]() |
Oyeme
Интересное решение, нужно будет поразмыслить на досуге. Одно дело шоп на коленках, другое дело серьезный комерческий продукт, где двухкопеешная оптимизация потом выливается в экономию друдонедель отдела. Надо с архитектором поговорить, может и внедрим ![]() -------------------- [продано копирайтерам]
|
![]() |
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1836 Пользователь №: 32147 На форуме: Карма: 35 ![]() |
Oyeme, но его ведь нет в PHP по дефолту. YAML.
Может быть я и не прав - тогда поправь меня. Но по-моему нужно стараться использовать по-максимуму дефолтные библии, дабы облегчить жизнь админу - деплойщику. |
![]() |
|||
![]() ![]() Reality is wrong. Dreams are for real ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 1815 Пользователь №: 16955 На форуме: Карма: 98 ![]() |
Есть библиотеки которые попали в список по default,а есть которые не попали.В этом то и есть разница. В php в самом начале было всего пару библиотек,спустя года их уже десятки. Так же и на уровне linux.При настраивания сервера с чистого листа. Вы устанавливаете десятки разных библиотек. Само ядро линкус состит из одинх библиотек. В php Вы подключаете библиотеку строчкой extension=php_curl.dll и таких библиотек сотни. |
||
![]() |
![]() ![]() ![]() |