Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как слепить файл-мeнеджер?

379  1 2 все
Murr патриот21.02.18 17:42
Murr
21.02.18 17:42 

Как слепить файл-менеджер?

(Запутался, попытка систематизировать задачу).


Дано:


- Шаблоны (Т4-шаблоны).

Несколько (много) ДЛЛок с шаблонами, в каждой - несколько (много) шаблонов.

Шаблоны не содержат (и абсолютно нет желания их там иметь) операций ввода/вывода.

Шаблон предоставляет относительное короткое имя файла (зависит от исходных данных) куда сбросить результат.

Шаблон может требовать записи результатов генерации в - несколько файлов (опционально), - в один файл, - не требовать записи в файл - определяется наличием имплементаций интерфейсов.

Шаблоны не содержат полных путей - для их определения используется Файловый менеджер.

Шаблоны имеют атрибуты, в которых ожидается информация для фильтрации шаблонов по применимости и порядку применения


- Атрибуты шаблонов.

Содержат статическую информацию об: применимости шаблонов, версии, приоритете.


- Исходные данные.

Исходная информация для генерации чего-то там шаблонами.

Много разного, в том числе информация об том, куда писать (более одного места) результаты генерации.


- Файловый менеджер.

Управление записью результатов генерации в файл.

Хранение путей к файлам,

функциональность построения полного имени файла.

функциональность перезаписи файлов.


- Генератор.

Обычный многопоточный исполнитель, не имеющий информации об том что именно обрабатывается. Т.е. не знающий структуру исходных данных, способ генерации и детали записи.

Из ДДЛок (сейчас их около 20-ти) однократно в список выбираются подходящие шаблоны, в структуру представления читаются исходные данные из файлов (почти 1000) и генератор выполняет [шаблоны] х [исходные данные] => [файлы]


Вроде с данными все.

#1 
Murr патриот21.02.18 18:34
Murr
NEW 21.02.18 18:34 
в ответ Murr 21.02.18 17:42

Теперь - проблема.


Мне очень не хочется нагружать шаблоны лишней функциональностью.

В частности - функциональностью определения применимости шаблона в конкретном контексте и функциональностью записи/перезаписи файлов.


По применимости есть ограниченное, но - расширяемое, решение при формировании списка шаблонов.

Анализируются атрибуты и имплементация интерфейсов и по результатам принимается решение по включений в список.

Решение не полное - атрибуты не содержат, например, имен файлов - оно и понятно - это часть исходных данных и она будет доступна только после инстанцирования шаблонов.

Так что часть работы по применимости все одно ляжет либо на файловый менеджер, либо на генератор, либо будет вынесена еще куда-то.

Но это - пока не критично.


Критичная часть - функциональность записи.

Опять таки - Я не хочу иметь ее в шаблоне. Совсем не хочу. Вплоть до того, что не хочу давать шаблону возможность определять имя файла.

Хочу иметь отдельный и легко заменяемый (или - управляемый) менеджер записи (файловый менеджер), который будет записывать результат генерации в файл.

Возможно, что он так же должен будет отвечать на вопрос - а надо ли вообще генерировать данным шаблоном при этих исходных данных ?


Пока вроде как все получается сделать:

- шаблоны фильтруются изначально и отбираются те, которые требуют генерировать файл.

- параметры для шаблона вынесены из шаблона (в шаблоне только аксессоры) и могут быть расшарены с файловым менеджером.


А дальше начинается непонятное: надо каким-то образом решать проблему назначения файл-менеджера для шаблона.

Мне хочется, чтобы перезаписываемые файлы ложились в одну папку, а не перезаписываемые - в другую.

Например так:

C:\_generated\Overwritebale\Solution1\Project1\A.cs

C:\_generated\ManualCode\Solution1\Project1\A.cs

где A.cs - partial class.

Ожидается, что в МануалКоде будет добавлятся ручная часть кодирования.

В примере используются или два шаблона, или один с дополнительным параметром.

