2009-01-22 4 views
5

Tengo un proyecto de software que consiste en múltiples archivos de proyecto y múltiples archivos de solución. Los archivos de Solución tienen una relación de uno a varios con los archivos de Proyecto, y un archivo de Proyecto dado puede aparecer en múltiples archivos de solución diferentes.¿Cómo puedo determinar qué soluciones de Visual Studio usan qué proyectos?

¿Hay alguna buena/buena manera de llegar a un mapa de las relaciones entre los archivos de la Solución y los archivos del Proyecto? Ya sea a través de VS o una utilidad de algún tipo.

Lo que me gustaría hacer es decir "bueno, en este directorio y sus subdirectorios hay una serie de archivos de solución y archivos de proyecto - por favor dígame qué soluciones utilizan qué proyectos y asignarla a cabo para mí"

Me doy cuenta de que el efecto neto podría producirse al abrir cada archivo de la Solución e inspeccionarlo, pero estoy buscando una acción automatizada y repetible.

EDIT: Me temo que también tengo Solution/Project combos que se remonta a VS2003, así que también necesito asignarlos.

Respuesta

1

Ambos archivos de proyecto y solución son archivos de texto. Los archivos del proyecto no conocen su solución, por lo que tendremos que buscar soluciones para sus proyectos.

Una entrada de proyecto del archivo de solución se parece a esto:

Project("{9AC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ProjectName", "ProjectDirectory\ProjectFileName.vcproj","{9A95F635-B74F-4640-BBCF-E324D0972CA9}" 
EndProject 

Así se puede ver, se puede agarrar el nombre del proyecto y la ruta relativa al archivo del proyecto.

Utilizando su lenguaje de scripting favorito podría hacer algo como lo siguiente. (Ejemplo de rubí)

require 'find' 

def project_name(string) 
    string =~ /= "(.+?)"/ 
    $1 
end 

#the script doesn't use this method but you may want it 
def project_path(string) 
    string =~ /, "(.+?)"/ 
    $1 
end 

def find_projects(path) 
    puts "#{path} contains the following projects:" 
    open(path).read.gsub(/Project\(.+?EndProject/m) do |match| 
    puts project_name(match) 
    end 
    puts "" 
end 

#change File.dirname(__FILE__)) to the name of the directory you want to search. 
Find.find(File.dirname(__FILE__)) do |path| 
    if FileTest.directory?(path) 
    if File.basename(path) =~ /^\../ # Directory name starts with . 
     Find.prune  # Don't look any further into this directory. 
    else 
     next 
    end 
    elsif path =~ /\.sln$/ 
    find_projects(path) 
    end 
end 
0

Un simple script de python (perl?) Con un par de lugares bien expresiones regulares.
Cada proyecto tiene su propio GUID. encontrar el mapeo es solo una cuestión de encontrar los GUIDS de los proyectos y buscarlos en los archivos de la solución.

3

, además del puesto de Gordon Wilson, podría intentar la construcción de la misma cosa en C#, y el uso de QuickGraph y GraphViz para crear un diagrama que muestra la misma cosa.

QuickGraph se puede utilizar para crear la estructura del gráfico en la memoria y para generar un archivo de puntos, del cual Graphviz puede cargar y crear un diagrama atractivo. Los documentos en ambos sitios deberían darle suficiente información para que se active.

** editar ** Ver here para un pequeño proyecto que comencé que hace lo que usted quería. Probablemente puedas agregar todo lo que necesites en unas pocas horas como máximo. Siéntete libre de tomarlo y usarlo como quieras, solo déjame un comentario si lo haces, por favor.

Cuestiones relacionadas