Visual Studio的源代码控制集成如何与Perforce一起使用?


71

我们正在使用Perforce和Visual Studio。每当我们创建分支时,除非使用“从源代码管理中打开”,否则某些项目将不会绑定到源代码控制,但是其他项目无论如何都会起作用。从我的调查中,我知道其中涉及的一些事情:

在我们的.csproj文件中,有以下设置:

  • <SccProjectName>
  • <SccLocalPath>
  • <SccAuxPath>
  • <SccProvider>

有时它们都设置为“ SAK”,有时则没有。如果它们说“ SAK”,则似乎更有可能起作用。

在我们的.sln文件中,有许多项目的设置:

  • SccLocalPath#
  • SccProjectFilePathRelativizedFromConnection#
  • SccProjectUniqueName#

(#是标识每个项目的数字。)SccLocalPath是相对于解决方案文件的路径。通常是“。”,有时是项目所在的文件夹,有时是“ ..”或“ .. \ ..”,并且指向它上方的文件夹似乎很不好。解决方案文件夹。相对的是该文件夹到项目文件的路径。如果SccLocalPath指向项目的文件夹,它将完全丢失。如果SccLocalPath中包含“ ..”,则此路径可能包含分支之间的文件夹名称不同,我认为这会引起问题。

因此,最后我想知道的细节是:

  • 当您执行“更改源代码管理”并绑定项目时会发生什么?Visual Studio如何决定要在项目和解决方案文件中放入什么?
  • 当您执行“从源代码管理中打开”时会发生什么?
  • SccLocalPath和SccProjectFilePathRelativizedFromConnection引用的“连接”文件夹是什么?Visual Studio / Perforce如何选择它?
  • 有没有建议的方法,即使您创建解决方案的新分支,也可以使源代码控制绑定继续工作?

2012年6月新增: 我不再使用Perforce,因此无法担保,但是请在下面查看KCD的答案。显然,正在开发一个新的P4 VS插件。希望它应该清除所有这些混乱!

Answers:


101

介绍

我不同意Visual Studio中的Perforce集成“糟糕”的说法。相反,我将其定义为“开箱即用的体验不足以达到最佳效果” :-)。以下各节讨论了我对集成的理解以及对项目/解决方案设置的建议。

如果您对源代码管理集成的工作方式的细节不感兴趣,则可以跳到该答案的末尾,在这里我总结了Weeble问题的答案。

免责声明:以下几节只是根据我的经验得出的有根据的猜测,但是我已经在许多项目中使用了多年的技术(每个项目都有多个实验/主干/维护/发布分支​​,有时甚至有多个解决方案文件,都没有问题) )。缺点是您必须手动更新项目文件-但是2分钟的投资会在项目的整个生命周期中分摊,相当不错,恕我直言:-)。

解决方案与项目

在初始解决方案加载期间,Visual Studio使用来自解决方案文件和每个项目文件的源代码控制绑定信息。然后,此绑定信息存储在name.suo文件中(假设我们使用name.sln作为解决方案)-请注意,suo文件已标记为隐藏标志,因此它们在文件资源管理器中将不可见(除非您覆盖“隐藏”文件和文件夹”选项)。

如果出现任何问题,重新绑定到源代码管理提供程序的最简单方法是删除适当的suo文件并重新打开解决方案。创建suo文件后,对<Scc *>元素的更改无效。

如果在最初的解决方案打开过程中,解决方案文件中存储的绑定信息与项目文件中存储的信息之间存在差异,Visual Studio将尝试解决此问题(有时甚至会提示您决定选择解决方案中的信息还是解决方案中的信息。项目中的信息应用作“主文件”来解决差异):

替代文字

为什么Visual Studio违反DRY(请勿重复自己)原则?我不知道。我认为这是有历史原因的,并且与称为Visual Source Safe :-)的噩梦紧密相关。

如何“正确”设置?

