visual una studio soluciones solucion que proyectos proyecto nueva hechos explorador ejemplos definicion crear como agregar xml visual-studio visual-studio-2013 csproj

xml - una - Orden ordenado de archivos en.csproj



proyectos hechos en visual basic 2010 (1)

En un Visual Studio csproj, los archivos para compilar se referencian de esta manera:

<ItemGroup> <Compile Include="C/Something.cs"> <Compile Include="B/SomethingElse.cs"> <Compile Include="A/YetSomethingElse.cs"> </ItemGroup>

Me parece que el orden es aleatorio (al menos no puedo ver un principio de pedido).

Sucedió algunas veces que durante la fijación de conflictos de combinación, erróneamente agregué un archivo dos veces (ya que hay muchos archivos y el archivo en la línea del conflicto de fusión ya estaba en otra posición en la lista). Esto sería fácil de evitar si hubiera una forma de simplemente ordenar alfabéticamente los archivos de Compile Include d.

¿Ya es posible (o tengo que escribir un script yo mismo)? ¿Hay algún efecto secundario que deba tener en cuenta?


Acabo de encontrarme con este problema ya que más miembros de nuestro equipo se comprometen sin su archivo de solución, agregamos el archivo a la solución de forma independiente, confirman su archivo de solución y Team Foundation Server / Visual Studio Online no logran la fusión correctamente.

Algunos archivos se agregaron dos veces, algunos no se agregaron en absoluto, todos con un archivo en un orden diferente: fusionar el infierno.

He trabajado para evitar la capacidad de ordenar los archivos de contenido dentro de una solución usando el siguiente C #, que ejecuto en el impresionante LinqPad.

var documentsLocation = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); var unsortedFilePath = Path.Combine(documentsLocation.ToString(), "UnsortedConfigItems.xml"); var unsortedFile = new FileInfo(unsortedFilePath); if (!unsortedFile.Exists) { throw new FileNotFoundException(string.Format("The unsorted file could not be found at path {0}", unsortedFilePath)); } var sortedFilePath = Path.Combine(documentsLocation, "SortedConfigItems.xml"); const string RootNodeName = "ItemGroup"; const string IncludeAttributeName = "Include"; var contentElementNames = new [] { "Compile", "Content", "None" }; var xmlFile = XDocument.Load(unsortedFile.FullName); if (xmlFile == null || xmlFile.Root == null || xmlFile.Root.Name != RootNodeName) { Console.WriteLine("Invalid file or unexpected file schema"); return; } var allElements = xmlFile.Root.Elements(); var contentElements = new List<XElement>(); foreach(var elementName in contentElementNames) { contentElements.AddRange(xmlFile.Root.Elements(elementName)); } var elementsWithInclude = contentElements.Where(ce => ce.Attribute(IncludeAttributeName) != null && !string.IsNullOrWhiteSpace(ce.Attribute(IncludeAttributeName).Value)); if (!elementsWithInclude.Any()) { Console.WriteLine("No content elements to sort"); return; } contentElements = null; // Make candidate for garbage collection var uniqueElements = new List<XElement>(elementsWithInclude.Count()); foreach (var element in elementsWithInclude) { if (!uniqueElements.Any(e => e.Attribute(IncludeAttributeName).Value == element.Attribute(IncludeAttributeName).Value)) { uniqueElements.Add(element); } } var sortedUniqueElements = uniqueElements.OrderBy(ue => ue.Name.LocalName).ThenBy(ue => ue.Attribute(IncludeAttributeName).Value).ToList(); var remainingElements = new List<XElement>(); foreach (var element in allElements.Where(ae => !elementsWithInclude.Contains(ae))) { // This uses elements with include and not sorted unique to avoid re-adding filtered files remainingElements.Add(element); } var sortedFile = new XDocument(); sortedFile.AddFirst(new XElement(RootNodeName)); sortedUniqueElements.ForEach(sue => sortedFile.Root.Add(sue)); remainingElements.ForEach(re => sortedFile.Root.Add(re)); sortedFile.Save(sortedFilePath);

Estoy seguro de que podría comprimirse ligeramente y hacerse más elegante, pero hace el trabajo por nosotros.

Pasos para completar

  1. Asegúrese de que su archivo de proyecto esté respaldado , ya sea en Source Control o localmente.

  2. Haga clic derecho en el Proyecto en el Explorador de soluciones y seleccione "Descargar proyecto" (si el archivo del proyecto no se muestra y solo tiene un proyecto en la solución, seleccione "Mostrar siempre solución" en las opciones de Visual Studio).

  3. El icono del proyecto debería haber cambiado y aparecerá como "(no disponible)". Haga clic derecho de nuevo y seleccione "Editar ProjectName .csproj"

  4. Ubique el nodo ItemGroup que contiene las referencias de contenido y corte, copie y pegue en un archivo nuevo (NotePad ++ es ideal para esto, pero use el editor de su elección) y guárdelo en la ubicación de XmlPathName. Asegúrese de que el nodo "ItemGroup" sea el nodo raíz de su nuevo documento XML.

  5. Modifique la ruta en SortedPathName si lo desea y asegúrese de que su cuenta de usuario de Windows tenga permiso de escritura para esa ubicación.

  6. Ejecute el C # anterior en LinqPad (o bifurque y cree su propia aplicación de consola / secuencia de comandos Powershell).

  7. Inspeccione los contenidos del archivo de salida para asegurarse de que se vean correctos (recuento de líneas y formato ampliamente consistentes) y, si es posible, valide como XML válido (las herramientas XML en Notepad ++ son ideales para esto).

  8. Copie los contenidos del archivo de salida a su archivo de solución, reemplazando el nodo original ItemGroup .

  9. Cierre el archivo csproj, haga clic derecho en el Proyecto en el Explorador de soluciones y seleccione "Recargar proyecto".

  10. Si el proyecto fue su proyecto de inicio, es posible que deba hacer clic con el botón secundario nuevamente y seleccionar "Establecer como proyecto de inicio".

  11. Intento de construir