В моей предыдущей компании мы устанавливаем Подверсию, чтобы хранить файлы CAD. Файлы до 100 МБ хранились в Подверсии. Если многие люди 'добавляют', что большие файлы к веб-серверу Подверсии могут быть узким местом. Однако возрастающие фиксации были совершенно в порядке.
Подверсия сохранила 'двоичную дельту'. На самом деле, на стороне сервера, двоичные и текстовые файлы рассматривают точно то же в хранении 'дельты'. Проверьте "двоичную дельту, кодирующую раздел улучшений на странице http://subversion.tigris.org/svn_1.4_releasenotes.html . Это явно говорит" , Подверсия использует xdelta алгоритм для вычислений различий между строки байтов " (и не строки 'символов').
Только для эксперимента, я сохранил 10 версий CAD (файл части CATIA). Каждая версия я сделал незначительные модификации, чтобы разделить и затем проверить размер репозитория серверной стороны. Общий размер был о 1.2x приблизительно для 10 пересмотров (x - быть исходным размером файла).
Не забывают устанавливать свойство svn:needs-блокировки. По моему опыту, Лучший способ состоит в том, чтобы использовать 'автоматические опоры' для установки svn:needs-блокировки на основе расширения файла.
Я использовал StringTemplate с хорошими результатами. Некоторые ресурсы:
Как насчет T4, Набор инструментов преобразования текстовых шаблонов ? Он должен соответствовать вашим требованиям и встроен в Visual Studio.
Отличные ресурсы T4:
У меня есть механизм шаблонов, встроенный в мою библиотеку классов, который выглядит и работает аналогично старому стилю ASP или T4, если на то пошло.
Вы в основном пишете код C # в <%%> блоки и, таким образом, могут делать большинство вещей, которые может делать C #, с ограничением, что весь файл шаблона компилируется в один метод. Другими словами, вы не можете определять вспомогательные классы и тому подобное внутри шаблона, но для вспомогательных методов вы можете использовать анонимные методы.
Пример:
<%
var firstname = "Bob";
var count = 10;
for (Int32 index = 0; index < count; index++)
{
%>
<%= firstname %> x <%= index+1 %>/<%= count %>
<%
}
%>
Затем он будет скомпилирован в класс C # в другом домене приложений и может быть выполнен для возврата строки, содержащей созданный текст.
Вы также можете передать аргумент в шаблон, а также библиотеки ссылочных классов, что означает, что вы можете передавать пользовательские структуры данных или получать доступ к уровню доступа к данным или коду бизнес-логики из вашего шаблон.
Вы смотрели XSLT ? Вам придется начать с исходного формата данных в XML, возможно, с xml-сериализации ваших объектов данных. Вы можете с легкостью выполнять циклы и if, !
У Кэтлин Доллард есть книга по генерации кода с помощью XSLT .
Лично я большой поклонник T4 (особенно при генерации C #), но вы можете обнаружить, что, поскольку XML и HTML являются вашими типами вывода, XSLT вам подходит. К тому же он очень кроссплатформенный.
Вам может понадобиться этот механизм шаблонов .NET .
Код шаблона:
$Book.StaticId$
ID: $bk.BookId$ - Author: $bk.Author.Name$
Length of the author's Name: $bk.Author.Name.Length$
Код C #:
class Author
{
public string Name
{
get
{
return "John Borders";
}
}
}
class Book
{
public static string StaticId
{
get
{
return "AABB";
}
}
public int BookId
{
get
{
return 100;
}
}
public Author Author
{
get
{
return new Author();
}
}
}
public class PropertySample1
{
[STAThread]
static void Main()
{
TemplateEngine dt = new TemplateEngine();
dt.LoadFromFile("Template.tpl");
Book book = new Book();
dt.SetValue("bk", book);
dt.UsingNamespace("CSharp,Demo");
string output = dt.Run();
Console.WriteLine(output);
}
}
Вывод:
AABB
ID: 100 - Author: John Borders
12