介绍
我不同意 Visual Studio 中的 Perforce 集成“糟糕”的说法。相反,我将其定义为“开箱即用的体验不是最佳的”:-)。以下部分讨论了我对项目/解决方案设置的集成和建议的理解。
如果您对源代码控制集成如何工作的细节不感兴趣,您可以跳到此答案的末尾,我在此总结了 Weeble 问题的答案。
免责声明:以下部分只是基于我的经验经验的有根据的猜测,但是我多年来在许多项目中使用了该技术(每个项目都有多个实验/主干/维护/发布分支,有时甚至是多个解决方案文件,没有问题)。缺点是您必须手动更新项目文件 - 但 2 分钟的投资在项目的整个生命周期中很好地摊销了,恕我直言 :-)。
解决方案与项目
Visual Studio 在初始解决方案加载期间使用来自解决方案文件和每个项目文件的源代码控制绑定信息。然后将此绑定信息存储在name.suo文件中(假设我们使用name.sln作为解决方案) - 请注意,suo文件标有隐藏标志,因此它们在文件资源管理器中不可见(除非您覆盖“隐藏文件和文件夹”选项)。
如果出现任何问题,重新绑定到源代码控制提供程序的最简单方法是删除相应的suo文件并重新打开解决方案。创建 suo 文件后,对 <Scc*> 元素的更改无效。
如果在初始解决方案打开期间,解决方案文件中存储的绑定信息与项目文件中存储的信息之间存在差异,Visual Studio 将尝试修复此问题(有时它甚至会提示您选择是解决方案中的信息还是项目中的信息应用作解决差异的“主”):

为什么 Visual Studio 违反 DRY(不要重复自己)原则?我不知道。我认为这是有历史原因的,并且与称为 Visual Source Safe 的噩梦的需求紧密相关 :-)。
如何“正确”设置?
在向 Perforce 添加新的或现有的解决方案/项目时,我总是从创建一个空白解决方案开始(请参阅“源代码控制空白解决方案”部分)。然后我一个接一个地将项目添加到这个空白解决方案中。根据添加的项目是否已经存在(参见“源代码控制现有(未绑定)项目”和“源代码控制现有(绑定)项目”部分)或我需要创建一个新项目(参见“源代码控制新项目”部分)。
源代码控制空白解决方案
要向源代码管理添加新的空白解决方案,请执行以下操作:
- 启动Visual Studio,“新建”->“项目...”->“其他项目类型”->“空白解决方案”;填写解决方案名称和位置,“确定”按钮
- “文件”->“源代码管理”->“将解决方案添加到源代码管理...”
- 在连接对话框中输入适当的 P4 服务器端口、客户端和用户(请注意,所选客户端的视图必须包含您在步骤 1 中选择的位置)
- “查看”->“待签入”->“签入”-> 在提交对话框中而不是点击“提交”按钮,使用“取消”。
原因:“签入”操作将创建一个新文件“name.vssscc”,然后将“name.sln”和“name.vssscc”都添加到 Perforce 的默认更改列表中;通过取消提交对话框,我们将保持“添加”操作挂起,并且能够在提交到 P4 之前编辑文件
- 关闭 Visual Studio
在您喜欢的编辑器中打开 name.sln 文件(记事本,如果您真的很绝望:-))并添加两个新行(SccProjectName0和SccProvider0) - 空白解决方案文件现在应该有一个源代码控制部分,如下所示:
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 已关闭
- 删除除name.sln以外的**所有*文件(尤其是name.suo)
- 打开 Visual Studio 并使用它打开 name.sln
- 应该会出现一个连接对话框,使用适当的端口/客户端/用户,然后单击确定
- 解决方案资源管理器现在应该显示带有挂锁覆盖图标的解决方案节点:

- 您现在可以使用“文件”->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态:
注意:“服务器绑定”列显示了我们为“SccProjectName0”选择的值.
源代码控制新项目
如果您正在创建一个全新的项目并希望立即开始在 Perforce 仓库中跟踪它,请按照以下步骤操作:
- 在 Visual Studio 中打开源代码控制解决方案
- “文件” -> “添加” -> “新建项目...” - 选择您要添加的项目类型、名称和位置(位置应该是存储解决方案文件的目录的子目录)
- “文件”->“全部保存”(这会将所有内存更改提交到解决方案文件和新创建的项目文件到磁盘)
使用您选择的编辑器手动编辑您刚刚创建的项目文件(来吧,记事本再次?;-))。将以下属性元素添加到 PropertyGroup(任何属性组)中:
<PropertyGroup>
...
<SccProjectName>Tutorial</SccProjectName>
<SccLocalPath>..\..</SccLocalPath>
<SccProvider>MSSCCI:Perforce SCM</SccProvider>
...
</PropertyGroup>
值应选择如下:
- SccProjectName - 这是在“更改源代码管理”对话框中显示为“服务器绑定”的值;应该与您在空白解决方案中用于 SccProjectName0 的值相同;如果不相同,解决方案和此项目将无法共享相同的源代码控制提供程序连接
- SccLocalPath - 参考目录的相对路径(在“更改源代码管理”对话框中显示为“本地绑定”);因为我建议使用解决方案目录作为参考目录,这实际上是从包含项目文件的目录到包含解决方案文件的目录的相对路径(我的示例是将项目存储在“(solutionDir)/Source/ProjectName/projectName.csproj”中,因此相对路径是“向上两层”)
- SccProvider - 硬编码值“MSSCCI:Perforce SCM”;这用于确定 SCC* 绑定值对哪些 SCCAPI 提供程序有效
切换回 Visual Studio;它应该自动检测到项目文件已在外部更新并提供重新加载它(如果没有,请手动卸载并重新加载项目)
- “查看”->“待签到”
- “签入”-> 我建议右键单击 (solutionName).vssscc 文件并选择“如果未更改则还原”(即使 Visual Studio 打开它进行编辑,它也保持不变);提供描述并提交更改
要验证新添加的项目是否正确绑定,您可以按照以下步骤操作:
- 确保 Visual Studio 已关闭
- 删除 (solutionName).suo 文件以及 MSSCCPRJ.SCC(在解决方案目录中)
- 打开 Visual Studio 并使用它打开 (solutionName).sln
- 应该会出现一个连接对话框,使用适当的端口/客户端/用户,然后单击确定
- 解决方案资源管理器现在应该显示带有挂锁覆盖图标的项目节点:

