72

PerforceとVisualStudioを使用しています。ブランチを作成するときは常に、「ソース管理から開く」を使用しない限り、一部のプロジェクトはソース管理にバインドされませんが、他のプロジェクトは関係なく機能します。私の調査から、私は関係することのいくつかを知っています:

.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の回答をご覧ください。どうやら、開発中の新しいP4VSプラグインがあります。うまくいけば、それはこのすべての混乱を取り除くはずです!

4

9 に答える 9

103

序章

Visual Studio での Perforce の統合は「ひどい」という主張には同意しません。むしろ、私はそれを「すぐに使える経験は最適ではない」と定義します:-)。次のセクションでは、統合に関する私の理解と、プロジェクト/ソリューションのセットアップに関する推奨事項について説明します。

ソース管理統合がどのように機能するかの詳細に興味がない場合は、この回答の最後までスキップして、Weeble の質問に対する回答を要約することができます。

免責事項: 以下のセクションは、私の経験に基づく推測に過ぎませんが、私は長年にわたって多くのプロジェクトでこの手法を使用してきました (各プロジェクトには、複数の実験的/トランク/メンテナンス/リリース ブランチがあり、場合によっては複数のソリューション ファイルさえありますが、問題はありません)。 )。欠点は、プロジェクト ファイルを手動で更新する必要があることです。ただし、2 分間の投資は、プロジェクトの存続期間にわたってかなりうまく償却されます :-)。

ソリューションとプロジェクト

