12

2 つのブランチ ("Main" と "NewFeature") を持つ TFS 2008 プロジェクトがあります。それぞれは、ソース コードの完全で独立した「コピー」(バリアント) です。

ワークスペース マッピングを変更することで、いずれかのバリアントをローカル PC にマッピングでき、両方のブランチで問題なく作業できます。

ただし、ビルド サーバーを NewFeature ブランチに切り替えるようにマッピングを設定すると (ビルド サーバーに関する限り、他に何も変更せずに NewFeature ソース コードを単純に交換する必要があります)、次のエラーが発生します。

There is no working folder mapping for $/Main/Product.sln

つまり、NewFeature ブランチからビルドしている場合、ソース コードのどこにもこのブランチへの参照がなくても、何かがまだMainブランチで検索されています。Main への参照をキャッシュしているように見えますか?!

完全にクリーンなビルドを実行しました (ビルド フォルダーをサーバーから削除し、/p:ForceGet=true を使用してビルドを実行して、マッピングがサーバーにフラッシュされていることを確認し、サーバー上にファイルをキャッシュする可能性のあるファイルがないことを確認します)。ワークスペース バインディング) ですが、これは役に立ちません。

助言がありますか?

4

6 に答える 6

9

TFS 2010 でブランチからビルドを実行したときにも、この問題が発生しました。TFS は、「$/Main/Product.sln の作業フォルダー マッピングがありません」と報告していました。解決策は、ビルド定義を次のように編集することであることが判明しました ( 「デフォルト テンプレート」ビルド プロセス テンプレートを使用しています — カスタム テンプレートでこれを試したことはありません):

  1. ビルド定義の [プロセス] セクション/タブに移動します。
  2. 1. Requiredを展開し、 Projects to Buildを探します。このエントリが、構築しているブランチ内のソリューション ファイルを指していることを確認してください。
  3. 2. Basicを展開し、 Automated Testsを探します。これは、構築中のブランチの正しいテスト設定ファイルを指しています。
于 2010-10-26T21:42:50.770 に答える
9

それを確認する:

  • $(SolutionToBuild) は、Product.sln を参照するときに相対パスを使用します
  • $/NewFeature/.../TFSBuild.proj と $/NewFeature/Product.sln の間の相対パスは、メイン ブランチと同じです。

/ 編集 /

ただし、$/Main と $/Branches/Feature がツリー階層の同じレベルにあることは重要ではないことに注意してください。ビルド サーバーのローカル パスも重要ではありません。重要なのは、各ブランチの下にあるものだけです。内容が内部的に一貫して いる場合、既存のビルド スクリプトはすべて変更しなくても機能するはずです。

すべてを結び付ける方法の具体例については、過去の回答を参照してください。

私の方法が唯一の方法ではありませんが、私が何年にもわたって遭遇した他のすべてのバリエーションよりもうまく機能することを証明できます:)

*率直に言って、チーム ビルドを細かく管理しようとすると、提案された MSBuild スクリプトの再構築よりもはるかに苦痛になる可能性があります。信頼性のために、tfsbuildservice.exe.config のカスタマイズをどこかにバージョン管理下に置く必要があります...1 つ以上のビルド サーバーを所有している場合 (または将来的に)、展開戦略の変更を検討する必要があります...最終的に必要になるSCM プロセスを管理するためのメタ SCM プロセス!

于 2009-12-02T21:12:25.687 に答える
3

OK、結果は次のとおりです-回避策を見つけました。

従来のビルドプロセス(ビルド、コピー、難読化、カスタムインストーラーのビルド、フォルダーへのコピー)のため、メインブランチと一緒にブランチを簡単に配置することはできません。交換する必要があります。

したがって、MainとNewFeatureがある場合は、Mainのマップを解除し、その場所にNewFeatureをマップします(つまり、ビルドサーバーで「c:\ Main」を使用し、そこに表示されるソースコードを変更するだけです)。

解決策#1(最も単純で、明白で論理的な解決策)は、次のマッピングを使用することです。

  • $ / NewFeature-> c:\ Main

期待される結果:NewFeatureコード構造はMainを置き換えるだけであり、ビルドサーバーはそれが別のブランチにあることを認識しません。

実際の結果:「使用していないのに$/Mainをマップしていません」というエラーで失敗します。

解決策#2はこれを行うことです:

  • $ / Main-> c:\ IgnoreThisFolder
  • $ / NewFeature-> c:\ Main

これは機能します(警告を抑制し、ブランチでビルドしていることを認識せずにビルドをMSBuildで続行できるようにします)。ただし、それは醜く、ビルドはすべてのメインブランチのソースコードを不必要に取得します。

解決策#3(テストされていない、#2よりもはるかにうまくいくことがわかっていない限り試してみるには費用がかかりすぎる)は次のとおりです。

  • すべてのソースコード($ / Main、$ / Branches / Featureから)を$ / Branches/Mainおよび$/Branches / Featureに移動して、一貫した階層の深さを取得し、これらの新しいパスで機能するようにMSBuildスクリプトを書き直します。
  • 次に、必要なブランチのみにマップし、TFSBuild.projを編集して、そのブランチにビルドするようにリダイレクトできることを願っています。

    (編集:はい、これはうまく機能します。コード構造全体を再編成して、すべて(すべてのブランチ)が単一のチームプロジェクトの共通ルートの下にあり、ブランチ/ビルドが問題にならないようにしました-何でも簡単に実行できますここで必要です。トリックは、ルートフォルダーを階層に挿入して、任意のレベルで分岐できるようにすることです。ビルドスクリプトに小さな調整を追加して、ブランチをパラメーターとしてビルドに渡すことができるようにしました。 MSBuildなので、今すぐバリアントをビルドするのは簡単です。作業したくないブランチはクロークするだけで、ビルドサーバーは満足のいく状態を保ちます。)

