Как добавить сгенерированные файлы в несколько проектов, используя инструменты Codesmith
-
24-10-2019 - |
Вопрос
Я использую Codesmith в своем текущем проекте и пытаюсь решить проблему. Для моего проекта Codesmith (.csp) я могу выбрать опцию, чтобы он автоматически добавил все сгенерированные файлы в текущий проект (.csproj). Но я хочу иметь возможность добавить выход к нескольким проектам (.csproj). Есть ли вариант внутри кода, чтобы разрешить это? Или есть хороший способ программно сделать это?
Спасибо.
Решение
Я не смог найти способ, чтобы коды обработали эту проблему автоматически, поэтому я в итоге написал пользовательский метод в коде, стоящем за файлом, чтобы справиться с этим.
Несколько примечаний: - Файлы 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);
}
Другие советы
Вы думали о том, чтобы просто собираться в общую сборку (DLL), на которую можно ссылаться все ваши проекты?
Я знаю, что это может не соответствовать вашим требованиям, но я бы предположил, что это будет одним из лучших способов достижения одного источника, который могут использовать все ваши проекты, а также только одну кодовую базу для поддержания при необходимости.