Visual Studio は、最初のソリューションの読み込み中に、ソリューション ファイルと各プロジェクト ファイルの両方からソース管理バインド情報を使用します。このバインディング情報はname.suoファイルに保存されます (ソリューションとしてname.slnを使用していると仮定します) - suoファイルは隠しフラグでマークされているため、ファイル エクスプローラーでは表示されないことに注意してください ("Hiddenファイルとフォルダ」オプション)。

問題が発生した場合にソース管理プロバイダーに再バインドする最も簡単な方法は、適切なsuoファイルを削除してソリューションを再度開くことです。suo ファイルが作成された後は、 <Scc*> ​​要素を変更しても効果がありません。

ソリューションを最初に開いたときに、ソリューション ファイルに保存されているバインディング情報とプロジェクト ファイルに保存されている情報の間に不一致がある場合、Visual Studio はこれを修正しようとします (場合によっては、ソリューションの情報とプロジェクトの情報は、不一致を解決するための「マスター」として使用する必要があります):

代替テキスト

Visual Studio が DRY (Don't Repeat Yourself) 原則に違反しているのはなぜですか? 何も思いつきません。これには歴史的な理由があり、Visual Source Safe と呼ばれる悪夢のニーズと密接に結びついていると思います :-)。

「正しく」設定する方法は?

新規または既存のソリューション/プロジェクトを Perforce に追加するときは、常に空のソリューションを作成することから始めます (「空のソリューションのソース管理」セクションを参照)。次に、この空のソリューションにプロジェクトを次々と追加します。追加するプロジェクトが既に存在するか (「既存の (バインドされていない) プロジェクトのソース管理」セクションと「既存の (バインドされた) プロジェクトのソース管理」セクションを参照)、または新しいプロジェクトを作成する必要があるか (「 「新しいプロジェクトのソース管理」セクション)。

ブランク ソリューションのソース管理

ソース管理に新しい空のソリューションを追加するには、次の手順を実行します。

  1. Visual Studio を起動し、"新規" -> "プロジェクト..." -> "その他のプロジェクトの種類" -> "空のソリューション"; ソリューション名と場所を入力し、「OK」ボタン
  2. 「ファイル」→「ソース管理」→「ソリューションをソース管理に追加...」
  3. 接続ダイアログで、適切な P4 サーバー ポート、クライアント、およびユーザーを入力します (選択したクライアントのビューには、手順 1 で選択した場所が含まれている必要があります)。
  4. [表示] -> [保留中のチェックイン] -> [チェックイン] -> [送信] ボタンを押す代わりに、[送信] ダイアログで [キャンセル] を使用します。
    理由: 「チェックイン」アクションは、新しいファイル「name.vssscc」を作成し、「name.sln」と「name.vssscc」の両方を Perforce のデフォルト変更リストに追加します。送信ダイアログをキャンセルすると、「追加」操作が保留され、P4 に送信する前にファイルを編集できるようになります。
  5. Visual Studio を閉じる
  6. name.sln ファイルをお気に入りのエディター (本当に絶望的な場合はメモ帳を使用してください :-) ) で開き、2 つの新しい行 ( SccProjectName0およびSccProvider0 ) を追加します。空のソリューション ファイルには、次のようなソース管理セクションが含まれているはずです。

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

    値は次のように選択する必要があります。

    • SccProjectName0 : [ソース管理の変更] ダイアログに [サーバー バインド] として表示される任意の文字列。この名前は、同じソース管理接続を共有できるプロジェクト/ソリューション ファイルを決定するために使用されます。ソリューション ファイルとプロジェクト ファイルではスペースのエスケープ ルールが異なるため、この名前にスペースを使用しないことをお勧めします。
    • SccProvider0 : ハードコードされた値 "MSSCCI:Perforce\u0020SCM"。
  7. 選択した Perforce クライアント (p4.exe、P4Win、P4V) を使用して、2 つの保留中のファイルを送信します。

バインディングをテストできるようになりました。

  1. Visual Studio が閉じていることを確認します
  2. name.sln (特に name.suo) を除く **すべて* のファイルを削除します。
  3. Visual Studio を開き、それを使用して name.sln を開きます
  4. 接続ダイアログが表示されます。適切なポート/クライアント/ユーザーを使用して、[OK] をクリックします。
  5. ソリューション エクスプローラーには、南京錠のオーバーレイ アイコンが付いたソリューション ノードが表示されます。 ソース管理されたブランク ソリューション
  6. "File" -> "Source Control" -> "Change Source Control..." を使用して、ソリューションのソース管理ステータスを確認できるようになり ましたブランク溶液のソース管理状況 。 .

新しいプロジェクトのソース管理

まったく新しいプロジェクトを作成していて、すぐに Perforce デポで追跡を開始したい場合は、次の手順に従います。

  1. ソース管理されたソリューションを Visual Studio で開く
  2. "File" -> "Add" -> "New Project..." - 追加するプロジェクトの種類、名前、場所を選択します (場所は、ソリューション ファイルが保存されているディレクトリのサブディレクトリである必要があります)。
  3. "File" -> "Save All" (これにより、メモリ内のすべての変更がソリューション ファイルにコミットされ、新しく作成されたプロジェクト ファイルがディスクにコミットされます)
  4. 選択したエディターを使用して、作成したばかりのプロジェクト ファイルを手動で編集します (また、メモ帳を使いますか? ;-) )。次のプロパティ要素を PropertyGroup (任意のプロパティ グループ) に追加します。

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

    値は次のように選択する必要があります。

    • SccProjectName - これは、[ソース管理の変更] ダイアログに [サーバー バインド] として表示される値です。空白のソリューションで SccProjectName0 に使用した値と同じである必要があります。同じでない場合、ソリューションとこのプロジェクトは同じソース管理プロバイダー接続を共有できません
    • SccLocalPath - 参照ディレクトリへの相対パス ([ソース管理の変更] ダイアログに [ローカル バインディング] として表示されます); ソリューション ディレクトリを参照ディレクトリとして使用することをお勧めするため、これは実質的に、プロジェクト ファイルを含むディレクトリからソリューション ファイルを含むディレクトリへの相対パスです (私の例では、"(solutionDir)/Source/ProjectName/projectName.csproj" にプロジェクトを格納しています。相対パスは「2 レベル上」です)
    • SccProvider - ハードコードされた値 "MSSCCI:Perforce SCM"; これは、Scc* バインディング値が有効な SCCAPI プロバイダーを判別するために使用されます。
  5. Visual Studio に戻ります。プロジェクト ファイルが外部で更新されたことを自動的に検出し、再読み込みを提案する必要があります (そうでない場合は、プロジェクトを手動でアンロードして再読み込みします)。

  6. 「表示」->「保留中のチェックイン」
  7. 「チェックイン」 -> (solutionName).vssscc ファイルを右クリックし、「変更されていない場合は元に戻す」を選択することをお勧めします (Visual Studio で編集用に開いても、変更されていません)。説明を提供し、変更を送信します

