介绍
我不同意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中打开源代码控制的解决方案
- “文件”->“添加”->“新建项目...”-选择要添加的项目类型,名称和位置(位置应为解决方案文件存储目录的子目录)
- “文件”->“全部保存”(这会将所有内存中的更改提交到解决方案文件和新创建的项目文件到磁盘)
使用您选择的编辑器手动编辑刚创建的项目文件(出现在记事本AGAIN?;-)上。将以下属性元素添加到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”;这用于确定哪些SCCAPI提供程序对Scc *绑定值有效
切换回Visual Studio;它应该自动检测到该项目文件已在外部进行了更新,并提出要重新加载它(如果没有,请手动卸载并重新加载该项目)
- “查看”->“待签入”
- 我建议右键单击“签入”->“(solutionName).vssscc文件”,然后选择“如果未更改则还原”(即使Visual Studio将其打开进行编辑,它仍保持不变);提供描述并提交更改
要验证新添加的项目是否正确绑定,您可以按照以下步骤操作:
- 确保Visual Studio已关闭
- 删除(solutionName).suo文件以及MSSCCPRJ.SCC(在解决方案目录中)
- 打开Visual Studio并使用它打开(solutionName).sln
- 应出现一个连接对话框,使用适当的端口/客户端/用户,然后单击“确定”。
- 解决方案资源管理器现在应该显示带有挂锁覆盖图标的项目节点:
现在,您可以使用“文件”->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态:
关于此状态屏幕截图的一件事要注意的是,当我选择解决方案行时,所有剩余的行也都被“选中”(蓝色突出显示)。这是因为所有这些条目都具有相同的“服务器绑定” +“本地绑定”,因此共享相同的源控制提供程序(P4)连接。
还要注意,两个项目的“相对路径”都有两个级别,并且相对于同一“本地绑定”(解决方案文件所在的目录)。
源代码控制现有(未绑定)项目
如果您有尚未在任何其他Perforce解决方案中使用的现有项目,请按照以下步骤将其添加到Perforce中(即,导入以前未经源代码控制的项目(Internet下载等)或使用其他源代码控制提供程序(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 *”元素;然后,解决方案文件也将更新,以使其与项目文件绑定同步
当您执行“从源代码管理中打开”时会发生什么?
允许您选择要打开的解决方案。之后,解决方案中包含的所有项目都将自动同步到开头。我发现此功能在Perforce世界中不是很有用,在该世界中无论如何您都必须创建一个客户端,并且很可能是从P4V / P4Win / P4同步此客户端,而不是依赖Visual Studio。在没有视图概念的Visual Source Safe世界中,这很有用,您可以定义存储库在结帐时间的去向。
SccLocalPath和SccProjectFilePathRelativizedFromConnection引用的“连接”文件夹是什么?Visual Studio / Perforce如何选择它?
这是Visual Studio的簿记。它是根据每个项目文件中的绑定确定的(理论上我想如果一个项目文件由于某种原因丢失了绑定信息,则可以从解决方案信息中对其进行重构...)
有没有建议的方法,即使您创建解决方案的新分支,也可以使源代码控制绑定继续工作?
我希望以上部分为您提供一种对我来说非常有效的方法的想法:-)。