5

我有一个由多个项目文件和多个解决方案文件组成的软件项目。解决方案文件与项目文件具有一对多的关系,并且给定的项目文件可能出现在多个不同的解决方案文件中。

有没有什么好的/漂亮的方法来绘制解决方案文件和项目文件之间的关系图?通过VS或某种实用程序。

我想做的是说“嘿,在这个目录及其子目录中有许多解决方案文件和项目文件 - 请告诉我哪些解决方案使用哪些项目并为我映射出来”

我意识到可以通过打开每个解决方案文件并检查它来产生净效果,但我正在寻找一种自动化的、可重复的操作。

编辑:恐怕我也有可以追溯到 VS2003 的解决方案/项目组合,所以我也需要映射它们。

4

3 回答 3

3

除了 Gordon Wilson 的帖子之外,您还可以尝试在 C# 中构建相同的内容,并使用QuickGraphGraphViz创建一个显示相同内容的图表。

QuickGraph 可用于在内存中创建图形结构并输出点文件,Graphviz 可以从中加载并创建漂亮的图表。两个站点上的文档都应该为您提供足够的信息。

** 编辑 ** 请参阅此处了解我开始的一个小型项目,它可以满足您的一些需求。您最多可以在几个小时内添加您需要的任何内容。随意拿走它并随心所欲地使用它,如果您愿意,请给我留言。

于 2009-01-23T01:29:12.837 回答
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
于 2009-01-22T23:00:22.607 回答
0

一个简单的 python (perl?) 脚本,带有几个很好的位置正则表达式。
每个项目都有自己的 GUID。查找映射只是查找项目的 GUIDS 并在解决方案文件中查找它们的问题。

于 2009-01-22T22:58:04.110 回答