Вопрос о формате Visual Studio *.sln
Я использую текстовый редактор для редактирования файла *.sln вручную. Я запутался в следующих строках:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test2008", "Tools\Test2008\Test2008\Test2008.csproj", "{00B5EBB2-FDA5-4B23-BDC5-27E9F82E7C69}"
ProjectSection(ProjectDependencies) = postProject
{82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}
EndProjectSection
EndProject
Какая точка этого
{82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}
утверждение? Это выглядит совершенно излишним.
Ответы
Ответ 1
Кажется, что этот избыточный синтаксис является одним из причуд, требуемых MSBuild для распознавания зависимости проекта:
Похоже, что Visual Studio поддерживает зависимостей двумя способами, только один из которых читается MSBuild. я вижу потому что я все еще могу указать зависимостей в графическом интерфейсе, скопируйте решение на другой машине и построить ее с VS в правильный заказ. - Виктор Сергиенко
Что касается того, почему это "выражение избыточного уравнения" требуется, кажется, что назначение руководства по проекту для собственного руководства является обходным решением для проблемы с MSBuild 4.0, которая заставляет MSBuild не распознавать или отвечать на определенные зависимости проектов, перечисленные в (.sln), или для создания зависимостей вне порядка.
Скомпонованный синтаксис "{x} = {x}", о котором вы спрашиваете, представляет собой вариант стандартного синтаксиса MSBuild для ссылки на проект (т.е. пример ответа @Sergio).
По-видимому, включение объявления зависимости в блоке ProjectSection в сочетании с GUID зависимостей с именем пользователя заставляет MSBuild изменять порядок сборки зависимого проекта, но на самом деле не добавляет к нему другую ссылку.
Здесь обсуждается в Microsoft Connect, где обсуждаются эти варианты обхода. В нем Дэн из Microsoft предлагает более эффективный способ обхода этого MSBuild в своем втором сообщении на странице, а также упоминает исправление, о котором вы спрашиваете:
Это исправляет порядок, так как теперь LibraryProject будет ждать CodeGeneratingProject, но его сборка в противном случае не будет затронута. Я могу привести в порядок, удалив зависимость в файле решения, - удалив эти строки, которые теперь не нужны:
ProjectSection(ProjectDependencies) = postProject
{B79CE0B0-565B-4BC5-8D28-8463A05F0EDC} = {B79CE0B0-565B-4BC5-8D28-8463A05F0EDC}
EndProjectSection
и он все еще работает нормально.
Ответ 2
Строка {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8} = {82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8}
указывает, что проект Test2008 имеет объявленную зависимость (настроенную в диалоговом окне "Зависимости проектов в VStudio" ) проекта с уникальным идентификатором 82B9BEC0-C9CC-4423-B54F-61E3C4AF53D8. Вы должны иметь возможность найти проект с тем же идентификатором в том же файле .sln.
Что касается нечетного синтаксиса строки, у меня нет инсайдерских знаний формата .sln. Однако, основываясь на наблюдении других выводов ProjectSection в .sln файлах, я должен был предположить, что синтаксический анализатор .sln, используемый Visual Studio, исторически предположил, что строки ProjectSection будут в формате key = value
, причем ключевая уникальность, применяемая в любом заданном раздел. Я также предположил бы, что люди, которые внедрили функциональность зависимостей проекта, решили, что вместо того, чтобы сбрасывать парсер, было бы проще использовать projectId = projectId
для своих строк сечения, поскольку ключи для них бессмысленны, но они гарантированы уникально, если в противном случае применяется только одна зависимость от проекта A к проекту B.
Ответ 3
От MSDN:
Этот оператор содержит уникальный GUID проекта и тип проекта GUID. Эта информация используется для поиска файла проекта или файлы, принадлежащие к решению, и VSPackage, необходимые для каждого проект.
GUID проекта передается IVsProjectFactory для загрузки конкретных VSPackage, связанный с проектом, затем проект загружается VSPackage. В этом случае VSPackage, загружаемый для этого проекта, является Visual Basic.
Например:
Проект ( "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}" ) = "Project1", "Project1.vbproj", "{8CDD8387-B905-44A8-B5D5-07BB50E05BEA}" EndProject
Ответ 4
Линии после ProjectSection(ProjectDependencies) = postProject
определяет список зависимостей - от какого проекта зависит. (Можно увидеть в Solution > Properties > Project Dependencies).
Если вы хотите "расшифровать" больше того, что происходит внутри, посмотрите на следующий проект:
https://sourceforge.net/p/syncproj/code/HEAD/tree/
Вот синтаксический анализатор .sln, вы можете проверить Solution.cs, найти "ProjectDependencies".
Клавиша всегда такая же, как и значение, это какая-то проблема с форматом файла.