2010-02-05 13 views
7

(Fondamentalmente vogliamo importare i file target in alcuni posti nel file * .csproj e comunque verificare che il file segue i nostri standard)Voglio creare uno strumento che manipola i file di progetto C#

Qual è il modo migliore di fare questo? Sto pensando di usare C# e XDocument (da LINQ a XML) e ho manipolato i nodi. Ma è il modo migliore? Altri supplenti possono essere:

  1. Trovare XSD per csproj/msbuild e creare oggetti tipizzati con estensione che rappresentano il file di progetto. È possibile?
  2. Ci sono altri strumenti/lingue che sono migliori (potrebbe usare questo come scusa per imparare Ruby). Una risposta dovrebbe avere alcuni collegamenti ad esempi per manipolare XML.

Forse la vera domanda è: qual è il modo migliore per leggere e manipolare XML in modo programmatico?

+0

L'opzione migliore sarebbe utilizzare un tipo di automazione VS. Davvero non dovresti avere problemi con quei file direttamente. –

+5

@Moron: non vedo perché no. Sono fondamentalmente file MSBuild. IMO l'intero * punto * di loro essendo XML (invece di essere opachi file binari) è che sono modificabili. –

+1

@Jon Idealmente non direi 'modificabile'. Leggibile, sicuro. Ma modificarli potrebbe essere problematico, ad esempio, quando eseguono l'aggiornamento a una nuova versione di VS. A meno che non stiamo parlando di cambiamenti davvero semplici. – kprobst

risposta

5

Personalmente utilizzerei LINQ direttamente in XML ... a meno che non si stia eseguendo un'elaborazione veramente pesante, non penso che varrebbe la pena creare un modello di oggetto per questo. Quante regole/qualunque cosa hai bisogno per questo strumento?

+0

Funziona bene. L'ho appena fatto per Mapping Schema Language di Entity Data Model, che non espone un'API, ed è stato molto semplice. – codekaizen

+0

Esiste già un modello di oggetto per questo motivo, quindi non vedo perché si dovrebbe usare Linq in XML. –

+0

@SayedIbrahimHashimi: quando non si è a conoscenza del modello di oggetto esistente, e non vuole andare a caccia :) –

3

Abbiamo uno strumento interno che manipola i file di progetto in tempo reale per aggiornare i riferimenti e impostare varie proprietà. Poiché i file di progetto non sono così complicati, semplicemente manipoliamo direttamente l'XML. Lo strumento è stato scritto molto prima che LINQ fosse disponibile, quindi non lo usa, ma non vedo perché non si possa fare ciò che Jon suggerisce.

Quando abbiamo eseguito l'aggiornamento da VS2005 a VS2008, abbiamo dovuto solo apportare piccole modifiche al codice, ma ovviamente non ci sono garanzie in merito. Potremmo dover fare aggiustamenti maggiori per le versioni future.

Se siete interessati, c'è un po 'più di informazioni sul nostro strumento nella mia risposta a questa domanda Should a .sln be committed to source control?

+0

Abbiamo anche usare questo sistema per i nostri file di progetto. Sembra funzionare bene e nessuna dipendenza VS, che è un vantaggio per la macchina di compilazione. – Pondidum

2

Secondo seconda parte della nostra domanda come manipolare XML programatically, ecco alcune XML da una configurazione di progetto file. (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> 

e di analizzare con LINQ to XML, qualcosa come segue

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 
} 

Speranza che aiuta

5

MSBuild (che è il formato di file di progetto) ha un object model che è possibile utilizzare per applicazioni come questa.

+0

Penso che tu sia sulla strada giusta. Se solo siete stati più specifiche su come farlo ... Forse http://msdn.microsoft.com/en-us/library/microsoft.build.buildengine.project_members(VS.80).aspx? –

Problemi correlati