Как добавить сгенерированные файлы к нескольким проектам с помощью инструментов CodeSmith

Я использую CodeSmith на своем текущем проекте, и я пытаюсь выяснить проблему. Для моего проекта CodeSmith (.csp) я могу выбрать опцию иметь его, автоматически добавляют все сгенерированные файлы к текущему проекту (.csproj). Но я хочу смочь добавить вывод к нескольким проектам (.csproj). Существует ли опция в CodeSmith для разрешения этого? Или есть ли хороший способ программно сделать это?

Спасибо.

1
задан Dugan 3 June 2010 в 19:15
поделиться

2 ответа

Мне не удалось придумать способ заставить CodeSmith обрабатывать эту проблему автоматически, поэтому я написал собственный метод в файле Code Behind для решения этой проблемы.

Несколько примечаний: - Файлы proj представляют собой XML, поэтому их довольно легко редактировать, но фактический узел «ItemGroup», содержащий список файлов, включенных в проект, на самом деле не помечен каким-либо особым образом. В итоге я выбрал узел «ItemGroup», у которого есть дочерние узлы «Содержит», но может быть лучший способ определить, какой из них следует использовать. - Я рекомендую вносить все изменения в файл proj сразу, а не по мере создания / обновления каждого файла. В противном случае, если вы запустите генерацию из Visual Studio, вы можете получить поток «Этот элемент был изменен, вы хотите перезагрузить» - Если ваши файлы находятся в системе управления версиями (они, верно ?!), вам нужно будет обрабатывать проверку файлов и добавление их в систему управления версиями вместе с редактированием файлов proj.

Вот (более или менее) код, который я использовал для добавления файла в проект:

/// <summary>
/// Adds the given file to the indicated project
/// </summary>
/// <param name="project">The path of the proj file</param>
/// <param name="projectSubDir">The subdirectory of the project that the 
/// file is located in, otherwise an empty string if it is at the project root</param>
/// <param name="file">The name of the file to be added to the project</param>
/// <param name="parent">The name of the parent to group the file to, an 
/// empty string if there is no parent file</param>
public static void AddFileToProject(string project, string projectSubDir, 
        string file, string parent)
{
    XDocument proj = XDocument.Load(project);

    XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
    var itemGroup = proj.Descendants(ns + "ItemGroup").FirstOrDefault(x => x.Descendants(ns + "Compile").Count() > 0);

    if (itemGroup == null)
        throw new Exception(string.Format("Unable to find an ItemGroup to add the file {1} to the {0} project", project, file));

    //If the file is already listed, don't bother adding it again
    if(itemGroup.Descendants(ns + "Compile").Where(x=>x.Attribute("Include").Value.ToString() == file).Count() > 0)
        return; 

    XElement item = new XElement(ns + "Compile", 
                    new XAttribute("Include", Path.Combine(projectSubDir,file)));

    //This is used to group files together, in this case the file that is 
    //regenerated is grouped as a dependent of the user-editable file that
    //is not changed by the code generator
    if (string.IsNullOrEmpty(parent) == false)
        item.Add(new XElement(ns + "DependentUpon", parent));

    itemGroup.Add(item);

    proj.Save(project); 

}
2
ответ дан 3 September 2019 в 00:04
поделиться

Задумывались ли вы о компиляции в общую сборку (DLL), на которую затем могут ссылаться все ваши проекты?

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

0
ответ дан 3 September 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: