2010-02-05 9 views
7

(Básicamente queremos importar archivos de objetivos en algunos lugares en el archivo * .csproj y de otra manera comprobar que el archivo cumpla con nuestros estándares)Quiero crear una herramienta que manipula los archivos de proyecto de C#

¿Cuál es la mejor manera de de hacer esto? Estoy planeando usar C# y XDocument (LINQ to XML) y manipular los nodos. ¿Pero es esa la mejor manera? Otras alternativas pueden ser:

  1. Busque el XSD para csproj/msbuild y cree objetos fuertemente tipados que representen el archivo del proyecto. ¿es posible?
  2. ¿Hay otras herramientas/idiomas que son mejores? (Podría usar esto como una excusa para aprender Ruby). Una respuesta debería tener algunos enlaces a ejemplos para manipular XML.

Tal vez la verdadera pregunta es: ¿Cuál es la mejor manera de leer y manipular XML programáticamente?

+0

Su mejor opción sería usar algún tipo de automatización VS. Realmente no deberías estar jugando con esos archivos directamente. –

+5

@Moron: No veo por qué no. Básicamente son archivos de MSBuild. IMO, el * punto * completo de ellos siendo XML (en lugar de ser archivos binarios opacos) es que son editables. –

+1

@Jon Idealmente, no diría 'editable'. Legible, claro. Pero editarlos podría ser problemático, por ejemplo, cuando se actualizan a una nueva versión de VS. A menos que hablemos de cambios realmente simples. – kprobst

Respuesta

5

Personalmente, simplemente usaría LINQ to XML directamente ... a menos que esté haciendo un procesamiento realmente pesado, no creo que valga la pena crear un modelo de objeto para él. ¿Cuántas reglas/lo que necesitas para esta herramienta?

+0

Esto funciona bien. Acabo de hacer esto para el lenguaje de esquema de asignación de Entity Data Model, que no expone una API, y fue muy fácil. – codekaizen

+0

Ya existe un modelo de objeto para esto, así que no veo por qué se usaría Linq para XML en su lugar. –

+0

@SayedIbrahimHashimi: cuando uno no conoce el modelo de objeto existente, y no quiere ir a cazar :) –

3

Tenemos una herramienta interna que manipula los archivos del proyecto sobre la marcha para actualizar las referencias y establecer varias propiedades. Como los archivos de proyecto no son tan complicados, simplemente manipulamos el XML directamente. La herramienta fue escrita mucho antes de que LINQ estuviera disponible, por lo que no la usa, pero no veo ninguna razón por la cual no puedas hacer lo que Jon sugiere.

Cuando pasamos de VS2005 a VS2008 solo tuvimos que hacer pequeños ajustes en el código, pero por supuesto no hay garantías al respecto. Es posible que tengamos que hacer ajustes más grandes para versiones futuras.

Si está interesado, hay un poco más de información sobre nuestra herramienta en mi respuesta a esta pregunta Should a .sln be committed to source control?

+0

También usamos este sistema para nuestros archivos de proyecto. Parece funcionar bien y no tiene dependencias VS, lo que es un plus para la máquina de compilación. – Pondidum

2

Según segunda parte de nuestra pregunta cómo manipular XML mediante programación, he aquí algo de XML a partir de una configuración del proyecto archivo. (Web.config)

<system.web> 
<compilation debug="false"> 
<assemblies> 
     <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, 
</compilation> 
</compilation> 

y para analizar el uso de LINQ to XML, algo como sigue

XDocument assemblies = XDocument.Parse("web.config"); 

var projectAssemblies= from a in assemblies.Descendants("system.web\assemblies") 
       select new // What ever object you waant 
       { 
        Assembly = a.Attribute("assembly").Value.ToString(), 
        Version = a.Attribute("Version").Value.ToString(), 
        Culture = a.Element("Culture").Value.ToString(), 
        PublicKeyToken = a.Attribute("PublicKeyToken").Value.ToString() 
       }; 

foreach (var v in projectAssemblies) 
{ 
    // enjoy them 
} 

creo que sirve

5

MSBuild (que es el formato de los archivos de proyecto) tiene un object model que puede usar para aplicaciones como esta.

+0

Creo que estás en el camino correcto. Si solo has sido más específico sobre cómo hacerlo ... Tal vez http://msdn.microsoft.com/en-us/library/microsoft.build.buildengine.project_members(VS.80).aspx? –

Cuestiones relacionadas