P4Vユーザーガイド (2019.1)

ストリームビューについて

ストリーム内のファイルを設定するには、[ストリーム]ダイアログの[詳細]タブの[パス]フィールドに移動して、ストリームビューを定義します。ビューはパス集合で構成されますが、ユーザがそれに割り当てるパスタイプによってパスの動作が制御されます。Helixサーバはストリームビューを使用して、ワークスペースビューディポ内のファイルの場所とクライアントワークスペース内のファイルの場所との対応を指定するマッピングのセット。ブランチビューディポ内の2つのコードライン間のブランチ関係を示す仕様。各ブランチビューは一意の名前を持ち、反映元のコードラインから反映先のコードラインにどのようにファイルをマッピングするかを定義します。これはブランチマッピングと同じです。を生成します。

ストリームにデータが取り込まれている場合、メインラインストリーム、開発ストリーム、リリースストリームは、ディポツリーペインでのみ表示されます。

タスクストリームがディポツリーパネルに表示されるのは、そのタスクストリームにデータが取り込まれていて、ワークスペースが設定され、そのワークスペースが選択されている場合だけです。

ストリームパスのタイプ

ストリームビューは以下のパスタイプを使用します。

  • share: shareパス内のファイルに対して、同期(取得)、サブミット、反映(ブランチ、マージ、コピー)処理を実行することができます。shareパスは、変更が他のストリームから流入するファイルと他のストリームに流出するファイルで使用されます。
  • isolate: ファイルを編集することはできますが、その編集内容を他のストリームに反映させることはできません。isolateパスは夜間ビルドやその他の生成ファイル(binディレクトリなど)を保存する場合に役立ちます。
  • import: 指定された場所からファイルが取得されます。ファイルを同期することはできますが、サブミットや反映を行うことはできません。importパスはサードパーティ製ライブラリなどのコンポーネントに使用します。ビルドに必要ですが、編集することはできません。ディポの場所が明示的に定義されていない場合、importパスのビューは親ストリームから継承されます。インポートされたファイルやフォルダは、インポート元の親ストリームでハロー アイコンが付けられます。
  • import+: importパスと同じように機能します。import+パスでは、明示的に定義されたディポパスを参照できますが、標準のimportパスとは異なり、import+パス内のファイルに対して変更をサブミットすることができます。
  • exclude: 親ファイルから継承されたファイルをストリームから除外します。excludeパス内のファイルを同期、サブミット、反映することはできません。

以下の表は各パスタイプの動作をわかりやすく示しています。

パスタイプ マージ/コピー ブランチ 同期 サブミット
share Y Y Y Y
isolate N N Y Y
インポート N N Y N
import+ N N Y Y
exclude N N N N

ストリームパスの構文

ストリームパスを指定する構文は、Perforceディポパス構文の先頭にある//depot名とストリーム名を削除したものに似ています。以下に例を示します。

ディポパス: //Ace/main/qa/...

ストリームビューパス: qa/...

ストリームのマージ、コピー、ブランチ、およびqaへの編集のサブミットを実行する場合は、ストリームビューで以下のようにshareパスを含めます。

share qa/...
注意

ストリームビューで位置指定子(%%1)とオーバーレイマッピング(+)を使用することはできません。

Helixサーバでは、先頭にワイルドカードを指定することはできません。ただし、末尾に単一のアスタリスク(*)を指定することはできます。例えば、ストリーム仕様のPaths:フィールドでshare *を使用すると、Helixサーバは、これを現在のディレクトリのワイルドカードとして解釈します。

ヒント

ストリーム仕様内の特定の文字列を検索するには、[Paths:]フィールド内をクリックしてCtrl + Fキーを押します。この操作により、[検索]ダイアログが表示されます。

親子間の継承