将新的或现有的解决方案/项目添加到Perforce时,我总是从创建空白解决方案开始(请参阅“源代码控制空白解决方案”部分)。然后,我一个接一个地将项目添加到此空白解决方案中。根据要添加的项目是否已经存在(请参见“控制现有(未绑定)项目的源代码”和“控制现有(已绑定)项目的源代码””部分)或我需要创建一个新项目(请参阅“源代码控制新项目”部分)。

源控制空白解决方案

要将新的空白解决方案添加到源代码管理,请执行以下操作:

  1. 启动Visual Studio,“新建”->“项目...”->“其他项目类型”->“空白解决方案”;填写解决方案名称和位置,单击“确定”按钮
  2. “文件”->“源代码管理”->“添加解决方案到源代码管理...”
  3. 在连接对话框中,输入适当的P4服务器端口,客户端和用户(请注意,所选客户端的视图必须包含您在步骤1中选择的位置)
  4. 在提交对话框中,单击“查看”->“待签入”->“签入”->,而不要单击“提交”按钮,请使用“取消”。
    原因:“签入”操作将创建一个新文件“ name.vssscc”,然后将“ name.sln”和“ name.vssscc”都添加到Perforce的默认更改列表中。通过取消提交对话框,我们将使“添加”操作处于待处理状态,并且能够在提交到P4之前编辑文件
  5. 关闭Visual Studio
  6. 在您喜欢的编辑器中打开name.sln文件(记事本,如果您真的很拼命:-)),并添加两行(SccProjectName0SccProvider0)-空白解决方案文件现在应具有源代码控制部分,如下所示:

    GlobalSection(SourceCodeControl) = preSolution
        SccNumberOfProjects = 1
        SccLocalPath0 = .
        SccProjectName0 = Tutorial
        SccProvider0 = MSSCCI:Perforce\u0020SCM
    EndGlobalSection
    

    值应选择如下:

    • SccProjectName0:一个任意字符串,将在“更改源代码控制”对话框中显示为“服务器绑定”。此名称用于确定哪些项目/解决方案文件可以共享同一源代码管理连接。我建议不要为此名称使用空格,因为解决方案文件和项目文件中的空格转义规则是不同的。
    • SccProvider0:硬编码值“ MSSCCI:Perforce \ u0020SCM”。
  7. 使用您选择的Perforce客户端(p4.exe,P4Win,P4V)提交两个挂起的文件

现在,您可以测试绑定:

  1. 确保Visual Studio已关闭
  2. 删除“ name.sln”(尤其是“ name.suo”)以外的所有“ *”文件
  3. 打开Visual Studio并使用它打开name.sln
  4. 应出现一个连接对话框,使用适当的端口/客户端/用户,然后单击“确定”。
  5. 解决方案资源管理器现在应显示带有挂锁覆盖图标的解决方案节点: 源控制的空白解决方案
  6. 现在,您可以使用“文件”->“源代码控制”->“更改源代码...”来验证解决方案的源代码控制状态: 空白溶液的源控制状态 注意:“服务器绑定”列显示了我们为“ SccProjectName0”选择的值。

源代码控制新项目

