Как слепить файл-мeнеджер?
Как слепить файл-менеджер?
(Запутался, попытка систематизировать задачу).
Дано:
- Шаблоны (Т4-шаблоны).
Несколько (много) ДЛЛок с шаблонами, в каждой - несколько (много) шаблонов.
Шаблоны не содержат (и абсолютно нет желания их там иметь) операций ввода/вывода.
Шаблон предоставляет относительное короткое имя файла (зависит от исходных данных) куда сбросить результат.
Шаблон может требовать записи результатов генерации в - несколько файлов (опционально), - в один файл, - не требовать записи в файл - определяется наличием имплементаций интерфейсов.
Шаблоны не содержат полных путей - для их определения используется Файловый менеджер.
Шаблоны имеют атрибуты, в которых ожидается информация для фильтрации шаблонов по применимости и порядку применения
- Атрибуты шаблонов.
Содержат статическую информацию об: применимости шаблонов, версии, приоритете.
- Исходные данные.
Исходная информация для генерации чего-то там шаблонами.
Много разного, в том числе информация об том, куда писать (более одного места) результаты генерации.
- Файловый менеджер.
Управление записью результатов генерации в файл.
Хранение путей к файлам,
функциональность построения полного имени файла.
функциональность перезаписи файлов.
- Генератор.
Обычный многопоточный исполнитель, не имеющий информации об том что именно обрабатывается. Т.е. не знающий структуру исходных данных, способ генерации и детали записи.
Из ДДЛок (сейчас их около 20-ти) однократно в список выбираются подходящие шаблоны, в структуру представления читаются исходные данные из файлов (почти 1000) и генератор выполняет [шаблоны] х [исходные данные] => [файлы]
Вроде с данными все.
Теперь - проблема.
Мне очень не хочется нагружать шаблоны лишней функциональностью.
В частности - функциональностью определения применимости шаблона в конкретном контексте и функциональностью записи/перезаписи файлов.
По применимости есть ограниченное, но - расширяемое, решение при формировании списка шаблонов.
Анализируются атрибуты и имплементация интерфейсов и по результатам принимается решение по включений в список.
Решение не полное - атрибуты не содержат, например, имен файлов - оно и понятно - это часть исходных данных и она будет доступна только после инстанцирования шаблонов.
Так что часть работы по применимости все одно ляжет либо на файловый менеджер, либо на генератор, либо будет вынесена еще куда-то.
Но это - пока не критично.
Критичная часть - функциональность записи.
Опять таки - Я не хочу иметь ее в шаблоне. Совсем не хочу. Вплоть до того, что не хочу давать шаблону возможность определять имя файла.
Хочу иметь отдельный и легко заменяемый (или - управляемый) менеджер записи (файловый менеджер), который будет записывать результат генерации в файл.
Возможно, что он так же должен будет отвечать на вопрос - а надо ли вообще генерировать данным шаблоном при этих исходных данных ?
Пока вроде как все получается сделать:
- шаблоны фильтруются изначально и отбираются те, которые требуют генерировать файл.
- параметры для шаблона вынесены из шаблона (в шаблоне только аксессоры) и могут быть расшарены с файловым менеджером.
А дальше начинается непонятное: надо каким-то образом решать проблему назначения файл-менеджера для шаблона.
Мне хочется, чтобы перезаписываемые файлы ложились в одну папку, а не перезаписываемые - в другую.
Например так:
C:\_generated\Overwritebale\Solution1\Project1\A.cs
C:\_generated\ManualCode\Solution1\Project1\A.cs
где A.cs - partial class.
Ожидается, что в МануалКоде будет добавлятся ручная часть кодирования.
В примере используются или два шаблона, или один с дополнительным параметром.
При этом часть путей C:\_generated\Overwritebale\ и C:\_generated\ManualCode\ определены в Исходных данных,
Допустим есть два разных файл-менеджера и два шаблона и надо выбрать подходящий и связать его с шаблоном или потоком.
Как и когда это делать?
или
Куда и какую информацию добавить чтобы это было просто?
Пока понятно, что надо полностью исключать формирование имени файла в шаблоне.
Есть параметры вызова шаблона - из них строится часть имени файла.
Функция, которая строит имя файла, пока еще находится в шаблоне - надо удалять и переносить менеджер файлов.
По параметрам... они тоже были в шаблоне - копировались туда перед вызовом - надо оформлять в дополнительный класс и иметь один зашаренный инстансе на поток.
По назначению файл-менеджеров.
Идея такая - вместо единого списка шаблонов и выяснения в процессе генерации какой файл-менеджер должен использоваться, построить изначально словарик <манагер, список шаблонов>.
Будут проблемы с распределением рабочих потоков при переходе с одной группы на другую.
В плане посторения имени файла.
Нужно что-то, что будет извлекать из Исходных данных имена папок.
При этом построение имени - не линейное, т.е. нельзя сделать (схема "1/1/1.Е"):
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.FolderName + "." + template.FileExtention)
где Params.Top - "верхний" элемент в списке параметров
Т.к. часто будет нужна достаточно сложная схема скажем ("-1/1/1/1.Е"?)
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.FolderName + "." + template.FileExtention)
еще - нужно комбинировать имя файла из нескольких элементов ("-1/1/1/3_2_1.Е"?)
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.Parent.Parent.FolderName + "_" + Params.Top.Parent.FolderName + "_" + Params.Top.FolderName + "." + template.FileExtention)
Видимо надо вводить понятие Схема Имени Файла
Пока можно оставить что-то простое - схема=построитель, где схема фиксированная лайбла а построитель - предопределен. (не нравится, но имплементируется легко и быстро)
Pause
Задача ооочень далека от "больших данных" - просто нужно элементарное управляемое формирование полного имени файла.
Цель поста - не получение помощи, а систематизация исходных условий - эта часть делается в перерывах между модификацией 2-х гигабайт кода - когда там тупик - отвлекаюсь на это...
что же требуется
-----
Если Я напишу PathManager тебе полегчает?
Или нужно WriteManager?
А что требуется Я уже осознал - на первом этапе - вынести формирование имени из шаблона.
Полностью.
Текущая проблема:
в шаблоне есть директива <#@ output extension=".dat" #>
не имею представления как програмно извлечь значение заданное для extension.
Googla & StatckOverflow говорят об других вещах.
Быстрый поиск по сорсникам Т4Тоол результата тоже не дал...
Возможно нужно Хост делать...
Если Я напишу PathManager тебе полегчает?
По крайней мере ближе, хотя тоже не нравится. Но один фиг сейчас много времени все равно нет
"просто нужно элементарное управляемое формирование полного имени файла"
как програмно извлечь значение заданное для extension
ну так и нефиг его туды сувать. Пусть будет там где можно прочесть и шаблон пусть берёт оттуда же
Так расширение нужно только как текст вбивать?
------
Не понял вопроса.
Есть шаблон. В шаблоне есть директива как указано выше.
Генерируемый на базе шаблона файл, по документации, должен иметь указанное в директиве расширение.
Нельзя из какого файла прочитать?
------
??? - шаблон транслируется в класс. В коде класса какого-либо упоминания об директиве и расширении нет.
А исходный текст шаблона по-определению не доступен...
Надо будет помучить билли на предмет этой лажи...
Тут дока:
https://msdn.microsoft.com/en-us/library/gg586943.aspx?f=2...
Нее, там нефига нету...
Кстати, так же и по остальным директивам... полная лажа...
В MSDN Community Support предлагают... повторно парсить исходник шаблона...
можно сделать словарь "имя"-"расширение"
-----
А откуда ты собираешься взять "расширение"? Среди пропертей сгенерированного класса его нет. Вообще нет в сгенерированном коде.
Если 1 шаблон=1 файл
------
Один шаблон => много файлов.
Можно все загнать в один, но мне нравится когда все отдельно...
А откуда ты собираешься взять "расширение"?
ну так сгенерированный файл то имеет расширение - вот его и взять.
Можно все загнать в один, но мне нравится когда все отдельно...
И каждый файл должен быть в своем "абсолютном" каталоге , типа не "относительно" базового
ну так сгенерированный файл то имеет расширение - вот его и взять.
-----
Если Я правильно тебя понял, то предлагается генерировать файлы с расширением dll, независимо от содержания...
не "относительно" базового
------
Как раз забота файл-менеджера слепить правильное имя файла.
Но красивого решения пока не вижу.
Если Я правильно тебя понял, то предлагается генерировать файлы с расширением dll, независимо от содержания...
не что то не так. Есть файл шаблона, у шаблона есть расширение генерируемого файла, шаблон может сгенерировать файл - фот этот файл и интересует.
слепить правильное имя файла.
В "черном ящике" этого не сделать нужна еще дополнительная инфа
Можно еще в шаблоны расширение самому записывать, то бишь сделать шаблоны многопроходными. Вначале генерим нужные шаблоны, а из них уже что надо
у шаблона есть расширение генерируемого файла
-----
У шаблона есть указанная выше директива.
У класса, в который этот шаблон транслируется, этой информации нет.
шаблон может сгенерировать файл
-----
Шаблон не генерирует файл - шаблон, точнее - странслированный из шаблона класс, генерирует текст, который может быть (а может и не быть) записан в файл.
В шаблоне есть директива, определяющая какое расширение надо дать файлу, если таковой надо записать. В классе этой информации нет.
нужна еще дополнительная инфа
-----
Вот Я и пытался получить ее оттуда, где ее нету...
Можно еще в шаблоны расширение самому записывать
------
Можно. Но руками.
Мне же категорически не хочется делать это руками - либо при трансляции, либо вообще вне шаблонов...
Вначале генерим нужные шаблоны, а из них уже что надо
-----
А фиг там - билли слепил так, что никак не подменить дефолтный транслятор...
String.Replace("@@MyExtension@@",".dat")
------
Еще раз - есть директива output. В ней задано какое должно быть расширение.
Эта информация отбрасывается при трансляции - ее нет в результирующем классе.
Исходные тексты шаблонов после трансляции недоступны.
Что на что ты предлагаешь заменять?
создай ее сам
-----
Это, разумеется, можно.
Но:
- выпадаем из описанного стандарта
- ручная работа
Так что Я скорее всего буду искать вариант с заменой транслятора - оригинальный Я уже распотрошил и даже отделил генерацию от анализа исходного текста...
у меня это и есть ".dat"
-----
И где ты его взял? что будет, если автор поменяет значение в директиве?
ну а до трансляции?
-----
А что было ДО - роли не играет - поставляется dll.
А шаблоны делать не ручная работа?
-----
Ручная. Потому ее надо минимизировать. Есть описанная в доках директива - ее и надо юзать. Лепить что- то дублирующее - не надо.
нужно знать только стреам куда писать
-----
В принципе - да.
Я собирался заменить базовый СтрингБилдер на МемориСтреам, но пока притормозил это дело.
Потому как не хочу себя искушать втискиванием ИО в шаблон.
Бо, хочу шаблон - отдельно, запись результата в файл - отдельно и заменяемо.
Можно еще не конечное расширение в шаблоне задавать а какой то код типа ".831315"
------
Да ради бога - только БЕЗ ручной (вне описанного "стандарта") кодировки.
Сейчас мучаю тех.суппорт билли на предмет - как же так - директива есть, а данные в компилированном виде недоступны? - пока не признали факт, но не признали наличие проблемы...