子ストリームは、フォルダパスと動作ルールを親ストリームから継承します。親子間の継承について理解するには、以下の用語が役立ちます。

  • 寛容性: パス上でどのような操作(サブミット、同期など)を許可するか

    パスタイプは親ストリームから継承されます。親ストリームから割り当てられたパスタイプの設定を上書きすることはできません。つまり、子ストリームの寛容性は常に親ストリーム以下になり、上回ることはありません。例えば、親ストリームでパスがisolateとして定義されている場合、その子ストリームでパスをshareと再定義して反映を有効にすることはできません。

  • 包括性: ストリームにどのパスを含めるか

    定義により、子の包括性を親より高くすることはできません。親に含まれていないフォルダパスを子に含めることはできません。そのため、isolateパス内のフォルダが親に含まれていない場合、そのパスを子に追加することはできません。以下の例では、Devストリームが正しく定義されていません。このストリームはMainの子で、isolateパスが含まれていますが、親には含まれていないフォルダが含まれているため、このパスは正しく動作しません。Devストリームでconfig/フォルダを隔離するには、このフォルダをshareとして含めるか、Mainisolateパスに含める必要があります。

    誤った例				正しい例
    Stream: //Acme/Main		Stream:	//Acme/Main
    Parent: none			Parent:	none
    Paths:	share apps/...		Paths:	share apps/...
    	share tests/...			share tests/...
    					share config/...
    
    Stream: //Acme/Dev		Stream:	//Acme/Dev
    Parent: //Acme/Main		Parent:	//Acme/Main
    Paths:	share apps/...		Paths:	share apps/...
    	share tests/...			share tests/...
    	isolate config/...		isolate config/...

このセクションでは、ストリームの単純な使用法と複雑な使用法の例を紹介します。

単純な共有

最初に、2つのストリーム//Ace/mainとその子ストリーム/Ace/devを使用した単純な例を示します。

ストリーム:	//Ace/main
Parent: none
Paths:	share ...
Stream: //Ace/dev
Parent: //Ace/main
Paths:  share ...

この場合、ストリームパス全体が共有されます。ワークスペースを//Ace/mainストリームに切り替えると、ワークスペースビューは以下のようになります。

//Ace/main/... //your_ws/...

ワークスペースビューでは、//Ace/mainストリームのルートがワークスペースにマップされます。ワークスペースを//Ace/devストリームに切り替えると、ワークスペースビューは次のようになります。

//Ace/dev/... //your_ws/...

また、//Ace/dev/のブランチビューは次のようになります。

//Ace/dev/... //Ace/main/...

つまり、devストリーム全体をワークスペースに同期でき、ストリーム全体をブランチ、マージ、コピーできます。

共有とインポート

ソフトウェアコンポーネントが3つの異なるディポ//Acme//Red//Tangoに保存されている場合について示します。

Acmeメインラインは以下のように構成されています。

ストリーム:	//Acme/Main
Parent: none
Paths:	share apps/...
	share tests/...
	import stuff/... //Red/R6.1/stuff/...
 	import tools/... //Tango/tools/...

ワークスペースを//Acme/Mainストリームに切り替えると、ワークスペースビューが次のようになります。

//Acme/Main/apps/... //your_ws/apps/...
//Acme/Main/tests/... //your_ws/tests/...
//Red/R6.1/stuff/... //your_ws/stuff/...
//Tango/tools/... //your_ws/tools/...

ストリームの[パス]フィールドに、ストリームのルートに関連するフォルダが一覧表示されます。これらのフォルダがワークスペースのワークスペースルート下に取得されます。共有フォルダは//Acme/Mainパスにマップされ、インポートされたパスは//Redディポと//Tangoディポ内のそれぞれの場所にマップされます。

共有、隔離、除外、インポート

メインラインで実際の開発を行いたくない場合について示します。XProd機能チームでは自身の開発ストリームを以下のように定義しています。

Stream: //Acme/XProd
Parent: //Acme/Main
Paths:	import ...
 	isolate apps/bin/...
	share apps/xp/...
	exclude tests/...

ワークスペースを//Acme/XProdストリームに切り替えると、ワークスペースビューが次のようになります。

//Acme/Main/apps/... //your_ws/apps/...
//Acme/XProd/apps/bin/... //your_ws/apps/bin/...
//Acme/XProd/apps/xp/... //your_ws/apps/xp/...
//Red/R6.1/stuff/... //your_ws/stuff/...
//Tango/tools/... //your_ws/tools/...
-//Acme/XProd/tests/... //your_ws/tests/...

