2011-11-15 3 views
9

TFS2010のビルド定義でテストアセンブリを検索するための正しいマスクを指定する方法がわかりません。 出力アセンブリにデフォルトのバイナリフォルダを使用していません。各テストプロジェクトには、独自のbin \ Debugまたはbin \ Release出力フォルダーがあります。 私はデフォルトのマスクを使用する場合は** \ *テスト* .dllは私のテストは、このエラーで失敗しました:TFS2010ビルド定義の[アセンブリファイルのテストの指定]ダイアログの検索マスクを正しく指定するにはどうすればよいですか?

API restriction: The assembly 'file:///E:\Builds\....\obj\Debug\xxx.IntegrationTests.dll' 
has already loaded from a different location. It cannot be loaded from a new location within the same appdomain. 

** \ *テスト*の.dllマスクはで同じアセンブリのための複数の結果を見つけるためですbin \ Debugフォルダーとobj \ Debugフォルダー。

**\bin\Debug\*test*.dll 
**\bin\**\*test*.dll 
**\Debug\*test*.dll 

が、FindMatchingFiles活動復帰は常に0結果:

は、私が唯一のビンをOBJ \ Debugフォルダを除外して使用するには、このマスクを変更しようとしました。

テストアセンブリにフルパスを渡した場合にのみ動作します。

テストアセンブリ検索からobj \ Debugフォルダを除外したい場合、正しいマスクは何ですか?


私はまだFindMatchingFilesアクティビティを使用していますが、私は次のparamsでAssignアクティビティを追加する必要がありました:

