Cómo agregar archivos generados a múltiples proyectos utilizando herramientas Codesmith

StackOverflow https://stackoverflow.com/questions/2969025

  •  24-10-2019
  •  | 
  •  

Pregunta

Estoy usando Codesmith en mi proyecto actual y estoy tratando de encontrar un problema. Para mi proyecto CodesMith (.csp), puedo seleccionar una opción para agregar automáticamente todos los archivos generados al proyecto actual (.csproj). Pero quiero poder agregar la salida a múltiples proyectos (.csproj). ¿Hay una opción dentro de Codesmith para permitir esto? ¿O hay una buena manera de hacer eso programáticamente?

Gracias.

¿Fue útil?

Solución

No pude encontrar una manera de hacer que Codesmith maneje este problema automáticamente, por lo que terminé escribiendo un método personalizado en el código detrás del archivo para manejar esto.

Algunas notas: - Los archivos PROJ son XML y, por lo tanto, son bastante fáciles de editar, pero el nodo real "itemgroup" que contiene la lista de archivos que se incluyen en el proyecto no está realmente etiquetado de manera especial. Terminé eligiendo el nodo "itemgroup" que tiene nodos infantiles "contiene", pero podría haber una mejor manera de determinar cuál debe usar. - Recomiendo hacer todos los cambios de archivo PROJ a la vez, en lugar de que cada archivo se cree/actualice. De lo contrario, si lanza la generación de Visual Studio, puede obtener una avalancha de "este elemento ha cambiado, ¿le gustaría recargar"? Si sus archivos están bajo control de origen (¿están, ¿verdad?), Vas a Necesita manejar los archivos de control y agregarlos al control de origen junto con la edición de los archivos PROJ.

Aquí está (más o menos) el código que usé para agregar un archivo al proyecto:

/// <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); 

}

Otros consejos

¿Has pensado en compilar solo en un ensamblaje compartido (DLL) que luego puede ser referenciado por todos sus proyectos?

Sé que esto puede no satisfacer sus requisitos, pero supongo que esta sería una de las mejores formas de lograr una sola fuente que todos sus proyectos puedan usar y también solo una base de código para mantener según sea necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top