ここでは作業中のストリームビューが継承されています。importパスは親のクライアントビューでマップされている場所にマップされます。shareおよびisolateパスは子ストリームにマップされます。これらのパスには、XProdチームが使用していて、変更のサブミット先となるファイルが含まれています。excludeパス(ビューではマイナス記号が付きます)はワークスペースに表示されません。

//Acme/XProdストリームには親が存在するため、copyコマンドやmergeコマンドで親のブランチマッピングを使用することができます。以下のように、ブランチビューは子および親によって共有されている単一のパスで構成されています(ストリームのブランチビューを表示するにはPerforce Command Line Client (P4)を使用する必要があります)。

-//Acme/XProd/apps/... //Acme/Main/apps/...
-//Acme/XProd/apps/bin/... //Acme/Main/apps/bin/...
//Acme/XProd/apps/xp/... //Acme/Main/apps/xp/...
-//Acme/XProd/stuff/... //Acme/Main/stuff/...
-//Acme/XProd/tests/... //Acme/Main/tests/...
-//Acme/XProd/tools/... //Acme/Main/tools/...

//Acme/XProdワークスペースでの作業は、//Acme/Mainの完全なブランチ内で作業しているかのように感じられますが、実際のブランチは非常に小規模です。

上位すべての親を子で共有する

ここでは、Bobが//Acme/XProdから子ストリームを作成する場合を考えてみます。彼のストリーム指定は以下のようになります。

Stream: //Acme/BobDev
Parent: //Acme/XProd
Paths: share ...

Bobのストリームにはデフォルトのビューテンプレートが存在します。Bobのストリームパス全体が"share"に設定されている場合、彼のワークスペース全体が彼のストリームにマップされると想定するかもしれません。そうではありません。継承された動作が常に優先されるためです。親でも共有されているパスにのみ、共有が適用されます。Bobのストリームのワークスペースでは、デフォルトのビューテンプレートを使用した場合、以下のクライアントビューが表示されます。

//Acme/Main/apps/... //your_ws/apps/...
-//Acme/BobDev/tests/... //your_ws/tests/...
//Acme/BobDev/apps/bin/... //your_ws/apps/bin/...
//Acme/BobDev/apps/xp/... //your_ws/apps/xp/...
//Red/R6.1/stuff/... //your_ws/stuff/...
//Tango/tools/... //your_ws/tools/...

Bobのストリームのワークスペースは、XProdストリームのワークスペースと同じになります。唯一異なるのは、サブミットに使用できるパスが//Acme/BobDevになることです。これは理にかなっています。Bobのストリームで作業する場合、変更は彼のストリームにサブミットされるためです。

一方、//Acme/BobDevストリームをその親にマップするブランチビューでは、両方のストリームで共有するように指定されているパスだけがマップされます。

-//Acme/Main/apps/... //XProd/apps/...
-//Acme/BobDev/tests/... //XProd/tests/...
-//Acme/BobDev/apps/bin/... //XProd/apps/bin/...
//Acme/BobDev/apps/xp/... //your_ws/apps/xp/...
-//Red/R6.1/stuff/... //XProd/stuff/...
-//Tango/tools/... //XProd/tools/...

デフォルトのテンプレートを使用すると、Bobは彼のチームが使用しているパスの彼自身のバージョンをブランチし、ブランチされていないファイルについては親ストリームと同じビューを持つワークスペースを使用できます。

ファイルを再マッピングする

ファイルは再マッピングできます。これにより、ディポの場所と異なるワークスペースの場所にファイルを配置できます。例えば以下のビューでは、親のdocsファイルを、このストリームで定義されているワークスペース内のdoctoolsパスに配置するように指定しています。

再マッピング:

再マッピング:
docs/... doctools/docs/...

ファイルを無視する

ワークスペースビューで無視するファイル名やディレクトリ名のリストを指定することができます。オブジェクトファイルや他の中間ファイルのチェックインと反映処理を実行しない場合は、このリストを指定すると便利です。これらのタイプは、ストリームに関連付けられているワークスペースのワークスペースビューから除外されます。以下に例を示します。

Ignored:
/tmp # ignores files named "tmp"
/tmp/... # ignores directories named tmp
.tmp # itnores file names ending in .tmp