To - testAssemblies 
From - testAssemblies.Where(Function(o) Not o.Contains("\obj\")).ToList() 

私は「OBJ」で見つかったすべてのテストアセンブリをフィルタリングしていますフォルダをこのようにします。あなたに関心のある

+0

はい - FindMatchingFilesとAssignアクティビティを使用する必要があります。 – Jedidja

答えて

1

私はまだFindMatchingFilesアクティビティを使用していますが、私は次のparamsでAssignアクティビティを追加する必要がありました:

へ - testAssemblies.Where(関数(O)未o.Contains( "\ OBJ \ - からtestAssemblies "))。ToList() " obj "フォルダにあるすべてのテストアセンブリをこのようにフィルタリングします。

4

ビルド活性は、「検索のテストアセンブリ」と命名されています enter image description here

だから、あなたはビルドスクリプトoutputDirectory変数の後に連結されたビルド定義に配置するもの。

このoutputDirectoryは、「初期化OUTPUTDIRECTORY」の活動で構成ごとに初期化されます。 enter image description here

あなたはあなたの「冗長ログ」Diagnosticに等しいを設定し、新しいビルドをキューに入れることができます。これが実行されたら(そして失敗した)、あなたのビルドで何が起こっているのかを確認します。

私の推測では、設定/プラットフォームの設定に問題はあると思いますが、具体的な入力はなく、推測しています。

+0

あなたはそうです。 testAssembliesコレクションは、「テストアセンブリの検索」アクティビティによって満たされます。私はこのアクティビティの後にtestAssembliesコレクションの内容を記録するためにforeachアクティビティを持っています。 ** \ * test * .dllマスクを使用すると、結果はOKですが、binおよびobjフォルダのテストアセンブリが重複しています。別のマスクを使用してフィルタリングしようとしましたが、間違ったマスクを使用しているようです。 testAssembliesコレクションは常に空でした。回避策としてコード内でフィルタリングすることができます... – Ludwo

0

おそらく、フィルタの最初に**が問題になります。検索の開始点は期待しない場所にあり、サブディレクトリにはテストファイルが含まれていません。

この問題のトラブルシューティングを行うには、フィルタ式の先頭に..\..\..を追加してください。デバッグの目的では、これはあなたがいるサブディレクトリ構造から抜け出し、システム上でテストファイルを探すために幅広い検索を行います。また、最初の部分を絶対にして、正しいディレクトリのサブツリーで検索していることを確認することもできます。

また、processmonitorセッションをビルドシステムで実行して、TFSビルドエンジンが実際にテストアセンブリを探している場所を確認することもできます。または、作成ワークフロー/アクティビティ自体でいくつかのロギングを実行します。

問題が見つかったら、検索ウィンドウを再度絞って、無関係なサブディレクトリ構造を検索しないようにします。

+0

私は試しましたが、結果は同じです。検索マスクを ".. \ .. \ .. \\ ** \。Unittests.dll"に変更しました。他のビルドから追加のテストアセンブリが見つかりました。次に、検索マスクを ".. \ .. \ .. \ .. ** \ bin \\ ** \。Unittests.dll"に変更し、テストアセンブリが見つかりませんでした。 – Ludwo

+0

プロセスモニタをあなたのファイルを探している場所が不思議です。テストアセンブリがあるサブディレクトリ構造の部分を投稿してください。あなたのパターンが一致しない理由を発見するかもしれません。 – kroonwijk

+0

実際にどのプロセスを監視するかは、** TfsBuildServiceHost.exe **。 – Gorgsenegger

1

私は基本的にあなたと同じ問題に遭遇しました。私は開発者にこの問題を引き起こしていたヘルパーテストアセンブリ(TestHelper)と_PublishedWebsitesフォルダを使用しています。

私がこれを解決するためにやったのは、MSTestに渡された同じテストDLLの複数を取得する問題を解決したことです。 「まあ、それは私がマスクでやろうとしていることだ」と思うかもしれない!私は同じ解決策を試みたが空になった。

私はカスタムタスクを書いて、ビルドプロセスがテストアセンブリを見つけた後にそれを挿入しました。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Build.Workflow.Activities; 
using System.Activities; 
using System.IO; 

namespace BuildTasks.Activities 
{ 
    [BuildActivity(HostEnvironmentOption.All)] 
    public class DistinctFileList : CodeActivity<IEnumerable<String>> 
    { 
    public InArgument<IEnumerable<String>> ListIn { get; set; } 

    protected override IEnumerable<String> Execute(CodeActivityContext context) 
    { 
     IEnumerable<string> listIn = context.GetValue(this.ListIn); 

     context.TrackBuildMessage("Items in ListIn: " + listIn.Count(), BuildMessageImportance.High); 

     var filenameGroupings = listIn.Select(filename => new FileInfo(filename.ToString())) 
     .GroupBy(fileInfo => fileInfo.Name); 

     IEnumerable<string> listOut = filenameGroupings.Select(group => group.FirstOrDefault().FullName); 

     context.TrackBuildMessage("Items in out list: " + listOut.Count(), BuildMessageImportance.High); 

     string multiples = string.Join(", ", 
     filenameGroupings.Where(group => group.Count() > 1).SelectMany(group => group.Select(fileInfo => fileInfo.FullName)).ToArray()); 

     context.TrackBuildMessage("Duplicate test items: " + multiples, BuildMessageImportance.High); 

     return listOut.ToList(); 
    } 
    } 
} 

「テストアセンブリの検索」タスクの後にこれを挿入します。

+0

です。Mike。FindMatchingFilesアクティビティの後にAssignアクティビティを使用して、FindMatchingFilesの結果をフィルタリングします。 – Ludwo

+0

これは基本的に私がここでやっていることです。私はちょうどより精通したチェックをしています。ファイル名を確認して、完全なパスではなく、少し "デバッグ"情報を出力します。同じ結論に。私をfこの方法についてうなぎをうまく! –

+0

FindMatchingFilesに対して検索パターンをテストして、このスレッドに投稿できるプログラムを作成しました:http://stackoverflow.com/questions/4524910/use-matchpattern-property-of-findmatchingfiles-workflow-activity/24408935#24408935 – invalidusername

0

私はこの問題に遭遇しましたが、重複を含むbinとobjではなく、さまざまなプロジェクトフォルダに同じDLLのコピーがたくさんあることがわかりました。

Ludwoの答えはAssignで十分に修正できましたが、私の状況ではFromパラメータのより一般的な値が必要でした。このVBは、ファイル名で検出されたファイルパスをグループ化し、各グループから最初のパスを選択します。もちろん、各ファイル名が1つの論理DLLにマップされている場合にのみ動作します:

testAssemblies.GroupBy(Function(a) New System.IO.FileInfo(a).Name).[Select](Function(g) g.First())