PerforceとVisual Studioを使用しています。ブランチを作成するたびに、「ソース管理から開く」を使用しない限り、一部のプロジェクトはソース管理にバインドされませんが、他のプロジェクトは動作します。私の調査から、私は関係することのいくつかを知っています:
.csprojファイルには、次の設定があります。
時にはそれらはすべて「SAK」に設定されますが、そうでない場合もあります。これらが「SAK」と言う場合、物事が機能する可能性が高いようです。
.slnファイルには、多くのプロジェクトの設定があります。
(#は各プロジェクトを識別する番号です。)SccLocalPathはソリューションファイルへの相対パスです。多くの場合、「。」であり、プロジェクトが入っているフォルダーである場合もあれば、「..」または「..\..」である場合もあり、そのフォルダーを指すのは悪いようですソリューションフォルダー。相対化されたのは、プロジェクトファイルへのパスfromフォルダーです。 SccLocalPathがプロジェクトのフォルダーを指す場合、完全に欠落します。 SccLocalPathに ".."が含まれている場合、このパスにはブランチ間で同じではないフォルダー名が含まれている可能性があり、問題が発生すると考えられます。
だから、最終的に私が知りたい詳細に到達する:
2012年6月に追加:Perforceを使用しなくなったので、それを保証することはできませんが、 KCDのanswer 以下。どうやら 新しいP4 VSプラグイン が開発中です。うまくいけば、この混乱がすべて解消されるはずです!
Visual StudioでのPerforceの統合が「ひどい」という主張には同意しません。むしろ、「すぐに使用できるエクスペリエンスは最適ではありません」と定義します:-)。以下のセクションでは、統合についての私の理解と、プロジェクト/ソリューションのセットアップに関する推奨事項について説明します。
ソース管理の統合がどのように機能するかの詳細に興味がない場合は、この回答の最後までスキップして、Weebleの質問に対する回答をまとめます。
免責事項:以下のセクションは、経験に基づいた単なる推測にすぎませんが、多くのプロジェクトで長年にわたってこの手法を使用しています(各プロジェクトは複数の試験的/トランク/メンテナンス/リリースブランチ、場合によっては複数のソリューションファイルも問題なく)。不利な点は、プロジェクトファイルを手動で更新する必要があることですが、2分間の投資はプロジェクトの存続期間にわたってかなりうまく償却されます:-) 。
Visual Studioは、最初のソリューションの読み込み中に、ソリューションファイルと各プロジェクトファイルの両方からのソース管理バインディング情報を使用します。このバインディング情報はname.suoファイルに保存されます(ソリューションとしてname.slnを使用していると仮定)-suoファイルはhiddenフラグでマークされているため、ファイルエクスプローラーに表示されません(「非表示のファイルとフォルダー」オプションをオーバーライドしない限り)。
何か問題が発生した場合にソース管理プロバイダーに再バインドする最も簡単な方法は、適切なsuoファイルを削除してソリューションを再度開くことです。 suoファイルが作成された後、<Scc *>要素を変更しても効果はありません。
最初のソリューションを開くときに、ソリューションファイルに保存されているバインディング情報とプロジェクトファイルに保存されている情報に矛盾がある場合、Visual Studioはこれを修正しようとします(ソリューション内の情報を選択するか、プロジェクト内の情報は、不一致を解決するための「マスター」として使用する必要があります)。
Visual StudioがDRY(Do n't Repeat Yourself)原則に違反しているのはなぜですか?私にはわかりません。これには歴史的な理由があり、Visual Source Safeと呼ばれる悪夢のニーズと密接に結びついていると思います: -)。
Perforceに新規または既存のソリューション/プロジェクトを追加する場合、I alwaysは空のソリューションを作成することから始めます(「空のソリューションのソース管理」セクションを参照)。次に、この空のソリューションにプロジェクトを次々に追加します。追加するプロジェクトが既に存在するか(「既存の(バインドされていない)プロジェクトのソース管理」セクションと「既存の(バインドされた)プロジェクトのソース管理」セクションを参照)、新しいプロジェクトを作成する必要があるかによって手順が若干異なります( 「新しいプロジェクトのソース管理」セクション)。
ソース管理に新しい空のソリューションを追加するには、次の手順を実行します。
お気に入りのエディターでname.slnファイルを開き(メモ帳、本当に必死なら:-))、2つの新しい行を追加します(SccProjectNameおよびSccProvider)-空白ソリューションファイルには、次のようなソース管理セクションがあります。
GlobalSection(SourceCodeControl) = preSolution
SccNumberOfProjects = 1
SccLocalPath0 = .
SccProjectName0 = Tutorial
SccProvider0 = MSSCCI:Perforce\u0020SCM
EndGlobalSection
値は次のように選択する必要があります。
これで、バインディングをテストできます。
新しいプロジェクトを作成していて、Perforceデポですぐに追跡を開始したい場合は、次の手順に従ってください:
選択したエディターを使用して、作成したプロジェクトファイルを手動で編集します(メモ帳をもう一度入力してください;-))。次のプロパティ要素をPropertyGroup(任意のプロパティグループ)に追加します。
<PropertyGroup>
...
<SccProjectName>Tutorial</SccProjectName>
<SccLocalPath>..\..</SccLocalPath>
<SccProvider>MSSCCI:Perforce SCM</SccProvider>
...
</PropertyGroup>
値は次のように選択する必要があります。
Visual Studioに切り替えます。プロジェクトファイルが外部で更新されたことを自動的に検出し、それをリロードすることを提案する(そうでない場合は、プロジェクトを手動でアンロードしてリロードする)
新しく追加されたプロジェクトが適切にバインドされていることを確認するには、次の手順を実行できます。
[ファイル]-> [ソース管理]-> [ソース管理の変更...]を使用して、ソリューションのソース管理ステータスを確認できるようになりました。
このステータススクリーンショットについて注意すべきことは、ソリューション行を選択したときに、残りの行もすべて「選択」されたことです(青のハイライト)。これは、これらすべてのエントリが同じ「サーバーバインディング」+「ローカルバインディング」を持ち、したがって同じソース管理プロバイダー(P4)接続を共有するためです。
また、両方のプロジェクトの「相対パス」には2つのレベルがあり、同じ「ローカルバインディング」、つまりソリューションファイルが存在するディレクトリに関連していることに注意してください。
他のPerforceソリューションでまだ使用されていない既存のプロジェクトがある場合は、以下の手順に従ってPerforceに追加します(つまり、以前にソース管理されていない(インターネットダウンロードなど)または異なるソース管理を使用していたプロジェクトをインポートします)プロバイダー(Visual Source Safeなど)。
検証手順は、「新しいプロジェクトのソース管理」セクションとまったく同じです。
ここで説明した手法を使用して既にPerforceにバインドされているプロジェクトがあり、それらを別のソリューション(新しいブランチ、プロジェクトを再利用する代替ソリューションなど)で使用する場合は、次の手順を使用します。
また、元の質問への回答も含めています。
「ソース管理の変更」を行ってプロジェクトをバインドするとどうなりますか? Visual Studioは、プロジェクトファイルとソリューションファイルに何を入れるかをどのように決定しますか?
これにより、再バインドするプロジェクトファイルの「Scc *」要素が更新されます。ソリューションファイルも更新され、プロジェクトファイルのバインディングと同期します。
「ソース管理から開く」を実行するとどうなりますか?
開きたいソリューションを選択できます。その後、ソリューションに含まれるすべてのプロジェクトが自動的にヘッドに同期されます。この機能は、とにかくクライアントを作成する必要があるPerforceの世界ではあまり役に立たず、Visual Studioに依存する代わりにP4V/P4Win/P4からこのクライアントを同期する可能性があります。これは、ビューの概念がなく、レポジトリがチェックアウト時にどこに行くかを定義していたVisual Source Safeの世界では、一種の有用なものでした。
SccLocalPathとSccProjectFilePathRelativizedFromConnectionが参照するこの「接続」フォルダーは何ですか? Visual Studio/Perforceはどのようにそれを選択しますか?
これはVisual Studioの簿記です。各プロジェクトファイルのバインディングに基づいて決定されます(理論上、プロジェクトファイルが何らかの理由でバインディング情報を失った場合、ソリューション情報から再構築できる可能性があります...)
ソリューションの新しいブランチを作成する場合でも、ソース管理バインディングを引き続き機能させるための推奨方法はありますか?
上記のセクションが、私にとって非常にうまく機能している方法のアイデアを提供してくれることを願っています:-)。
ミラノの投稿はよく研究され、よく書かれていますが、その長さはP4SCCモデルが壊れているという疑いの影を越えて実証しています。プロジェクトとソリューションファイル内にソース管理バインディング情報を保存するのはばかげています。プロジェクトが1つのソリューションのみの一部であることを(sccprojectnameを介して)強制することも同様にばかげています。
さらに、P4SCCは、起動時に各ファイルのソース管理から情報を取得し、開発セッション全体を通じてその状態をメモリに保持するため、大規模なソリューションでは多大なパフォーマンスコストがかかります。情報なしの.vssccおよびvsssccファイルの形式で余分なクラフを作成して、(= AFAICT)Perforceが使用しない一部のSCC機能をサポートします。
理想的なPerforce統合は次のようになります。
P4SCCとその奇妙な要件と負担から完全に離れました。代わりに NiftyPerforce を使用します。いくつかのバグがありますが、Perforce <-> VSSCCモデルの設計上の欠陥を回避するよりも、これらのバグを回避する方がはるかにストレスが少ないことがわかります。
これを最新に保つために-P4VSプラグインは2012年頃に書き直されました
IDEから直接、コードのチェックインやファイル履歴の表示など、Perforceとの日常的な操作をすべて自然に実行できるようになりました。
あなたがもう少し探しているパワーユーザーであれば、P4VSは失望しません。 P4VSはPerforceストリームと完全に互換性があり、ストリームグラフはタイムラプスビューとリビジョングラフとともにIDEからアクセスできます。ブランチ管理を担当している場合は、P4VSからもマージできます。
また、リモートで作業する場合、またはプライベートブランチを少し実行する場合は、P4VSを介してP4Sandboxを構成できます。
P4CONFIG環境変数を使用すると、Visual StudioでPerforceを簡単に使用できます。
基本的には、Visual Studioの[ツール]-> [オプション]-> [ソース管理]-> [プラグイン設定]、[詳細設定]ボタンを選択します。これにより、SCC統合に固有のPerforce構成ダイアログが表示されます。[接続]タブに切り替え、[Perforce環境設定に一致するワークスペースをバインド]というラジオボタンをオンにします。 P4Vの[編集]-> [設定]に同じダイアログがありますが、p4vの動作にのみ影響します。
P4CONFIG環境変数の設定方法は、ある程度あなた次第です。どこでも同じ名前を付けるのが好きなので、システム全体の環境変数P4CONFIGを設定して、p4config.cfgという名前のファイルを探します。このファイルはiniスタイルのファイルであり、P4USER、P4CLIENT、P4Hostなどの他の変数を割り当てることができます。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クラフの生成もなくなります。
ファイルの名前変更または新しいフォルダーディレクトリへの移動のサポートは、ひどいであり、Visual Studio P4プラグイン統合を使用する場合は苦痛です。 P4にファイルの名前変更または移動されたことを警告する組み込み機能はありません。
問題は、ファイルの名前を変更するには、関連するVSプロジェクトファイルを更新するだけでなく、適切な改訂履歴を維持する場合は、Perforceに変更も通知する必要があることです。
現在、VS統合を使用している場合、単一の操作で両方を実行する方法はありません。代わりに、次のことを行う必要があります。
継続的インテグレーションビルドプロセスを使用し、最後の手順の前の任意の時点で変更を送信すると、ビルドが破損することが保証されます。
この問題は、名前の変更や移動が必要なファイルが増えるほど大きくなります。これはスムーズなプロセスではありません。
Milan Gardianの非常に有益な答えを試した後、それをかなりうまく機能させるための簡単なソリューションを提供できると思います。
Weebleが述べたように、SAKの値は、他のすべてが正しく設定されていれば正常に機能し、多くの場合デフォルト値です(ただし、プロジェクトの種類によって異なります)。プロジェクトに表示されない場合は、このプロパティグループに貼り付けてください。
<PropertyGroup>
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
これら2行をSourceCodeControl GlobalSectionの* .slnに追加します。プロジェクトファイルにSAK値がある限り、ソリューションから名前を継承する必要があります。
SccProjectName0 = Perforce\u0020Project
SccProvider0 = MSSCCI:Perforce\u0020SCM
* .vssscc、*。vspscc、または* .SCCファイルをチェックインする必要はありません(ただし、ソリューションを開くときに生成されます)。
非常に悪い。それはあなたが探していたあなたの質問に対する答えではないことを知っています(将来、おそらく焦点を絞ることができるでしょうか?)が、Visual Studioとのソース管理の統合はただひどいものです。全員がMicrosoftのひどいSCCインターフェイスを使用する必要があるためです。これは哀れです!プロジェクトファイルにソース管理情報を入れています!なぜそうするのですか?
Visual Studioとの統合を放棄し、Perforceクライアントを使用するだけです。それほど余分な作業ではありません。 Perforceクライアントに切り替えてそこからファイルをチェックイン/チェックアウトするために1日あたり30秒を節約することはできませんか?
最後の質問に答えることができます。
新しいブランチを作成してもソース管理バインディングが機能するようにするには、厳密な階層構造に従います。
/Solution
/library1
/library2
/product1
/product2
/subsolution
/sublibrary1
/subproduct1
各ファイルは、正確に1つの.vcprojに存在する必要があります。同じディレクトリに複数の.vcprojを配置できますが、ファイルを共有する場合、共有ファイルは独自の.vcprojに移動する必要があります。
これに執lentであれば、すべてのSccスタッフは相対パスになり、新しいブランチが機能します(最上位ディレクトリのみが変更されるため)。