您现在可以使用“文件”->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态:

关于此状态屏幕截图需要注意的一点是,当我选择解决方案行时,所有剩余的行也都被“选中”(蓝色突出显示)。这是因为所有这些条目都具有相同的“服务器绑定”+“本地绑定”,因此共享相同的源控制提供程序 (P4) 连接。
另请注意,两个项目的“相对路径”有两个级别,并且相对于相同的“本地绑定” - 解决方案文件所在的目录。
源代码控制现有(未绑定)项目
如果您有尚未在任何其他 Perforce 解决方案中使用的现有项目,请按照以下步骤将它们添加到 Perforce(即导入以前没有源代码控制的项目(互联网下载等)或使用不同的源代码控制提供者(Visual Source Safe 等)。
- 将项目复制到适当的位置
- 清理现有的源代码控制绑定(如果有):
- 删除现有的项目文件绑定,即所有以“Scc”开头的属性
- 删除与项目文件相同目录下的文件(projectName).vspscc(如果有)
- 在 Visual Studio 中打开源代码控制解决方案
- “文件” -> “添加” -> “现有项目...” - 浏览到项目(您在步骤 1 中创建的副本)
- “文件”->“全部保存”(这会将所有内存中的更改提交到解决方案文件)
- 遵循“源代码控制新项目”中的步骤 4-7(即,您现在将“Scc*”属性元素添加到PropertyGroup中)
验证步骤与“源代码控制新项目”部分中的完全相同。
源代码控制现有(绑定)项目
如果您的项目已经使用此处讨论的技术绑定到 Perforce,并且您想在不同的解决方案中使用它们(新分支、重用项目的替代解决方案等),请使用以下步骤:
- 将项目集成到所需位置
- 在 Visual Studio 中打开源代码控制解决方案
- “文件” -> “添加” -> “现有项目...” - 通过集成浏览到在步骤 1 中创建的项目
- “查看”->“待签入”->“签入”-添加描述并提交
概括
- 源代码管理绑定信息存储在解决方案和项目中,必须同步(如果不同步,Visual Studio 将尝试修复任何差异)
- 我总是将项目文件视为绑定信息的主要来源,将解决方案文件视为一次性文件,可以通过首先对空白解决方案进行源代码控制然后添加所需项目来轻松重新创建这些文件
- 解决方案文件应始终具有有效的 SccProvider0和SccProjectName0值(必须使用新版本的 P4SCC 插件手动添加)
- 项目文件应始终具有有效的 SccProjectName(最好与SccProjectName0相同)、SccLocalPath和SccProvider值(也必须手动编辑,因为 P4SCC 默认值不好)
我还包括对您原始问题的回答:
当您执行“更改源代码管理”并绑定项目时会发生什么?Visual Studio 如何决定在项目和解决方案文件中放入什么?
这会更新您正在重新绑定的项目文件中的“Scc*”元素;然后解决方案文件也会更新,以便与项目文件绑定同步
当您执行“从源代码管理打开”时会发生什么?
允许您选择要打开的解决方案。之后,解决方案中包含的所有项目都会自动同步到 head。我发现这个功能在 Perforce 世界中不是很有用,无论如何你都必须创建一个客户端,而且你很有可能是从 P4V/P4Win/P4 同步这个客户端,而不是依赖于 Visual Studio。这在没有视图概念的 Visual Source Safe 世界中非常有用,并且您正在定义存储库在签出时间的位置。
SccLocalPath 和 SccProjectFilePathRelativizedFromConnection 所指的“连接”文件夹是什么?Visual Studio/Perforce 如何选择它?
这是 Visual Studio 的簿记。它是根据每个项目文件中的绑定确定的(我猜理论上如果项目文件由于某种原因丢失了绑定信息,它可以从解决方案信息中重建......)
即使创建解决方案的新分支,是否有一些推荐的方法可以使源代码控制绑定继续工作?
我希望上面的部分能让您了解一种对我来说非常有效的方法:-)。