如果您要创建一个全新的项目,并想立即在Perforce软件仓库中对其进行跟踪,请执行以下步骤:

  1. 在Visual Studio中打开源代码控制的解决方案
  2. “文件”->“添加”->“新建项目...”-选择要添加的项目类型,名称和位置(位置应为解决方案文件存储目录的子目录)
  3. “文件”->“全部保存”(这会将所有内存中的更改提交到解决方案文件和新创建的项目文件到磁盘)
  4. 使用您选择的编辑器手动编辑刚创建的项目文件(出现在记事本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 *绑定值有效
  5. 切换回Visual Studio;它应该自动检测到该项目文件已在外部进行了更新,并提出要重新加载它(如果没有,请手动卸载并重新加载该项目)

  6. “查看”->“待签入”
  7. 我建议右键单击“签入”->“(solutionName).vssscc文件”,然后选择“如果未更改则还原”(即使Visual Studio将其打开进行编辑,它仍保持不变);提供描述并提交更改

要验证新添加的项目是否正确绑定,您可以按照以下步骤操作:

  1. 确保Visual Studio已关闭
  2. 删除(solutionName).suo文件以及MSSCCPRJ.SCC(在解决方案目录中)
  3. 打开Visual Studio并使用它打开(solutionName).sln
  4. 应出现一个连接对话框,使用适当的端口/客户端/用户,然后单击“确定”。
  5. 解决方案资源管理器现在应该显示带有挂锁覆盖图标的项目节点: 源代码控制的项目
  6. 现在,您可以使用“文件”->“源代码管理”->“更改源代码管理...”来验证解决方案的源代码管理状态: 源代码控制项目的状态

    关于此状态屏幕截图的一件事要注意的是,当我选择解决方案行时,所有剩余的行也都被“选中”(蓝色突出显示)。这是因为所有这些条目都具有相同的“服务器绑定” +“本地绑定”,因此共享相同的源控制提供程序(P4)连接。

    还要注意,两个项目的“相对路径”都有两个级别,并且相对于同一“本地绑定”(解决方案文件所在的目录)。

源代码控制现有(未绑定)项目

如果您有尚未在任何其他Perforce解决方案中使用的现有项目,请按照以下步骤将其添加到Perforce中(即,导入以前未经源代码控制的项目(Internet下载等)或使用其他源代码控制提供程序(Visual Source Safe等)。

  1. 将项目复制到适当的位置
  2. 清理现有的源代码管理绑定(如果有):
    • 删除现有的项目文件绑定,即所有以“ Scc”开头的属性
    • 删除与项目文件相同的目录中的文件(projectName).vspscc(如果有)
  3. 在Visual Studio中打开源代码控制的解决方案
  4. “文件”->“添加”->“现有项目...”-浏览到项目(在步骤1中创建的副本)
  5. “文件”->“全部保存”(这会将所有内存更改提交到解决方案文件)
  6. 遵循“源代码控制新项目”中的步骤4-7(即,现在将“ Scc *”属性元素添加到PropertyGroup中

验证步骤与“源代码控制新项目”部分中的完全相同。

源代码控制现有(绑定)项目

如果您有已经使用此处讨论的技术绑定到Perforce的项目,并且想要在其他解决方案(新分支,重用该项目的替代解决方案等)中使用它们,请执行以下步骤:

  1. 将项目整合到所需位置
  2. 在Visual Studio中打开源代码控制的解决方案
  3. “文件”->“添加”->“现有项目...”-浏览到步骤1中通过集成创建的项目
  4. “查看”->“待签入”->“签入”-添加描述并提交

概要

  • 源控件绑定信息存储在解决方案和项目中,必须同步(否则,Visual Studio将尝试修复任何差异)
  • 我始终将项目文件视为绑定信息的主要来源,而将解决方案文件视为一次性文件,可以通过以下方式轻松地重新创建这些文件:首先对空白解决方案进行源代码控制,然后添加所需的项目
  • 解决方案文件应始终具有有效的SccProvider0SccProjectName0值(必须与新版本的P4SCC插件一起手动添加)
  • 项目文件应始终具有有效的SccProjectName(最好与SccProjectName0相同),SccLocalPathSccProvider值(也必须手动编辑,因为P4SCC的默认设置不好)

我还提供了您的原始问题的答案:

当您执行“更改源代码管理”并绑定项目时会发生什么?Visual Studio如何决定要在项目和解决方案文件中放入什么?

这将更新您要重新绑定的项目文件中的“ Scc *”元素;然后,解决方案文件也将更新,以使其与项目文件绑定同步

当您执行“从源代码管理中打开”时会发生什么?

允许您选择要打开的解决方案。之后,解决方案中包含的所有项目都将自动同步到开头。我发现此功能在Perforce世界中不是很有用,在该世界中无论如何您都必须创建一个客户端,并且很可能是从P4V / P4Win / P4同步此客户端,而不是依赖Visual Studio。在没有视图概念的Visual Source Safe世界中,这很有用,您可以定义存储库在结帐时间的去向。

SccLocalPath和SccProjectFilePathRelativizedFromConnection引用的“连接”文件夹是什么?Visual Studio / Perforce如何选择它?

这是Visual Studio的簿记。它是根据每个项目文件中的绑定确定的(理论上我想如果一个项目文件由于某种原因丢失了绑定信息,则可以从解决方案信息中对其进行重构...)

有没有建议的方法,即使您创建解决方案的新分支,也可以使源代码控制绑定继续工作?

我希望以上部分为您提供一种对我来说非常有效的方法的想法:-)。


1
很好的答案,经过充分研究!在实验中,我一直在尝试类似的方法。主要区别在于我的项目中所有SCC设置都具有“ SAK”。只要按照您的解决方案说明中的步骤6进行操作,如果没有MSSCCPRJ.SCC,这似乎很高兴。我应该注意什么?
2009年

我主要是确保“更改源代码控制”看起来像我的上一个屏幕截图。如果服务器和本地绑定相同,并且所有项目都一起突出显示,则说明一切正常。
米兰加迪安,2009年

3
另外,在我拥有一个在P4中绑定并提交了所有项目的解决方案之后,我倾向于进行“大爆炸检查”:从工作区中删除所有解决方案文件(p4 sync //...#none),然后删除解决方案目录,同步到头部并在Visual Studio中打开新同步的解决方案。
米兰加迪安

2
上面的“大爆炸检查”可确保新的团队成员可以加入项目,并且同步后事情将“为他们工作”,这是我发现的最大问题-部分绑定,人们从未注意到,因为“它在我的机器上工作” (它仅因.suo文件已存在而起作用)。
米兰加迪安

1
在您了解良好信息的海洋中,一个极为有用的提示是删除<Name>.suo文件。那在很多场合对我都有帮助。

22

米兰的职位经过精心研究和撰写,但其篇幅足以证明P4SCC模型已损坏。将源代码控制绑定信息存储在项目和解决方案文件中是荒谬的。强制(通过sccprojectname)将项目仅作为一个解决方案的一部分是同样荒谬的。

此外,P4SCC在大型解决方案中具有巨大的性能成本,因为它在启动时会从源代码管理中检索每个文件的信息,并在整个开发过程中将其保持在内存中。它以无信息的.vsscc和vssscc文件的形式创建了额外的文件,以支持Perforce不使用的某些SCC功能(AFAICT)。

理想的Perforce集成如下所示:

  • 如果创建新的解决方案,项目或项目项,请运行“ p4 add”。
  • 如果我更改文件,请运行“ p4编辑”。
  • 一些工具栏/上下文菜单集成,用于修订历史记录,修订图,游戏中时光倒流/归咎于“在P4 gui中显示”。
  • (很高兴)如果我重命名软件仓库中存在的文件,请运行“ p4集成”和“ p4删除”。如果我重命名为添加而打开的文件,请运行“ p4恢复”和“ p4添加”。
  • 就这样

我们已经完全摆脱了P4SCC及其奇异的要求和负担。相反,我们使用NiftyPerforce。有一些错误,但是与解决Perforce <-> VSSCC模型中的设计缺陷相比,解决这些错误的麻烦要少得多。


那肯定看起来不错。我要给同事看。我同意P4SCC是可怕的坏了,虽然我不禁觉得它必须能够提供它的功能(如显示的文件状态图标)而不相当的大规模解决方案如此缓慢,并没有在所有的“源代码控制信息签入文件”。我想知道为什么Perforce不能制作出更好的插件-当然他们的许多客户必须使用Visual Studio吗?
2010年

4
我的理解是,问题和性能问题是Visual Studio的源代码管理插件界面特有的。存在架构不匹配的情况,因此P4必须假装像VSS一样工作。来自Perforce在2008年3月的支持:“我们不太可能为Visual Studio创建一个非MSSCCI软件包。VisualStudio中的接口太多,从长远来看将不复存在,并且不会给用户带来任何好处。 ” 我不知道他们是否仍然支持这一说法。他们有可能。从那时起,我也没有尝试过P4SCC。性能现在可能会更好。
Timbo,2010年

1
@ Weeble,@ Timbo-我同意P4SCC并不是世界上最出色的软件,而且我自己也已经看到大型项目的速度下降。但是,我认为在解决方案和项目中设置P4绑定的复杂性是您一次要支付的“税”,而不必再次支付。之后事情“正常工作”。我认为,Perforce可以将P4SCC的源代码发布给社区,从而可以从根本上改善设置的性能特征和复杂性。一个人总是可以梦想:-)。
米兰·加迪安

@Milan-这是每个项目的一次性税收,可能在大多数解决方案中都可以正常工作。但是,每次添加项目时,我们都要与SccLocalPath和SccProjectFileRelativizedFromConnection进行斗争,这在我们切换项目时相对经常。试图在多个解决方案之间共享项目是一个巨大的痛苦。
Timbo

在我的新演出中,我们在VS 2012上使用了新的P4VS。IMO比P4SCC和NiftyPerforce更好。
Timbo

9

只是为了保持最新状态-P4VS插件大约在2012年被重写

现在,您可以直接从IDE自然地与Perforce进行所有日常交互,例如签入代码和查看文件历史记录。

如果您是高级用户,并且想要更多,P4VS不会让人失望。P4VS与Perforce Streams完全兼容,并且可以从IDE中访问流图以及延时视图和修订图。如果您负责分支机构管理,则也可以从P4VS进行合并。

而且,如果您是远程工作或想要进行一些私有分支,则可以通过P4VS配置P4Sandbox。


5

通过使用P4CONFIG环境变量,可以简化将Perforce与Visual Studio一起使用的过程。

基本上,您会进入Visual Studio,依次单击“工具”->“选项”->“源代码控制”->“插件设置”,“高级”按钮。这将弹出一个特定于SCC集成的Perforce配置对话框。切换到“连接”选项卡,然后选中标题为“绑定与Perforce环境设置匹配的工作空间”的单选按钮。这将告诉perforce选择使用P4CONFIG环境变量来确定您所处的环境。P4V中的“编辑”->“首选项”下也存在此对话框,但仅影响p4v的行为。

设置P4CONFIG环境变量的方式在一定程度上取决于您。我喜欢在各处使用相同的名称,因此我设置了系统范围的环境变量P4CONFIG来查找名为p4config.cfg的文件。该文件只是一个ini样式文件,您可以在其中分配其他变量,例如P4USER,P4CLIENT,P4HOST等。Perforce会在当前目录和所有父目录中搜索该文件,直到遇到一个为止。基本上,您将此文件放在您的clientspec映射到您的硬盘驱动器上的最根目录中,而不必管它。

这种方法极大地减少了Visual Studio中SCC配置正常运行所需的“正确性”。(SAK绑定工作正常等)

如果是第一次将代码从perforce同步到完全干净的目录结构之后,并出现一个对话框,抱怨perforce想要暂时脱机工作或删除绑定,则仍然需要进行一些编辑。首先,需要修改.sln文件本身,以便知道sln具有自身的SCC绑定。通过确保将以下字段放在.sln文件中SccNumberOfProjects之后,可以完成此操作。

SccProjectName0 = Perforce\u0020Project
SccProvider0 = MSSCCI:Perforce\u0020SCM

如果您使用的是P4CONFIG方法,则所有单个项目都可以在默认的“ SAK绑定”下正常运行。修复此问题后,Perforce可以完美地从干净的同步进行工作,并且还可以消除每个项目目录中MSSCCPRJ.SCC填充的生成。


4

如果使用Visual Studio P4插件集成,则对重命名文件或将其移动到新的文件夹目录的支持将非常麻烦。没有内置的功能可以警告P4重命名文件或文件已被移动。

问题是,重命名文件不仅需要更新关联的VS项目文件,而且还需要将更改告知Perforce,以保持适当的修订历史记录。

当前,如果使用VS集成,我看不到在单个操作中同时完成这两项操作的方法。相反,您必须:

  1. 在Perforce客户端中重命名/移动文件
  2. 在VS中删除项目文件中的旧文件名引用
  3. 在VS中的项目文件中添加新的文件名引用
  4. 提交您的更改

如果您使用持续集成构建过程,并且在上一步之前的任何时间提交更改,则可以确保构建不完整。

该问题大大放大了需要重命名或移动的更多文件。这绝对不是一个顺利的过程。


3

在尝试了米兰·加迪安的翔实答案之后,我认为我可以提供一个更简单的解决方案来使其正常运行。

正如Weeble所提到的,当其他一切都正确设置时,SAK值可以很好地工作,并且它们通常是默认值(但我认为它取决于它是哪种项目类型)。如果它们未出现在您的项目中,则只需粘贴此属性组。

<PropertyGroup>
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>

将这两行添加到SourceCodeControl GlobalSection中的* .sln中。只要项目文件具有SAK值,它们就应该从解决方案继承名称。

SccProjectName0 = Perforce\u0020Project
SccProvider0 = MSSCCI:Perforce\u0020SCM

无需检入* .vssscc,*。vspscc或* .SCC文件(尽管打开解决方案时会生成这些文件)。


2

很差 我知道这不是您正在寻找的问题的答案(将来,也许您可​​以缩小重点?),但是与Visual Studio集成的源代码控制很糟糕。原因是他们都必须使用Microsoft糟糕的SCC接口。这是可悲的!他们将源代码控制信息放入项目文件中!他们为什么要那样做?

只需放弃Visual Studio集成并使用Perforce客户端即可。没有太多的额外工作。您不能每天花费30秒来切换到Perforce客户端并从那里签入/签出文件吗?


1
我始终使用Perforce客户端进行签入,但是能够从VS中签出文件会很有帮助。即使我自己愿意没有VS集成,也无法阻止其他人使用它。理想情况下,我想为所有人提供更好的体验。
Weeble

检出,重命名并知道要添加哪些新文件,该集成对您有用。(通常不清楚是否生成了VS文件,是否需要将VS添加到源代码控制中。)如果Perforce在编辑之前未强制执行检出,则集成需求将大大减少。
伊恩·林罗斯

1

我可以回答最后一个。

为了即使在创建新分支时也可以使用源代码控制绑定,请遵循严格的层次结构:

/Solution
  /library1
  /library2
  /product1
  /product2
  /subsolution
    /sublibrary1
    /subproduct1

每个文件必须完全在一个.vcproj中。您可以在同一目录中有多个.vcproj,但是如果它们共享文件,则共享文件必须放入自己的.vcproj。

如果您坚持不懈,那么所有Scc内容都将是相对路径,因此新分支将起作用(因为它仅更改最顶层的目录)。


我们的项目均未在其自己的文件夹中包含文件。似乎某些项目引用了未分支的程序集,因此驻留在解决方案文件夹之外。这就是为什么“连接”文件夹位于解决方案文件夹之外的原因吗?
2008年

-1

这不是Perforce问题,而是Visual Studio问题。愚蠢的要求修改源文件以允许Visual Studio理解正在使用SCM工具是荒谬的。

简单的答案是“停止使用Visual Studio源代码控件集成”。简直糟透了。即使使用TFS,也很烂。

如果您希望能够从Visual Studio中检出,只需创建一个自定义工具即可。您只需使用适当的VS变量简单地调用“ p4编辑”即可。要还原文件吗?同样的想法...用适当的变量调用p4还原。做完了

使用p4v来管理源代码管理需求(提交,历史记录,差异等)。Visual Studio可以作为源代码编辑器使用。它作为SCM接口很烂。


2
糟糕的答案。如果您的vcs支持正确,则vs集成很好。使用Vault或SVN可以实现与较新的vcs集成。
安迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.