まとめ これらすべてのソリューション(専門用語を使用するため)は最悪です。ワークスペースを再マッピングし(この場合、単純ではありません。9つのマッピングエントリが必要なので、エラーが発生しやすく、面倒な作業です)、TFSBuild.projを編集し、すべてのソースコードを削除して、/を使用してビルドを実行する必要があります。 p:ForceGet = trueを指定して、ブランチ間でビルドを切り替えます。したがって、ブランチを切り替えるには約1時間かかります。信じられないほど-せいぜい数分かかるはずです!

私たちのプロジェクトは理想的な設定にはほど遠いことはわかっていますが、TFSで分岐するのがこれほど難しいはずだとは信じられません(SourceSafe、Accurev、Perforceでは簡単なことだったので、TFSではなぜそんなに苦痛なのですか?)。

他のすべての人はTFSブランチをどのように編成していますか?開発者をブランチ間でどのように切り替えますか?ブランチ間でサーバービルドをどのように切り替えますか?それは本当にこれほど苦痛である必要がありますか?

于 2009-12-03T10:32:19.943 に答える
2

ビルド定義を編集する場合、変更が必要な場所が 2 つあります。

  1. ソース設定 - 新しいプロジェクトの場所を指定します
  2. プロセス - (読み込みに時間がかかる場合があるため、しばらくお待ちください) [必須] で、[ビルドするアイテム] の場所を新しいソリューションに変更します。

お役に立てれば。

于 2014-01-13T16:20:03.460 に答える
0

新しいアップデート:

他の回答で報告されているように、短命の機能ブランチには問題ない回避策を見つけましたが、実際にはうまく機能しませんでした。それ以来、私は問題に戻ってきましたが、完全な解決策はとてつもなく単純です。

TFSBuild.proj では、パスは $(BuildProjectFolderPath) に基づいていました。このパスは、ローカル パス (D:\ServerBuildFolder\Main) ではなく、$/Main のようなサーバー側(ソース管理パス) に解決されます。

残念ながら、歴史的な理由から、ソース コードは複数のチーム プロジェクトに分割されています。つまり、1 つの「ブランチ」が、ソース管理の複数の分岐フォルダー ($/Main/Code および $/Libraries/Code など) に断片化されています。 $/Main および $/Libraries を含むブランチ)。したがって、ワークスペース マッピングを使用して、これらの異種フラグメントをソース管理から一貫した階層に再構築する必要があります。

これは、Richard が的確であったことを意味します。TFSBuild.proj ファイルから .sln ファイルへの相対パスが正しくありませんでした。これは、MSBuild/TFS が .sln が同じチーム プロジェクトおよびソース管理階層内にあると想定しているためです (したがって、 $/Libraries/Libraries.sln の代わりに $/Main/Libraries.sln)。

解決策は簡単です: $(BuildProjectFolderPath) をファイルのローカル パス (例: D:\ServerBuildFolder\Main) に置き換えて、相対参照が "ローカル空間" で解決されるようにしました (マッピングが適用された後)。 MSBuild がスムーズに実行されるようになりました。

この話の教訓: 1) コードベース間で何らかの参照が必要になる可能性がある場合は、決して複数のチーム プロジェクトを使用しないでください。新しいチーム プロジェクトが、アプリケーションとライブラリの間のある種の痛みのない論理的な区別を提供すると思い込まないでください。余分なプロジェクトは、管理上の悪夢であることが証明されています。まったくメリットがないのに、余分な問題が山ほどあります。(ボンネットの下にある 1 つの大きな共有パイルなので、すべての作業項目とソース管理フォルダーはすべてのプロジェクトで引き続き表示されます (!) が、プロジェクト間のリンクを非常に問題にするレンガの壁がいくつか追加されます)。

2) チーム プロジェクトのソース管理にルート レベルのフォルダーを常に 1 つ作成し、他のすべてをそのフォルダーの下に配置します。たとえば、プロジェクト「$/Main」の場合、「$/Main/Root」を作成し、ソース階層のすべてをルート内に配置します。

これらのルールに従うことで、将来、単一の「ルート」フォルダーを分岐できるようになり、単一の分岐と単一の追加のワークスペース マッピングのみが必要になります。これにより、早期脱毛を防ぐことができます。

(私の弁護では、最初からこのようにしていただろう - 私はレガシー セットアップで作業しています。レガシー セットアップの弁護では、理論的には良さそうに思えますが、Microsoft がサポートするアプローチではありません!)

于 2010-03-26T14:33:52.073 に答える
0

このエラーが発生しましたが、推測できるのは、定義が破損したか何かであるということだけです。プロセスをやり直し(構築しようとしていたソリューションを再追加)、ワークスペースを再マップしたところ、再び機能し始めました。HTH。

于 2012-09-13T15:46:28.647 に答える