При этом часть путей C:\_generated\Overwritebale\ и C:\_generated\ManualCode\ определены в Исходных данных,


Допустим есть два разных файл-менеджера и два шаблона и надо выбрать подходящий и связать его с шаблоном или потоком.


Как и когда это делать?

или

Куда и какую информацию добавить чтобы это было просто?


#2 
Murr патриот23.02.18 12:57
Murr
NEW 23.02.18 12:57 
в ответ Murr 21.02.18 18:34

Пока понятно, что надо полностью исключать формирование имени файла в шаблоне.

Есть параметры вызова шаблона - из них строится часть имени файла.

Функция, которая строит имя файла, пока еще находится в шаблоне - надо удалять и переносить менеджер файлов.

По параметрам... они тоже были в шаблоне - копировались туда перед вызовом - надо оформлять в дополнительный класс и иметь один зашаренный инстансе на поток.


По назначению файл-менеджеров.

Идея такая - вместо единого списка шаблонов и выяснения в процессе генерации какой файл-менеджер должен использоваться, построить изначально словарик <манагер, список шаблонов>.

Будут проблемы с распределением рабочих потоков при переходе с одной группы на другую.


В плане посторения имени файла.

Нужно что-то, что будет извлекать из Исходных данных имена папок.

При этом построение имени - не линейное, т.е. нельзя сделать (схема "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


#3 
  beatus свой человек23.02.18 21:24
beatus
NEW 23.02.18 21:24 
в ответ Murr 23.02.18 12:57
Исходных данных имена папок.
При этом построение имени - не линейное, т.е. нельзя сделать (схема "1/1/1.Е"):
Типичная задача из раздела "большие данные". Нетривиальная то есть. Сомневаюсь, что Вам тут помогут.
#4 
AlexNek патриот23.02.18 22:42
AlexNek
NEW 23.02.18 22:42 
в ответ beatus 23.02.18 21:24

Для начала нужно осилить - что же требуется. Ну например файл менеджер у меня ассоциируется, что то типа нортон коммандера.

#5 
  beatus свой человек23.02.18 22:47
beatus
NEW 23.02.18 22:47 
в ответ AlexNek 23.02.18 22:42
А у меня ассоциируется с менеджером, типа менеджера, только папочного.
#6 
AlexNek патриот23.02.18 23:13
AlexNek
NEW 23.02.18 23:13 
в ответ beatus 23.02.18 22:47

"Как вы яхту назовете, так она и поплывет." спок

#7 
Murr патриот26.02.18 11:54
Murr
NEW 26.02.18 11:54 
в ответ beatus 23.02.18 21:24

Задача ооочень далека от "больших данных" - просто нужно элементарное управляемое формирование полного имени файла.


Цель поста - не получение помощи, а систематизация исходных условий - эта часть делается в перерывах между модификацией 2-х гигабайт кода - когда там тупик - отвлекаюсь на это...

#8 
Murr патриот26.02.18 12:03
Murr
NEW 26.02.18 12:03 
в ответ AlexNek 23.02.18 22:42

что же требуется

-----

Если Я напишу PathManager тебе полегчает?

Или нужно WriteManager? спок


А что требуется Я уже осознал - на первом этапе - вынести формирование имени из шаблона.

Полностью.

Текущая проблема:

в шаблоне есть директива <#@ output extension=".dat" #>

не имею представления как програмно извлечь значение заданное для extension.

Googla & StatckOverflow говорят об других вещах.

Быстрый поиск по сорсникам Т4Тоол результата тоже не дал...

Возможно нужно Хост делать...

#9 
AlexNek патриот26.02.18 21:00
AlexNek
NEW 26.02.18 21:00 
в ответ Murr 26.02.18 12:03
Если Я напишу PathManager тебе полегчает?

По крайней мере ближе, хотя тоже не нравится. Но один фиг сейчас много времени все равно нет


"просто нужно элементарное управляемое формирование полного имени файла"


как програмно извлечь значение заданное для extension

ну так и нефиг его туды сувать. Пусть будет там где можно прочесть и шаблон пусть берёт оттуда же

#10 
Murr патриот26.02.18 22:20
Murr
NEW 26.02.18 22:20 
в ответ AlexNek 26.02.18 21:00

хотя тоже не нравится.

-----

A2734 - подойдет?


ну так и нефиг его туды сувать.

------

Я его туда и не суваю - оно там в соответствии с доками...

Вот как его оттуда достают - не понимаю - в теле класса этого кода нет...

#11 
AlexNek патриот27.02.18 22:05
AlexNek
NEW 27.02.18 22:05 
в ответ Murr 26.02.18 22:20
A2734 - подойдет?

тогда уж лучше RA-96023, хоть что то можно вспомнить спок

Хорошее имя подобрать не просто.


Так расширение нужно только как текст вбивать? Нельзя из какого файла прочитать?

#12 
Murr_0002 знакомое лицо28.02.18 10:11
Murr_0002
NEW 28.02.18 10:11 
в ответ AlexNek 27.02.18 22:05

Так расширение нужно только как текст вбивать?

------

Не понял вопроса.

Есть шаблон. В шаблоне есть директива как указано выше.

Генерируемый на базе шаблона файл, по документации, должен иметь указанное в директиве расширение.


Нельзя из какого файла прочитать?

------

??? - шаблон транслируется в класс. В коде класса какого-либо упоминания об директиве и расширении нет.

А исходный текст шаблона по-определению не доступен...


Надо будет помучить билли на предмет этой лажи... безум

#13 
AlexNek патриот28.02.18 23:26
AlexNek
NEW 28.02.18 23:26 
в ответ Murr_0002 28.02.18 10:11
в шаблоне есть директива <#@ output extension=".dat" #>

Только так и никак иначе? Типа энтого?

<#@ output extension=GetMyExtensionDat() #>

#14 
Murr_0002 знакомое лицо01.03.18 10:00
Murr_0002
NEW 01.03.18 10:00 
в ответ AlexNek 28.02.18 23:26, Последний раз изменено 01.03.18 10:19 (Murr_0002)

Тут дока:

https://msdn.microsoft.com/en-us/library/gg586943.aspx?f=2...

Нее, там нефига нету...


Кстати, так же и по остальным директивам... полная лажа...


В MSDN Community Support предлагают... повторно парсить исходник шаблона...

#15 
AlexNek патриот02.03.18 00:18
AlexNek
NEW 02.03.18 00:18 
в ответ Murr_0002 01.03.18 10:00

А имя шаблона хоть есть? Или хоть что то для идентификации конкретного шаблона

#16 
Murr_0002 знакомое лицо02.03.18 08:51
Murr_0002
NEW 02.03.18 08:51 
в ответ AlexNek 02.03.18 00:18

Я так понимаю, что тебя интересует имя класса, сгенерированного при компиляции шаблона.

Таковое, разумеется, есть - совпадает с именем файла в который записан шаблон.

Но! В сгенерированном классе нет информации об директивах...

#17 
Murr_0002 знакомое лицо02.03.18 08:53
Murr_0002
NEW 02.03.18 08:53 
в ответ Murr_0002 02.03.18 08:51

П.С. То, что должен породить файл-менеджер никак не связано с именем шаблона.

#18 
AlexNek патриот02.03.18 23:08
AlexNek
NEW 02.03.18 23:08 
в ответ Murr_0002 02.03.18 08:53

меня конечный результат пока не интересует. Есть задача определить какое расширение пользует шаблон.

Если 1 шаблон=1 файл, то после первого запуска можно сделать словарь "имя"-"расширение", а после его уже пользовать

#19 
Murr_0002 знакомое лицо02.03.18 23:32
Murr_0002
NEW 02.03.18 23:32 
в ответ AlexNek 02.03.18 23:08

можно сделать словарь "имя"-"расширение"

-----

А откуда ты собираешься взять "расширение"? Среди пропертей сгенерированного класса его нет. Вообще нет в сгенерированном коде.


Если 1 шаблон=1 файл

------

Один шаблон => много файлов.

Можно все загнать в один, но мне нравится когда все отдельно...

#20 
AlexNek патриот03.03.18 00:18
AlexNek
NEW 03.03.18 00:18 
в ответ Murr_0002 02.03.18 23:32
А откуда ты собираешься взять "расширение"?

ну так сгенерированный файл то имеет расширение - вот его и взять.


Можно все загнать в один, но мне нравится когда все отдельно...

И каждый файл должен быть в своем "абсолютном" каталоге спок, типа не "относительно" базового

#21 
Murr_0002 знакомое лицо03.03.18 00:51
Murr_0002
NEW 03.03.18 00:51 
в ответ AlexNek 03.03.18 00:18

ну так сгенерированный файл то имеет расширение - вот его и взять.

-----

Если Я правильно тебя понял, то предлагается генерировать файлы с расширением dll, независимо от содержания...


не "относительно" базового

------

Как раз забота файл-менеджера слепить правильное имя файла.

Но красивого решения пока не вижу.

#22 
AlexNek патриот03.03.18 13:25
AlexNek
NEW 03.03.18 13:25 
в ответ Murr_0002 03.03.18 00:51
Если Я правильно тебя понял, то предлагается генерировать файлы с расширением dll, независимо от содержания...

не что то не так. Есть файл шаблона, у шаблона есть расширение генерируемого файла, шаблон может сгенерировать файл - фот этот файл и интересует.


слепить правильное имя файла.

В "черном ящике" этого не сделать нужна еще дополнительная инфа

Можно еще в шаблоны расширение самому записывать, то бишь сделать шаблоны многопроходными. Вначале генерим нужные шаблоны, а из них уже что надо

#23 
Murr_0002 знакомое лицо03.03.18 13:40
Murr_0002
NEW 03.03.18 13:40 
в ответ AlexNek 03.03.18 13:25

у шаблона есть расширение генерируемого файла

-----

У шаблона есть указанная выше директива.

У класса, в который этот шаблон транслируется, этой информации нет.


шаблон может сгенерировать файл

-----

Шаблон не генерирует файл - шаблон, точнее - странслированный из шаблона класс, генерирует текст, который может быть (а может и не быть) записан в файл.

В шаблоне есть директива, определяющая какое расширение надо дать файлу, если таковой надо записать. В классе этой информации нет.



нужна еще дополнительная инфа

-----

Вот Я и пытался получить ее оттуда, где ее нету...



Можно еще в шаблоны расширение самому записывать

------

Можно. Но руками.

Мне же категорически не хочется делать это руками - либо при трансляции, либо вообще вне шаблонов...



Вначале генерим нужные шаблоны, а из них уже что надо

-----

А фиг там - билли слепил так, что никак не подменить дефолтный транслятор...

#24 
AlexNek патриот03.03.18 14:59
AlexNek
NEW 03.03.18 14:59 
в ответ Murr_0002 03.03.18 13:40
А фиг там - билли слепил так, что никак не подменить дефолтный транслятор

String.Replace("@@MyExtension@@",".dat")


Вот Я и пытался получить ее оттуда, где ее нету...

не надо ее получать, создай ее сам и распредели куда нужно

#25 
Murr_0002 знакомое лицо03.03.18 15:13
Murr_0002
NEW 03.03.18 15:13 
в ответ AlexNek 03.03.18 14:59

String.Replace("@@MyExtension@@",".dat")

------

Еще раз - есть директива output. В ней задано какое должно быть расширение.

Эта информация отбрасывается при трансляции - ее нет в результирующем классе.

Исходные тексты шаблонов после трансляции недоступны.

Что на что ты предлагаешь заменять?


создай ее сам

-----

Это, разумеется, можно.

Но:

- выпадаем из описанного стандарта

- ручная работа


Так что Я скорее всего буду искать вариант с заменой транслятора - оригинальный Я уже распотрошил и даже отделил генерацию от анализа исходного текста...

#26 
AlexNek патриот03.03.18 15:34
AlexNek
NEW 03.03.18 15:34 
в ответ Murr_0002 03.03.18 15:13
Еще раз - есть директива output. В ней задано какое должно быть расширение.

у меня это и есть ".dat"


Исходные тексты шаблонов после трансляции недоступны.

ну а до трансляции?


- ручная работа

А шаблоны делать не ручная работа?

#27 
Murr_0002 знакомое лицо03.03.18 16:03
Murr_0002
NEW 03.03.18 16:03 
в ответ AlexNek 03.03.18 15:34

у меня это и есть ".dat"

-----

И где ты его взял? что будет, если автор поменяет значение в директиве?


ну а до трансляции?

-----

А что было ДО - роли не играет - поставляется dll.



А шаблоны делать не ручная работа?

-----

Ручная. Потому ее надо минимизировать. Есть описанная в доках директива - ее и надо юзать. Лепить что- то дублирующее - не надо.

#28 
AlexNek патриот03.03.18 16:18
AlexNek
NEW 03.03.18 16:18 
в ответ Murr_0002 03.03.18 16:03
А что было ДО - роли не играет - поставляется dll

Ну тогда шаблонам вообще нужно знать только стреам куда писать, никаких файлов

#29 
AlexNek патриот03.03.18 16:27
AlexNek
NEW 03.03.18 16:27 
в ответ Murr_0002 03.03.18 16:03

Можно еще не конечное расширение в шаблоне задавать а какой то код типа ".831315"

#30 
Murr_0002 знакомое лицо05.03.18 11:03
Murr_0002
NEW 05.03.18 11:03 
в ответ AlexNek 03.03.18 16:18

нужно знать только стреам куда писать

-----

В принципе - да.

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

Потому как не хочу себя искушать втискиванием ИО в шаблон.

Бо, хочу шаблон - отдельно, запись результата в файл - отдельно и заменяемо.

#31 
Murr_0002 знакомое лицо05.03.18 11:07
Murr_0002
NEW 05.03.18 11:07 
в ответ AlexNek 03.03.18 16:27

Можно еще не конечное расширение в шаблоне задавать а какой то код типа ".831315"

------

Да ради бога - только БЕЗ ручной (вне описанного "стандарта") кодировки.


Сейчас мучаю тех.суппорт билли на предмет - как же так - директива есть, а данные в компилированном виде недоступны? - пока не признали факт, но не признали наличие проблемы...

#32 
AlexNek патриот05.03.18 23:10
AlexNek
NEW 05.03.18 23:10 
в ответ Murr_0002 05.03.18 11:07
Сейчас мучаю тех.суппорт билли

Бесполезная трата времени, они делают только то что им лично надо.

Никак только не пойму отчего тебе это расширение нужно

#33 
Murr_0002 знакомое лицо05.03.18 23:59
Murr_0002
NEW 05.03.18 23:59 
в ответ AlexNek 05.03.18 23:10

Оно в доках описано. А у меня установка - чем ближе к докам - тем лучше...

#34 
AlexNek патриот06.03.18 00:11
AlexNek
NEW 06.03.18 00:11 
в ответ Murr_0002 05.03.18 23:59

А кто доки и шаблоны пишет?

#35 
Murr_0002 знакомое лицо06.03.18 11:05
Murr_0002
NEW 06.03.18 11:05 
в ответ AlexNek 06.03.18 00:11

Доки на Т4 написаны мелкомягкими.

А кто пишет шаблоны - не важно, важно чтобы они оставались соответствующими докам.

#36 
AlexNek патриот06.03.18 21:47
AlexNek
NEW 06.03.18 21:47 
в ответ Murr_0002 06.03.18 11:05
А у меня установка

А я подумал "устройство"/девайс...

Шаблоны то кто "контроллирует"?

#37 
1 2 все