新しく追加されたプロジェクトが適切にバインドされていることを確認するには、次の手順に従います。

  1. Visual Studio が閉じていることを確認します
  2. (solutionName).suo ファイルと MSSCCPRJ.SCC (ソリューション ディレクトリ内) を削除します。
  3. Visual Studio を開き、それを使用して (solutionName).sln を開きます。
  4. 接続ダイアログが表示されます。適切なポート/クライアント/ユーザーを使用して、[OK] をクリックします。
  5. ソリューション エクスプローラーには、南京錠のオーバーレイ アイコンが付いたプロジェクト ノードが表示されます。 ソース管理プロジェクト
  6. "File" -> "Source Control" -> "Change Source Control..." を使用して、ソリューションのソース管理ステータスを確認できるようになりました。 ソース管理プロジェクトのステータス

    このステータスのスクリーンショットで注意すべき点は、ソリューションの行を選択すると、残りの行もすべて「選択」されていることです (青色のハイライト)。これは、これらのすべてのエントリが同じ「サーバー バインディング」と「ローカル バインディング」を持ち、同じソース コントロール プロバイダー (P4) 接続を共有するためです。

    また、両方のプロジェクトの "相対パス" には 2 つのレベルがあり、同じ "ローカル バインド" (ソリューション ファイルが存在するディレクトリ) に相対的であることに注意してください。

既存の (バインドされていない) プロジェクトのソース管理

他の Perforce ソリューションでまだ使用されていない既存のプロジェクトがある場合は、次の手順に従ってそれらを Perforce に追加します (つまり、以前にソース管理されていないプロジェクト (インターネット ダウンロードなど) をインポートするか、別のソース管理を使用していたプロジェクト)。プロバイダー (Visual Source Safe など)。

  1. プロジェクトを適切な場所にコピーします
  2. 既存のソース管理バインディングをクリーンアップします (存在する場合):
    • 既存のプロジェクト ファイル バインディング、つまり「Scc」で始まるすべてのプロパティを削除します。
    • プロジェクト ファイルと同じディレクトリにあるファイル (projectName).vspscc を削除します (存在する場合)。
  3. ソース管理されたソリューションを Visual Studio で開く
  4. "File" -> "Add" -> "Existing project..." - プロジェクト (手順 1 で作成したコピー) を参照します。
  5. "File" -> "Save All" (これにより、メモリ内のすべての変更がソリューション ファイルにコミットされます)
  6. 「新しいプロジェクトのソース管理」の手順 4 ~ 7 に従います (つまり、「Scc*」プロパティ要素をPropertyGroupに追加します) 。

検証手順は、「新しいプロジェクトのソース管理」セクションとまったく同じです。

既存の (バインドされた) プロジェクトのソース管理

ここで説明する手法を使用して既に Perforce にバインドされているプロジェクトがあり、それらを別のソリューション (新しいブランチ、プロジェクトを再利用する代替ソリューションなど) で使用する場合は、次の手順を使用します。

  1. プロジェクトを目的の場所に統合する
  2. ソース管理されたソリューションを Visual Studio で開く
  3. "File" -> "Add" -> "Existing project..." - 統合を介してステップ 1 で作成されたプロジェクトを参照します
  4. 「表示」 -> 「保留中のチェックイン」 -> 「チェックイン」 - 説明を追加して送信

概要

  • ソース管理バインディング情報はソリューションとプロジェクトの両方に保存され、同期している必要があります (そうでない場合、Visual Studio は不一致を修正しようとします)。
  • 私は常に、プロジェクト ファイルをバインド情報の主要なソースとして扱い、ソリューション ファイルは、最初に空白のソリューションをソース管理してから目的のプロジェクトを追加することで簡単に再作成できる使い捨てファイルとして扱います。
  • ソリューション ファイルには常に有効なSccProvider0SccProjectName0 の値が必要です (新しいバージョンの P4SCC プラグインで手動で追加する必要があります)。
  • プロジェクト ファイルには、常に有効なSccProjectName (できれば SccProjectName0 と同じ)SccLocalPathおよびSccProvider の値が必要です (P4SCC の既定値は適切でないため、手動で編集する必要もあります) 。

元の質問への回答も含めます。

「ソース管理の変更」を行ってプロジェクトをバインドするとどうなりますか? Visual Studio は、プロジェクト ファイルとソリューション ファイルに何を入れるかをどのように決定しますか?

これにより、再バインドしているプロジェクト ファイル内の "Scc*" 要素が更新されます。その後、ソリューション ファイルも更新され、プロジェクト ファイルのバインドと同期されます。

「ソース管理から開く」とどうなりますか?

開きたいソリューションを選択できます。その後、ソリューションに含まれるすべてのプロジェクトが自動的に head に同期されます。とにかくクライアントを作成する必要があるPerforceの世界では、この機能はあまり役に立ちません.Visual Studioに頼るのではなく、P4V/P4Win/P4からこのクライアントを同期している可能性があります. これは、ビューの概念がなく、チェックアウト時にリポジトリがどこに移動するかを定義していた Visual Source Safe の世界では、ちょっと便利でした。

