9

チームのビルドサーバーのセットアップに取り組んでいます。

背景
Microsoft Visual Studio 2010 Ultimate を使用しています。当社の製品には、C# コード (主に)、外部 DLL および C コードが含まれています。.Net 4.0 を使用しており、70 以上のプロジェクトがあります。

コードの 3 つのブランチで作業しています。

  • プロダクションブランチ(現在リリースされているもの)
  • テスト ブランチ (ホット フィックス、バグ フィックス、エンド ユーザー テスト)
  • 開発ブランチ(新機能の追加)

すべてのブランチは TF ソース管理下にあります。

目標
私たちが望むのは、1 日 1 回、すべてのブランチのすべての単体テストをビルドして実行するビルド サーバーを用意することです。ビルド サーバーはソース管理のコードを使用する必要があります。私たちの目標は、高速な標準エラー検出を行うことです。ビルド サーバーの保守をほとんどまたはまったく行わないことをお勧めします。

buildserver が生成するビルドを使用するつもりはありません。必要なのは、build server を使用して、ブランチのビルドと単体テストを継続的に行うことだけです。

セットアップ
内容 現在、2 つのビルド定義がセットアップされています。1 つはテスト ブランチ用で、もう 1 つは開発ブランチ用です。どちらのビルド定義もソース管理からコードを取得します (その部分は問題なく動作します)。始まります。

問題
Test Branche は、単体テストを正常にビルドして実行できます。

開発ブランチは、(または 5 つのような) エラーのためにビルドできません:

The type or namespace name 'XXX' does not exist in the namespace 'YYY' (are you missing an assembly reference?)

エラーは、プロジェクト X がプロジェクト Y を参照している場合です。プロジェクト X と Y はどちらも C# .Net 4.0 プロジェクトであり、両方を完全に制御できます。X と Y の両方が DLL にコンパイルされます。プロジェクト Y には、プロジェクト X のクラスが実装しているインターフェイスが含まれています。

厄介な詳細は、プロジェクト X または Y のテスト ブランチと開発ブランチに違いがないことです。2 つのプロジェクトは、過去 3 か月間完全に同一でした。

問題は、なぜテスト ブランチでは機能するのに、開発ブランチでは機能しないのですか?

私はテストしました:
- プロジェクトは互いに正しく参照されています。- 3 つのブランチはすべて、私自身/同僚の開発マシンでビルドしても問題ありません (5 つの異なるマシンでテストしました)。- X プロジェクト全体を削除して再作成しようとしましたが、うまくいきませんでした。- Y プロジェクト全体を削除して再作成しようとしましたが、うまくいきませんでした。- プロジェクト X プロジェクトとそのクラスの名前空間を変更しようとしましたが、うまくいきませんでした。- プロジェクト Y プロジェクトとそのクラスの名前空間を変更しようとしましたが、うまくいきませんでした。- (開発マシンを再起動したことさえあります) - すべての変更は、ビルドサーバーがビルドに設定された後のソース管理に常にチェックインされています。

ログファイルを掘り下げていて、いくつかの興味深い詳細を見つけた追加
情報。これは、開発ブランチでのプロジェクト X のビルドの詳細です。

Task "AssignProjectConfiguration"
  Project reference "..\..\A" has been assigned the "Debug|x86" configuration.
  Project reference "..\..\Y" has been assigned the "Debug|x86" configuration. (can see there is a project Y)
  Project reference "..\..\B" has been assigned the "Debug|x86" configuration.  

しかし、タスク「ResolveAssemblyReference」で

Task "ResolveAssemblyReference"
  TargetFrameworkMoniker:
      .NETFramework,Version=v4.0
  TargetFrameworkMonikerDisplayName:
      .NET Framework 4
  TargetedRuntimeVersion:
      v4.0.30319
  Assemblies:
      System
      System.Xml.Linq
      System.Data.DataSetExtensions
      Microsoft.CSharp
      System.Data
      System.Xml
      System.Core
  AssemblyFiles:
      C:\Builds\1\A
      C:\Builds\1\B
(----- Missing project Y -----)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll

同じタスクのテスト ブランスの場所

Task "ResolveAssemblyReference"
  TargetFrameworkMoniker:
      .NETFramework,Version=v4.0
  TargetFrameworkMonikerDisplayName:
      .NET Framework 4
  TargetedRuntimeVersion:
      v4.0.30319
  Assemblies:
      System
      System.Data.Entity
      System.Xml.Linq
      System.Data.DataSetExtensions
      Microsoft.CSharp
      System.Data
      System.Xml
      System.Core
  AssemblyFiles:
      C:\Builds\1\A
      C:\Builds\1\B
      C:\Builds\1\Y (There it is)
     C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll

そのため、何らかの理由で、プロジェクト X からプロジェクト Y への参照を単に「忘れる」ように感じます。

ヘルプ

4

6 に答える 6

6

私も同じ問題を抱えていました。

この場合、問題が私のせいではないことを知るのに数時間かかりました:-)

http://support.microsoft.com/kb/2516078 :

この問題は、.NET Framework ライブラリの Path.GetFullPath のバグが原因で発生します。これは、Visual Studio 2010 の既知の問題です。

症状:

... プロジェクト間に依存関係が存在する複数のプロジェクトでソリューションをビルドしようとすると、特定の条件下でビルドが失敗し、次のエラー メッセージが表示されます。

エラー メッセージ:「C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (1200, 9): 警告: 参照されているプロジェクト '現在のディレクトリから参照されているプロジェクトへの相対パス' は存在しません.」</p>

次の条件が満たされると、上記のエラー メッセージが表示されてビルドが失敗します。

  1. プロジェクト間に依存関係が存在する複数のプロジェクトを含むソリューションがあります。
  2. 次の 2 つのパスの長さの合計は、259 文字 (= MAX_PATH – 1) まで正確に加算されます。

1) 参照しているプロジェクトのディレクトリのパス。2) 現在のディレクトリ (= 参照元プロジェクトのディレクトリ) からの参照先プロジェクトへの相対パス。

注: MAX_PATH は、Windows API によって定義されたパスの最大長であり、260 文字に設定されています。

回避策:

この問題を回避するには、パスの長さを変更して、次の 2 つのパスの長さの合計が最大 259 文字にならないようにします。

  1. 参照しているプロジェクトのディレクトリのパス。

  2. 現在のディレクトリ (= 参照元プロジェクトのディレクトリ) からの参照先プロジェクトへの相対パス。

于 2012-09-10T15:41:22.680 に答える
2

最近同じエラーが発生しました。VS2010 でローカルにビルドされたソリューションは問題なく動作しましたが、ビルド サーバーでは一貫して失敗しました。最終的に、MSBuild 定義はRelease x86構成に設定されましたが、問題のあるプロジェクトはbin\x86\Releaseではなくbin\x86\Debugのアセンブリを参照していました。

アセンブリのリリースバージョンがデバッグバージョンの代わりに参照されていることを確認する(および必要に応じて修正する) と、うまくいくように思えました。

于 2012-12-04T18:56:05.063 に答える
1

私は非常によく似た問題を抱えていました。構成マネージャーのリリース構成の下で、プラットフォームが任意の CPU に設定され、ビルド チェックボックスがチェックされていないことがわかりました。

プラットフォームを x86 に設定し (レガシーな理由で他のすべてのプロジェクトがこれに設定されているため)、プロジェクトがこの構成で [ビルド] に設定されていることを確認すると、問題が修正されました。

于 2013-12-09T03:20:28.127 に答える