查看项目依赖项的更方便的方法是什么?

时间:2015-12-01 10:48:40

标签: visual-studio visual-c++ visual-studio-2013

VS拥有“项目依赖关系”窗口,但在我处理的解决方案中,有超过100个项目。试图查看特定项目的所有依赖项是非常耗时的,因为您必须滚动整个列表,并且很容易错过一个。

有没有办法列出依赖项,而不是所有带有勾选框的项目都显示哪些是依赖项?

2 个答案:

答案 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)

您能澄清一下:到seelist在哪里?在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 &ltrim(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扩展,我有一个问题:你认为它会是一个有用的工具吗?