SccLocalPath と SccProjectFilePathRelativizedFromConnection が参照するこの「接続」フォルダは何ですか? Visual Studio/Perforce はどのように選択しますか?

これが Visual Studio の簿記です。各プロジェクト ファイルのバインドに基づいて決定されます (理論的には、プロジェクト ファイルが何らかの理由でバインド情報を失った場合、ソリューション情報から再構築できると思います...)。

ソリューションの新しいブランチを作成した場合でも、ソース管理バインディングが機能し続けるようにするための推奨される方法はありますか?

上記のセクションで、私にとって非常にうまく機能する方法のアイデアが得られることを願っています:-)。

于 2009-02-09T19:34:24.743 に答える
22

Milan の投稿は十分に調査され、よく書かれていますが、その長さは、P4SCC モデルが壊れていることを疑う余地のないことを示しています。プロジェクトとソリューション ファイル内にソース管理バインディング情報を保存するのはばかげています。プロジェクトが 1 つのソリューションのみの一部であることを (sccprojectname を介して) 強制することも、同様にばかげています。

さらに、P4SCC は、起動時に各ファイルのソース管理から情報を取得し、開発セッション全体でその状態をメモリに維持するため、大規模なソリューションではパフォーマンス コストが非常に高くなります。(AFAICT)Perforceが使用しない一部のSCC機能をサポートするために、情報のない.vssccおよびvsssccファイルの形式で余分なクラフトを作成します。

理想的な Perforce 統合は次のようになります。

  • 新しいソリューション、プロジェクト、またはプロジェクト アイテムを作成する場合は、'p4 add' を実行します。
  • ファイルを変更したら、'p4 edit' を実行します。
  • リビジョン履歴、リビジョン グラフ、タイムラプス/ブレイム、および「P4 GUI で表示」のためのいくつかのツールバー/コンテキスト メニューの統合。
  • (あると便利です) デポに存在するファイルの名前を変更する場合は、'p4 integrate' と 'p4 delete' を実行します。add 用に開いたファイルの名前を変更する場合は、'p4 revert' と 'p4 add' を実行します。
  • それで全部です

私たちは、P4SCC とその奇妙な要件と負担から完全に離れました。代わりにNiftyPerforceを使用します。いくつかのバグがありますが、これらのバグを回避することは、Perforce<->VSSCC モデルの設計上の欠陥を回避することよりもはるかにストレスが少ないことがわかっています。

于 2010-03-19T23:44:38.093 に答える
9

これを最新の状態に保つために、P4VS プラグインは 2012 年頃に書き直されました

IDE から直接、コードのチェックインやファイル履歴の表示など、Perforce との日常的なやり取りをすべて自然に実行できるようになりました。

あなたがもう少し多くを探しているパワー ユーザーなら、P4VS は期待を裏切らないでしょう。P4VS は Perforce Streams と完全に互換性があり、ストリーム グラフはタイムラプス ビューとリビジョン グラフと共に IDE からアクセスできます。ブランチ管理を担当している場合は、P4VS からもマージできます。

また、リモートで作業している場合や、プライベート ブランチを少し行いたい場合は、P4VS を介して P4Sandbox を構成できます。

于 2012-06-21T23:38:10.893 に答える
5

P4CONFIG 環境変数を使用すると、Perforce を Visual Studio で簡単に使用できます。

基本的に、Visual Studio に移動し、[ツール] -> [オプション] -> [ソース管理] -> [プラグイン設定]、[詳細] ボタンをクリックします。これにより、SCC 統合に固有の Perforce 構成ダイアログが表示されます。[接続] タブに切り替えて、[Perforce 環境設定に一致するワークスペースをバインドする] というラジオ ボタンをオンにします。これにより、現在の環境を決定するために P4CONFIG 環境変数を使用することを perforce に指示します。これと同じダイアログが P4V の Edit -> Preferences にありますが、p4v の動作にのみ影響します。

P4CONFIG 環境変数をどのように設定するかは、ある程度はあなた次第です。どこでも同じ名前にするのが好きなので、システム全体の環境変数 P4CONFIG を設定して、p4config.cfg という名前のファイルを探します。このファイルは、P4USER、P4CLIENT、P4HOST などの他の変数を割り当てることができる単なる ini スタイル ファイルです。PERFORCE は、現在のディレクトリとすべての親ディレクトリでこのファイルを検出するまで検索します。基本的に、このファイルをハード ドライブ上の clientspec がマップされている場所のルート ディレクトリに配置し、そのままにしておきます。

