Ответ 1
Введение
Я бы не согласился с утверждением, что Perforce-интеграция в Visual Studio "ужасна". Скорее, я бы определил его как "из коробки опыт менее оптимальным":-). В следующих разделах обсуждается мое понимание интеграции и рекомендаций по настройке проекта/решения.
Если вас не интересуют детали того, как работает интеграция с источником, вы можете пропустить до конца этого ответа, где я суммирую ответы на вопрос Weeble.
Отказ от ответственности: следующие разделы - это только обоснованные догадки, основанные на моем эмпирическом опыте, однако я использовал эту технику на протяжении многих лет во многих проектах (каждый проект имеет несколько экспериментальных/соединительных линий/отделов обслуживания/выпуска, иногда даже несколько файлов решений, без проблем). Недостатком является то, что вам необходимо вручную обновлять файлы проекта, но 2-минутные инвестиции амортизируются в течение всего жизненного цикла проекта. IMHO: -).
Решение против проекта
Visual Studio использует информацию о привязке к исходному контролю как из файла решения, так и из каждого файла проекта во время начальной загрузки решения. Эта информация привязки затем сохраняется в файле name.suo (если мы используем name.sln как решение) - обратите внимание, что файлы suo отмечен флагом скрытый, чтобы они не были видны в проводнике файлов (если вы не переопределите опцию "Скрытые файлы и папки" ).
Самый простой способ повторно связать с поставщиком источника, если что-то пойдет не так, - удалить соответствующий файл suo и снова открыть его. После создания файла suo изменения в < Scc * > элементы не имеют эффекта.
Если во время первоначального открытия решения существует несоответствие между информацией привязки, хранящейся в файле решения, и информацией, хранящейся в файле проекта, Visual Studio попытается исправить это (иногда даже будет предложено принять решение о том, будет ли информация в решение или информация в проекте должны использоваться как "мастер" для устранения расхождения):
Почему Visual Studio нарушает принцип DRY (Do not Repeat Yourself)? Понятия не имею. Я предполагаю, что это имеет исторические причины и тесно связано с потребностями этого кошмара под названием Visual Source Safe: -).
Как настроить "правильно"?
При добавлении новых или существующих решений/проектов в Perforce, я всегда начинаю с создания пустого решения (см. раздел "Управление исходным кодом пустого решения" ). Затем я добавляю проекты в это пустое решение один за другим. Шаги немного отличаются в зависимости от того, добавлен ли уже добавленный проект (см. Разделы "Существующие (несвязанные) проекты с контролем источника (Source-control existing)" и "Существующие (связанные) источники), или мне нужно создать новый (см. Раздел" Управление новыми источниками").
Исходный контроль пустого решения
Чтобы добавить новое пустое решение в исходный элемент управления, выполните следующие действия:
- Запустите Visual Studio, "Создать" → "Проект..." → "Другие типы проектов" → "Пустое решение"; введите имя и местоположение решения, нажмите кнопку "ОК"
- "Файл" → "Управление источником" → "Добавить решение для управления источником..."
- В диалоговом окне подключения введите соответствующий порт сервера P4, клиент и пользователь (обратите внимание, что представление выбранного клиента должно содержать местоположение, выбранное вами на шаге 1)
- "Просмотр" → "Ожидание проверки" → "Заезд" → в диалоговом окне отправки вместо нажатия кнопки "Отправить", используйте "Отмена".
Причина. Действие "Check In" создаст новый файл "name.vssscc", а затем добавит "name.sln" и "name.vssscc" в список изменений Perforce по умолчанию; отменив диалог отправки, мы продолжим операцию "добавить", и вы сможете редактировать файлы перед отправкой на P4 - Закрыть Visual Studio
-
Откройте файл name.sln в своем любимом редакторе (блокнот, если вы действительно отчаянный:-)) и добавьте две новые строки ( SccProjectName0 и SccProvider0 strong > ) - у пустого файла решения теперь должна быть секция управления источником следующим образом:
GlobalSection(SourceCodeControl) = preSolution SccNumberOfProjects = 1 SccLocalPath0 = . SccProjectName0 = Tutorial SccProvider0 = MSSCCI:Perforce\u0020SCM EndGlobalSection
Значения должны быть выбраны следующим образом:
- SccProjectName0: произвольная строка, которая будет отображаться в диалоговом окне "Изменить источник управления" как "привязка сервера". Это имя используется для определения того, какие проекты/файлы решений могут использовать одно и то же соединение с источником. Я рекомендую не использовать пространство для этого имени, поскольку правила экранирования для пробелов различаются в файлах решений и проектов.
- SccProvider0: жестко закодированное значение "MSSCCI: Perforce\u0020SCM".
- Отправьте два незавершенных файла, используя клиент Perforce по вашему выбору (p4.exe, P4Win, P4V)
Теперь вы можете проверить привязки:
- Убедитесь, что Visual Studio закрыта.
- Удалить ** все * файлы, кроме имени .sln(особенно name.suo)
- Откройте Visual Studio и используйте его для открытия name.sln
- Должен появиться диалог подключения, используйте соответствующий порт/клиент/пользователь и нажмите OK
- В обозревателе решений теперь должно отображаться решение node с надписью навесного замка:
- Теперь вы можете проверить статус управления версией решения, используя "Файл" → "Управление источником" → "Изменить контроль источника...":
Примечание. В столбце "Связывание с сервером" отображается значение, которое мы выбрали для "SccProjectName0".
Источники, контролирующие новые проекты
Если вы создаете совершенно новый проект и хотите сразу начать отслеживать его в хранилище Perforce, выполните следующие действия:
- Откройте исходное решение в Visual Studio
- "Файл" → "Добавить" → "Новый проект..." - выберите тип проекта, который вы добавляете, имя и местоположение (местоположение должно быть подкаталогом каталога, в котором хранится файл решения)
- "Файл" → "Сохранить все" (это скопирует все изменения в памяти в файл решения и вновь созданный файл проекта на диск)
-
Вручную отредактируйте файл проекта, который вы только что создали, используя редактор по вашему выбору (давайте, блокнот AGAIN?;-)). Добавьте следующие свойства в PropertyGroup (любая группа свойств):
<PropertyGroup> ... <SccProjectName>Tutorial</SccProjectName> <SccLocalPath>..\..</SccLocalPath> <SccProvider>MSSCCI:Perforce SCM</SccProvider> ... </PropertyGroup>
Значения должны быть выбраны следующим образом:
- SccProjectName - это значение, которое отображается в диалоговом окне "Изменить источник управления" как "привязка сервера"; должен быть таким же, как значение, которое вы использовали для SccProjectName0 в пустом решении; если это не то же самое, решение и этот проект не смогут использовать одно и то же соединение поставщика источника.
- SccLocalPath - относительный путь к справочному каталогу (отображается в диалоговом окне "Change Source Control" как "Local binding" ); потому что я рекомендую использовать каталог решений в качестве справочного каталога, это по сути относительный путь из каталога, содержащего файл проекта, в каталог, содержащий файл решения (в моем примере хранятся проекты в "(solutionDir)/Source/ProjectName/projectName.csproj", таким образом относительный путь "два уровня вверх" )
- SccProvider - жестко закодированное значение "MSSCCI: Perforce SCM"; это используется для определения того, какой поставщик SCCAPI является значениями привязки Scc *, действительными для
-
Вернитесь в Visual Studio; он должен автоматически обнаруживать, что файл проекта обновлен извне и предлагает перезагрузить его (если нет, выгрузите и перезагрузите проект вручную)
- "Просмотр" → "Ожидающие проверки"
- "Check In" → Я рекомендую щелкнуть правой кнопкой мыши файл (solutionName).vssscc и выбрать "Revert if unchanged" (даже если Visual Studio открывает его для редактирования, он остается неизменным); предоставить описание и отправить изменение
Чтобы убедиться, что недавно добавленный проект связан правильно, вы можете выполнить следующие действия:
- Убедитесь, что Visual Studio закрыта.
- Удалить (solutionName).suo файл, а также MSSCCPRJ.SCC(в каталоге решений)
- Откройте Visual Studio и используйте его для открытия (solutionName).sln
- Должен появиться диалог подключения, используйте соответствующий порт/клиент/пользователь и нажмите OK
- Исследователь решений должен теперь отображать проект node с пиктограммой наложения:
-
Теперь вы можете проверить статус управления версией решения, используя "Файл" → "Управление источником" → "Изменить управление источником...":
Одно замечание об этом скриншоте состояния заключается в том, что когда я выбрал строку решения, все остальные строки также были выбраны (синяя подсветка). Это связано с тем, что все эти записи имеют одно и то же "привязку сервера" + "Локальное связывание" и, таким образом, используют одно и то же соединение источника-поставщика-поставщика (P4).
Также обратите внимание, что "Относительный путь" для обоих проектов имеет два уровня и относится к одному и тому же "Local Binding" - директории, в которой находится файл решения.
Существующие (несвязанные) проекты с контролем источника
Если у вас есть существующие проекты, которые еще не использовались ни в одном другом решении Perforce, выполните следующие действия, чтобы добавить их в Perforce (т.е. импортировать проекты, которые ранее не контролировались исходным кодом (загрузка через Интернет и т.д.), или использовали другого поставщика контроля источника (Visual Source Safe и т.д.).
- Скопируйте проект в соответствующее место
- Очистка существующих привязок управления источником (если есть):
- Удалить существующие привязки файлов проектов, т.е. все свойства, начинающиеся с "Scc"
- Удалить файл (projectName).vspscc в том же каталоге, что и файл проекта (если есть)
- Откройте исходное решение в Visual Studio
- "Файл" → "Добавить" → "Существующий проект..." - перейдите к проекту (копия, созданная на шаге 1)
- "Файл" → "Сохранить все" (это приведет к изменению всех изменений в памяти в файле решения)
- Следуйте шагам 4-7 из "Исходные элементы управления новыми проектами" (т.е. теперь вы добавите элементы свойств "Scc *" в PropertyGroup)
Шаги проверки точно такие же, как в разделе "Управление новыми версиями проектов".
Существующие (связанные) проекты с контролем источника
Если у вас есть проекты, которые уже были привязаны к Perforce, используя описанную здесь технику, и вы хотите использовать их в другом решении (новая ветка, альтернативное решение, повторно использующее проект и т.д.), выполните следующие действия:
- Интеграция проекта в нужное место
- Откройте исходное решение в Visual Studio
- "Файл" → "Добавить" → "Существующий проект..." - перейти к проекту, созданному на шаге 1, с помощью интеграции
- "View" → "Pending Checkins" → "Check In" - добавить описание и отправить
Резюме
- Информация о привязке к источнику управления хранится в обоих решениях и проектах, должна быть синхронизирована (если нет, Visual Studio попытается исправить любые расхождения)
- Я всегда рассматриваю файлы проекта как основной источник привязки информации и файлов решений как отложенные файлы, которые можно легко воссоздать с помощью первого источника, управляющего пустым решением, а затем добавления желаемых проектов.
- Файл решения должен всегда иметь допустимые значения SccProvider0 и SccProjectName0 (их необходимо добавить вручную с новыми версиями плагинов P4SCC)
- Файлы проекта должны всегда иметь допустимое SccProjectName (предпочтительнее таких же, как SccProjectName0), SccLocalPath и SccProvider также необходимо отредактировать вручную, поскольку значения по умолчанию P4SCC не являются хорошими)
Я также включаю ответы на ваши оригинальные вопросы:
Что происходит, когда вы выполняете "Изменить контроль источника" и связываете проекты? Как Visual Studio решает, что добавить в проект и файлы решений?
Это обновляет элементы "Scc *" в файле проекта, который вы восстанавливаете; файл решения затем обновляется так, чтобы он синхронизировался с привязками файлов проекта.
Что происходит, когда вы делаете "Open from source control"?
Позволяет выбрать решение, которое вы хотите открыть. Впоследствии все проекты, включенные в решение, автоматически синхронизируются с головкой. Я считаю, что эта функция не очень полезна в мире Perforce, где вам все равно нужно создавать клиента, и есть вероятность, что вы синхронизируете этот клиент с P4V/P4Win/P4 вместо того, чтобы полагаться на Visual Studio. Это было полезно в мире Visual Source Safe, где не было понятия взглядов, и вы определяли, где хранится репозиторий.
Что это за папка "connection", к которой относятся SccLocalPath и SccProjectFilePathRelativizedFromConnection? Как Visual Studio/Perforce выбирает его?
Это бухгалтерия Visual Studio. Он определяется на основе привязок в каждом файле проекта (теоретически я думаю, что если файл проекта по какой-то причине теряет обязательную информацию, он может быть восстановлен из информации о решении...)
Есть ли какой-то рекомендуемый способ заставить привязки исходного кода продолжать работать, даже когда вы создаете новую ветвь решения?
Я надеюсь, что разделы, приведенные выше, дают вам некоторое представление о том, как работает для меня очень хорошо: -).