VS拥有“项目依赖关系”窗口,但在我处理的解决方案中,有超过100个项目。试图查看特定项目的所有依赖项是非常耗时的,因为您必须滚动整个列表,并且很容易错过一个。
有没有办法列出依赖项,而不是所有带有勾选框的项目都显示哪些是依赖项?
答案 0 :(得分:0)
您可以在文本编辑器中打开Visual Studio解决方案文件(.sln),例如,Notepad ++。打开后,在您要查找的特定项目中搜索ProjectSection(ProjectDependencies) = postProject
。
以下.sln文件的一部分示例显示NativeUnitTest_CppDll项目依赖于NativeWin32CppDll项目。
唯一的缺点是依赖项列为GUID。您必须执行文本查找以找到其项目名称。
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeWin32CppDll", "NativeWin32CppDll\NativeWin32CppDll.vcxproj", "{83FC3109-17DF-4B53-BCA0-F0DFC10AAE7F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NativeUnitTest_CppDll", "NativeUnitTest_CppDll\NativeUnitTest_CppDll.vcxproj", "{559CB21A-4763-4A1E-A70A-E8C656C53ED9}"
ProjectSection(ProjectDependencies) = postProject
{83FC3109-17DF-4B53-BCA0-F0DFC10AAE7F} = {83FC3109-17DF-4B53-BCA0-F0DFC10AAE7F}
EndProjectSection
EndProject
答案 1 :(得分:0)
您能澄清一下:到see
和list
在哪里?在Visual Studio或一些外部工具?只是在弹出窗口中查看或有能力复制列表?
我试图使用Visual Studio的Solution对象及其属性来获取这些依赖项。有一个名为ProjectDependencies
的属性,但在我的测试中它是空的,所以我认为它跟踪自动依赖,而不是你手动指定的。
然后我试图从一个简单的控制台项目中获取* .sln文件的列表,就像gxy所建议的那样(你应该在命令行上传递解决方案文件):
int main(int argc, char* argv[])
{
if (argc != 2)
return -1;
ifstream sln(argv[1]);
string line, name, guid;
unordered_map<string, string> names;
unordered_map<string, list<string>> dependencies;
while (getline(sln, line))
{
if (line.find("Project(") == 0)
{
ParseProjGuid(line, name, guid);
names[guid] = name;
while (getline(sln, line))
{
if (line == "EndProject")
break;
if (line.find("ProjectSection(ProjectDependencies)") != string::npos)
{
while (getline(sln, line))
{
if (line.find("EndProjectSection") != string::npos)
break;
ParseDependGuid(line, guid);
dependencies[name].push_back(guid);
}
}
}
}
}
for (auto d : dependencies)
{
cout << d.first << endl;
for (auto g : d.second)
cout << "\t" << names[g] << endl;
}
return 0;
}
我在那里使用了几个辅助函数:
string unquote(const string& s)
{
if (s[0] == '"' && s[s.length() - 1] == '"')
return s.substr(1, s.length() - 2);
else
return s;
}
void ParseProjGuid(const string& src, string& proj, string& guid)
{
// Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "name", "path\name.vcxproj", "{9D4B97C3-1069-406C-973F-652706414C86}"
size_t pos1 = src.find('=');
size_t pos2 = src.find(',');
size_t pos3 = src.rfind(',');
proj = src.substr(pos1 + 1, pos2 - pos1 - 1);
guid = src.substr(pos3 + 1);
proj = trim(proj);
guid = trim(guid);
proj = unquote(proj);
guid = unquote(guid);
}
void ParseDependGuid(const string& src, string& guid)
{
// {165C1503-36B1-4577-9D99-3C1AFEBFC201} = {165C1503-36B1-4577-9D99-3C1AFEBFC201}
size_t pos = src.find('=');
guid = src.substr(0, pos);
guid = trim(guid);
}
以及从What's the best way to trim std::string?借来的修剪函数:
// trim from start
static inline string <rim(string &s) {
s.erase(s.begin(), find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}
// trim from end
static inline string &rtrim(string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}
// trim from both ends
static inline string &trim(string &s) {
return ltrim(rtrim(s));
}
由于我的爱好是编写Visual Studio扩展,我有一个问题:你认为它会是一个有用的工具吗?