我有一个软件项目,包含多个项目文件和多个解决方案文件。解决方案文件与项目文件具有一对多的关系,并且给定的项目文件可能出现在多个不同的解决方案文件中。
有没有好的/漂亮的方法来提供解决方案文件和项目文件之间关系的地图?通过VS或某种实用程序。
我想做的是说“嘿,在这个目录及其子目录中有许多解决方案文件和项目文件 - 请告诉我哪些解决方案使用哪些项目并将其映射出来”
我意识到可以通过打开每个解决方案文件并检查它来产生净效果,但我正在寻找一种自动化,可重复的操作。
编辑:我担心我的解决方案/项目组合可以追溯到VS2003,所以我也需要映射它们。
答案 0 :(得分:3)
除了Gordon Wilson的帖子之外,您可以尝试在C#中构建相同的内容,并使用QuickGraph和GraphViz来创建显示相同内容的图表。
QuickGraph可用于在内存中创建图形结构并输出一个点文件,Graphviz可以从中加载并创建一个漂亮的图表。两个网站上的文档都应该为您提供足够的信息。
**编辑** 请参阅here,了解我开始的一个小型项目,它可以完成您想要的一些项目。您最多可以在几个小时内添加所需的任何内容。随意拿它并随意使用它,如果你愿意,请给我留言。
答案 1 :(得分:1)
项目文件和解决方案文件都是文本文件。项目文件不了解他们的解决方案,因此我们必须查看他们项目的解决方案。
解决方案文件中的项目条目如下所示:
Project("{9AC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ProjectName", "ProjectDirectory\ProjectFileName.vcproj","{9A95F635-B74F-4640-BBCF-E324D0972CA9}"
EndProject
所以你可以看到,我们可以获取项目名称和项目文件的相对路径。
使用您喜欢的脚本语言,您可以执行以下操作。 (红宝石中的例子)
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
答案 2 :(得分:0)
一个简单的python(perl?)脚本,带有几个正常的正则表达式 每个项目都有自己的GUID。找到映射只是找到项目的GUID并在解决方案文件中查找它们。