代码之家  ›  专栏  ›  技术社区  ›  Weeble

VisualStudio的源代码管理集成如何与Perforce协同工作?

  •  71
  • Weeble  · 技术社区  · 17 年前

    我们正在使用Perforce和visualstudio。每当我们创建一个分支时,除非我们使用“开源控制”,否则某些项目将不绑定到源代码管理,但其他项目无论如何都可以工作。从我的调查中,我知道了一些相关的事情:

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

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

    有时它们都设置为“SAK”,有时不设置。如果上面写着“SAK”,事情似乎更有可能发生。

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

    • SccLocalPath#
    • SCCProjectionQueName#

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

    所以,为了最终了解我想知道的细节:

    • SccLocalPath和SCCProjectFilePathRelativedFromConnection所指的“连接”文件夹是什么?Visual Studio/Perforce如何选择它?
    • 是否有推荐的方法使源代码管理绑定即使在创建解决方案的新分支时也能继续工作?

    我不再使用Perforce了,所以我不能担保,但请看一看 KCD's answer 在下面显然有 a new P4 VS plugin

    9 回复  |  直到 9 年前
        1
  •  102
  •   Spooky Muscothym    11 年前

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

    免责声明 :以下部分只是根据我的经验进行的有根据的猜测,但是我在许多项目中使用了多年的技术(每个项目都有多个实验/主干/维护/发布分支,有时甚至有多个解决方案文件,没有问题)。缺点是你不得不这样做 人工 更新项目文件-但是2分钟的投资在项目的生命周期内进行了摊销(IMHO:-)。

    VisualStudio在初始解决方案加载期间使用解决方案文件和每个项目文件中的源代码管理绑定信息。然后将该绑定信息存储在 苏先生 文件(假设我们正在使用 name.sln 文件标记为 标记,使它们在文件资源管理器中不可见(除非覆盖“隐藏的文件和文件夹”选项)。

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

    alt text

    为什么VisualStudio违反了DRY(不要重复自己)原则?我不知道。我认为这是有历史原因的,并且与被称为“视觉资源安全”的噩梦紧密相连:-)。

    如何“正确”设置它?

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

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

    1. 启动Visual Studio,“新建”->“项目…”->“其他项目类型”->“空白溶液”;填写解决方案名称和位置,“确定”按钮
    2. “文件”->“源头控制”->“将解决方案添加到源代码管理…”
    3. “视图”->“挂起的签入”->“签入”->在提交对话框中,使用“取消”,而不是点击“提交”按钮。
      原因
    4. 关闭Visual Studio
    5. SccProvider0

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

      应按如下方式选择值:

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

    现在可以测试绑定:

    1. 打开Visual Studio并使用它打开name.sln
    2. 解决方案资源管理器现在应使用挂锁覆盖图标显示解决方案节点: Source-controlled blank solution
    3. 现在可以使用“文件”->验证解决方案的源代码管理状态;“源头控制”->“更改源代码管理…” Source control status of blank solution 注意:“服务器绑定”列显示了我们为“SccProjectName0”选择的值。

    源代码控制新项目

    1. 在VisualStudio中打开源代码管理的解决方案
    2. “文件”->“全部保存”(这会将所有内存中的更改提交到解决方案文件,并将新创建的项目文件提交到磁盘)
    3. 使用您选择的编辑器手动编辑刚刚创建的项目文件(来吧,再次使用记事本?;-)。将以下属性元素添加到PropertyGroup(任何属性组)中:

      <PropertyGroup>
          ...
          <SccProjectName>Tutorial</SccProjectName>
          <SccLocalPath>..\..</SccLocalPath>
          <SccProvider>MSSCCI:Perforce SCM</SccProvider>
          ...
      </PropertyGroup>
      

      • -这是“更改源代码管理”对话框中显示为“服务器绑定”的值;应与空白溶液中用于SccProjectName0的值相同;如果不相同,解决方案和此项目将无法共享同一个源代码管理提供程序连接
      • -参考目录的相对路径(在“更改源代码管理”对话框中显示为“本地绑定”);因为我建议使用解决方案目录作为参考目录,所以这实际上是从包含项目文件的目录到包含解决方案文件的目录的相对路径(我的示例是将项目存储在“(solutionDir)/Source/ProjectName/ProjectName.csproj”中,因此相对路径是“向上两级”)
      • -硬编码值“MSSCCI:Perforce SCM”;这用于确定Scc*绑定值对哪个SCCAPI提供程序有效
    4. 切换回VisualStudio;它应该自动检测到项目文件已在外部更新,并提供重新加载(如果没有,则手动卸载和重新加载项目)

    5. “视图”->“挂起的签入”

    要验证新添加的项目是否已正确绑定,可以执行以下步骤:

    1. 删除(solutionName).suo文件以及msscprj.SCC(在解决方案目录中)
    2. 打开Visual Studio并使用它打开(solutionName).sln
    3. 应出现连接对话框,使用适当的端口/客户端/用户,然后单击确定
    4. 解决方案资源管理器现在应使用挂锁覆盖图标显示项目节点: Source-controlled projects
    5. Status of source-controlled projects

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

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

    源代码管理现有(未绑定)项目

    1. 清理现有源代码管理绑定(如果有):
      • 删除现有项目文件绑定,即以“Scc”开头的所有属性
    2. 在VisualStudio中打开源代码管理的解决方案
    3. “文件”->“全部保存”(这将把所有内存中的更改提交到解决方案文件)
    4. 遵循“源代码控制新项目”中的步骤4-7(即,现在将“Scc*”属性元素添加到 PropertyGroup )

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

    1. 在VisualStudio中打开源代码管理的解决方案
    2. “文件”->“添加”->“现有项目…”-通过集成浏览到步骤1中创建的项目
    3. “视图”->“挂起的签入”->“签入”-添加说明并提交

    • 源代码管理绑定信息存储在解决方案和项目中,必须同步(如果不同步,Visual Studio将尝试修复任何差异)
    • 我总是将项目文件视为绑定信息的主要来源,将解决方案文件视为一次性文件,通过首先控制空白解决方案的源代码,然后添加所需的项目,可以轻松地重新创建这些文件
    • 解决方案文件应始终具有有效的 SccProvider0 SccProjectName0
    • 项目文件应始终具有有效的 SccProjectName (宜与相同) SccProvider 值(也必须手动编辑,因为P4SCC默认值不好)

    我还包括对您最初问题的回答:

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

    允许您选择要打开的解决方案。之后,解决方案中包含的所有项目将自动同步到head。我发现这项功能在Perforce world中不是很有用,因为在Perforce world中,您无论如何都必须创建一个客户端,而且很可能是从P4V/P4Win/P4同步此客户端,而不是依赖Visual Studio。这在Visual Source安全的世界中是很有用的,在这个世界中,没有视图的概念,您定义了存储库在签出时的位置。

    SccLocalPath和SCCProjectFilePathRelativedFromConnection所指的“连接”文件夹是什么?Visual Studio/Perforce如何选择它?

    这是VisualStudio的簿记。它是根据每个项目文件中的绑定来确定的(理论上,我猜如果项目文件由于某种原因丢失了绑定信息,它可以从解决方案信息中重建…)

    我希望上面的部分能给你一些对我来说非常有效的方法的想法:-)。

        2
  •  22
  •   Tim Sparkles Andrew Barrett    16 年前

    此外,P4SCC在大型解决方案中具有巨大的性能成本,因为它在启动时从源代码管理中检索每个文件的信息,并在整个开发会话中在内存中保持该状态。它以信息自由的形式创造了额外的积垢;vssscc文件,以支持(AFAICT)Perforce不使用的某些SCC功能。

    理想的Performce集成如下所示:

    • 如果我创建了新的解决方案、项目或项目项,请运行“p4 add”。
    • (很高兴有)如果我重命名仓库中存在的文件,请运行“p4 integrate”和“p4 delete”。如果重命名为添加打开的文件,请运行“p4 revert”和“p4 add”。
    • 这就是全部

    我们已经完全摆脱了P4SCC及其奇怪的要求和负担。相反,我们使用 NiftyPerforce

        3
  •  9
  •   CJBS    12 年前

    为了保持最新,P4VS插件大约在2012年被重写

    现在,您可以执行所有的日常任务 直接从IDE。

    如果你是一个超级用户,想要更多,P4V不会让你失望。 P4VS与Perforce Streams和流图完全兼容 可从IDE访问,以及时间推移视图和修订 图表如果您负责分行管理,则可以合并

    如果你远程工作或者想做一些私人分支, P4V沙箱可以通过P4V进行配置。

        4
  •  5
  •   Zoner    15 年前

    基本上,您进入Visual Studio,工具->选项->源头控制->插件设置,高级按钮。这将打开特定于SCC集成的Perforce配置对话框。切换到“连接”选项卡,并选中标题为“绑定与您的Perforce环境设置匹配的工作区”的单选按钮。这将告诉perforce更喜欢使用P4CONFIG环境变量来确定您所处的环境。P4V中的编辑->下存在相同的对话框;首选项,但仅影响p4v的行为。

    如何设置P4CONFIG环境变量在某种程度上取决于您。我喜欢让它们在任何地方都被命名为相同的名称,所以我设置了一个系统范围的环境变量P4CONFIG来查找名为P4CONFIG.cfg的文件。此文件只是一个ini样式的文件,您可以在其中分配其他变量,如P4USER、P4CLIENT、P4HOST等。Perforce将在当前目录和所有父目录中搜索此文件,直到遇到一个。基本上,你把这个文件放在你的最根目录下,你的clientspec映射到你的硬盘上,然后别管它。

    这种方法极大地减少了VisualStudio中SCC配置需要的“正确性”数量,以便正常工作。(SAK绑定工作正常等)

    如果在第一次从perforce同步代码或将代码同步到完全干净的目录结构后,收到一个对话框,抱怨perforce想要暂时脱机工作或删除绑定,那么仍然需要进行一些编辑。主要是.sln文件本身需要修改,以便它知道sln本身有SCC绑定。要做到这一点,请确保将以下字段放在.sln文件中SccNumberOfProjects的后面。

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

    如果您使用的是P4CONFIG方法,那么所有单独的项目都可以使用默认的“SAK绑定”。修复此问题将允许Perforce完美地从干净的同步中工作,并消除在每个项目目录中生成msscprj.SCC cruft。

        5
  •  4
  •   Ray    17 年前

    支持重命名文件或将其移动到新文件夹目录 如果使用visualstudiop4插件集成,会很痛苦。不存在提醒P4重命名文件或文件已被移动的内置功能。

    问题在于,重命名文件不仅需要更新关联的VS项目文件,而且如果您想保持正确的修订历史记录,还需要将更改通知Performce。

    1. 从Perforce客户端中重命名/移动文件
    2. 在VS中的项目文件中添加新的文件名引用

    如果您使用持续集成构建过程,并且在最后一步之前的任何时候提交更改,则保证您的构建已中断。

        6
  •  3
  •   Dave Andersen    15 年前

    在对米兰·加迪安(Milan Gardian)非常翔实的答案进行了实验之后,我认为我可以提供一个更简单的解决方案,让它运行得非常好。

    正如Weeble所提到的,当其他一切都正确设置时,SAK值可以正常工作,它们通常是默认值(但我认为这取决于它是哪种项目类型)。如果它们没有显示在项目中,只需粘贴在此属性组中。

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

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

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

    不需要签入*.vssscc、*.vspscc或*.SCC文件(尽管它们将在打开解决方案时生成)。

        7
  •  2
  •   raven    17 年前

    非常糟糕。我知道这不是你想要的问题的答案(将来,也许你可以缩小焦点?),但是源代码管理与VisualStudio的集成太糟糕了。原因是他们都必须使用微软糟糕的SCC界面。真可怜!他们将源代码管理信息放在项目文件中!他们为什么要这样做?

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

        8
  •  1
  •   Thomas L Holaday    17 年前

    为了使源代码管理绑定即使在创建新分支时也能正常工作,请遵循严格的层次结构:

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

    每个文件必须正好位于一个.vcproj中。同一目录中可以有多个.vcproj,但如果它们共享文件,则共享文件必须放在各自的.vcproj中。

        9
  •  -1
  •   Mr Twister    13 年前

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

    简单的答案是“停止使用VisualStudio源代码管理集成”。简直糟透了。即使使用TFS,也很糟糕。

    如果希望能够从VisualStudio中检出,只需创建一个自定义工具。只需使用适当的VS变量调用“p4 edit”即可。要还原文件吗?同样的想法…使用适当的变量调用p4 revert。完成。

    使用p4v作为源代码编辑器管理您的源代码管理需求(提交、历史记录、差异等)。作为一个SCM接口,它很糟糕。