このアプローチにより、SCC 構成が機能するために Visual Studio で必要な「正確さ」の量が大幅に削減されます。(SAK バインディングは問題なく動作するなど)

初めて perforce からコードを同期した後、または完全にクリーンなディレクトリ構造に同期した後、perforce が一時的にオフラインで作業するかバインディングを削除しようとしているというダイアログが表示された場合は、まだ編集が必要です。主に、.sln ファイル自体を変更して、sln 自体に SCC バインディングがあることを認識する必要があります。これは、次のフィールドが .sln ファイルの SccNumberOfProjects の直後に配置されていることを確認することによって行われます。

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

P4CONFIG アプローチを使用している場合、個々のプロジェクトはすべてデフォルトの「SAK バインディング」で正常に動作するはずです。これを修正すると、Perforce はクリーンな同期から完全に動作できるようになり、各プロジェクト ディレクトリでの MSSCCPRJ.SCC cruft の生成も排除されます。

于 2011-07-06T07:16:15.510 に答える
4

Visual Studio P4 プラグイン統合を使用している場合、ファイルの名前変更や新しいフォルダー ディレクトリへの移動のサポートはひどく面倒です。P4 にファイルの名前変更や移動を警告する組み込み機能はありません。

問題は、ファイルの名前を変更するには、関連する VS プロジェクト ファイルを更新するだけでなく、適切なリビジョン履歴を維持したい場合に Perforce に変更を通知する必要があることです。

現在、VS 統合を使用している場合、1 回の操作で両方を実行する方法はありません。代わりに、次のことを行う必要があります。

  1. Perforceクライアント内からファイルの名前変更/移動
  2. VS 内のプロジェクト ファイル内の古いファイル名参照を削除します。
  3. VS 内のプロジェクト ファイルに新しいファイル名参照を追加します。
  4. 変更を提出する

継続的インテグレーション ビルド プロセスを使用し、最後のステップより前の任意の時点で変更を送信すると、ビルドが壊れていることが保証されます。

この問題は、名前の変更または移動が必要なファイルの数を大幅に拡大します。これは決してスムーズなプロセスではありません。

于 2008-11-26T22:35:53.280 に答える
3

Milan Gardianの非常に有益な答えを試した後、私はそれをかなりうまく機能させるためのより簡単な解決策を提供できると思います。

Weebleが述べたように、SAK値は、他のすべてが正しく設定されている場合は正常に機能し、多くの場合、デフォルト値です(ただし、プロジェクトの種類によって異なります)。それらがプロジェクトに表示されない場合は、このプロパティグループに貼り付けるだけです。

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

これらの2行をSourceCodeControlGlobalSectionの*.slnに追加します。プロジェクトファイルにSAK値がある限り、ソリューションから名前を継承する必要があります。

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

* .vssscc、*。vspscc、または* .SCCファイルをチェックインする必要はありません(ただし、ソリューションを開いたときに生成されます)。

于 2011-03-03T17:42:24.397 に答える
2

非常に悪い。それがあなたが求めていた質問に対する答えではないことは承知しています (将来的には、焦点を絞ることができるかもしれません) が、Visual Studio とのソース管理の統合は最悪です。その理由は、Microsoft のひどい SCC インターフェイスを使用しなければならないからです。情けない!彼らはソース管理情報をプロジェクト ファイルに入れました。なぜ彼らはそれをするのでしょうか?

Visual Studio との統合をやめて、Perforce クライアントを使用してください。余分な作業はそれほど多くありません。Perforce クライアントに切り替えて、そこからファイルをチェックイン/チェックアウトするために、1 日あたり 30 秒も割くことができませんか?

于 2008-11-07T04:16:27.600 に答える
1

私は最後のものに答えることができます。

新しいブランチを作成する場合でもソース管理バインディングを機能させるには、厳密な階層構造に従ってください。

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

各ファイルは、正確に 1 つの .vcproj に含まれている必要があります。同じディレクトリに複数の .vcproj を持つことができますが、ファイルを共有する場合、共有ファイルは独自の .vcproj に入れる必要があります。

これに執拗に取り組んでいる場合は、すべての Scc が相対パスになるため、新しいブランチが機能します (最上位のディレクトリのみが変更されるため)。

于 2008-11-06T12:52:39.023 に答える