2011-11-15 16 views
9

Tôi không biết cách chỉ định đúng mặt nạ để tìm kiếm các assembly thử nghiệm của tôi trong định nghĩa xây dựng TFS2010. Tôi không sử dụng thư mục Binaries mặc định cho các hội đồng đầu ra. Mỗi dự án thử nghiệm có thư mục đầu ra bin \ Debug hoặc bin \ Release của riêng nó. Nếu tôi sử dụng mặt nạ mặc định ** \ * kiểm tra * .dll thử nghiệm của tôi thất bại với lỗi này:Cách chỉ định mặt nạ tìm kiếm chính xác cho hộp thoại "Kiểm tra tập tin mô tả thử nghiệm" trong định nghĩa xây dựng 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. 

Điều này là do ** \ * kiểm tra * .dll mặt nạ sẽ tìm thấy nhiều kết quả cho cùng lắp ráp trong các thư mục bin \ Debug và obj \ Debug.

Tôi cố gắng để thay đổi mặt nạ này để loại trừ obj \ thư mục Debug và chỉ sử dụng bin:

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

nhưng hoạt động FindMatchingFiles trở lại luôn 0 kết quả.

Chỉ hoạt động khi tôi vượt qua đường dẫn đầy đủ đến cụm thử nghiệm.

Mặt nạ đúng nếu tôi muốn loại trừ các thư mục obj \ Debug khỏi tìm kiếm hội đồng kiểm tra là gì?

CÁCH GIẢI QUYẾT:
tôi vẫn đang sử dụng hoạt động FindMatchingFiles, nhưng tôi đã có thêm hoạt động Gán với params sau:

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

Tôi lọc tất cả các cụm thi được tìm thấy trong "obj" thư mục theo cách này.

+0

Có - cũng phải sử dụng FindMatchingFiles và hoạt động Chỉ định. – Jedidja

Trả lời

1

tôi vẫn đang sử dụng hoạt động FindMatchingFiles, nhưng tôi đã có thêm hoạt động Gán với params sau:

Để - testAssemblies Từ - testAssemblies.Where (Function (o) Không o.Contains ("\ obj \ ")". ToList() Tôi lọc tất cả các bộ kiểm tra được tìm thấy trong thư mục "obj" theo cách này.

4

Các hoạt động xây dựng đó là quan tâm đến bạn được đặt tên "Find thử nghiệm Assemblies": enter image description here

Vì vậy, những gì bạn đặt vào định nghĩa xây dựng được nối sau khi xây dựng kịch bản biến outputDirectory.

outputDirectory này được khởi tạo cho mỗi cấu hình trong hoạt động "Initialize OutputDirectory": enter image description here

Bạn có thể sắp xếp một xây dựng mới, nơi bạn thiết lập 'Logging cách rườm rà' của bạn bằng Diagnostic. Khi điều này đã chạy (và không thành công), hãy kiểm tra xem điều gì đang xảy ra với bản dựng của bạn.

Tôi đoán là bạn có vấn đề với cài đặt cấu hình/nền tảng của bạn, nhưng không có đầu vào cụ thể chỉ đoán.

+0

Bạn nói đúng. bộ sưu tập testAssemblies được lấp đầy bởi "Find Assemblies" hoạt động. Tôi có hoạt động foreach sau hoạt động này để đăng nhập nội dung của bộ sưu tập testAssemblies. Nếu tôi sử dụng ** \ * test * .dll mask, kết quả là OK, nhưng với các assembly thử nghiệm trùng lặp từ các thư mục bin và obj. Tôi đã cố gắng để lọc nó bằng cách sử dụng mặt nạ khác nhau, nhưng có vẻ như tôi đang sử dụng mặt nạ sai. bộ sưu tập testAssemblies luôn trống. Tôi có thể lọc nó trong mã như một cách giải quyết ... – Ludwo

0

Có thể là ** ở đầu bộ lọc của bạn là vấn đề. Điểm bắt đầu của tìm kiếm nằm ở vị trí bạn không mong đợi và các thư mục con không chứa các tệp thử nghiệm của bạn.

Để khắc phục sự cố này, vui lòng thêm ..\..\.. vào đầu biểu thức bộ lọc của bạn. Đối với mục đích gỡ lỗi, điều này sẽ thoát khỏi cấu trúc thư mục con bạn đang thực hiện và thực hiện tìm kiếm rộng hơn trên hệ thống của bạn cho các tệp thử nghiệm. Bạn cũng có thể làm cho phần đầu tiên tuyệt đối, để đảm bảo bạn đang tìm kiếm trong các thư mục bên phải.

Thay vào đó, bạn cũng có thể chạy phiên processmonitor trên hệ thống xây dựng của mình, để xem công cụ xây dựng TFS của bạn thực sự đang tìm kiếm các hội đồng kiểm tra của bạn ở đâu. Hoặc thực hiện một số đăng nhập trong luồng công việc xây dựng/hoạt động.

Khi bạn đã tìm thấy sự cố, hãy thu hẹp lại cửa sổ tìm kiếm của bạn để không tìm kiếm các cấu trúc thư mục con không liên quan.

+0

Tôi đã thử nó nhưng kết quả vẫn như cũ. Tôi đã thay đổi mặt nạ tìm kiếm thành ".. \ .. \ .. \\ ** \. Unittests.dll". Các hội đồng kiểm tra bổ sung đã được tìm thấy từ các bản dựng khác. Sau đó, tôi đã thay đổi mặt nạ tìm kiếm thành "" .. \ .. \ .. \\ ** \ bin \\ ** \ Unittests.dll "và không tìm thấy hội đồng kiểm tra nào. – Ludwo

+0

Sau đó, bạn có thể thử với Process Monitor đang chạy trên Tôi đang tò mò nơi mà nó tìm kiếm các tập tin của bạn.Và xin vui lòng gửi một phần của cấu trúc thư mục con của bạn hội đồng kiểm tra được in Chúng tôi có thể có thể khám phá lý do tại sao mô hình của bạn không phù hợp với – kroonwijk

+0

Thêm vào câu trả lời này vì nó đã cho tôi một thời gian để tìm ra quá trình thực sự theo dõi - đó là ** TfsBuildServiceHost.exe ** – Gorgsenegger

1

Tôi đã chạy về cơ bản cùng một vấn đề mà bạn có. Tôi có các nhà phát triển bằng cách sử dụng một hội đồng kiểm tra trợ giúp (TestHelper) và một thư mục _PublishedWebsites đã gây ra vấn đề này.

Những gì tôi đã kết thúc để khắc phục điều này đã giải quyết được vấn đề nhận được nhiều của cùng một DLL kiểm tra được chuyển đến MSTest. "Vâng, đó là những gì tôi đang cố gắng làm với mặt nạ của tôi," bạn có thể nghĩ! Tôi đã thử giải pháp đó nhưng lại trống rỗng.

Tôi đã viết một tác vụ tùy chỉnh và chèn nó sau khi quá trình xây dựng tìm thấy các hội đồng kiểm tra. Dưới đây là mã dành cho tác vụ tùy chỉnh:

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(); 
    } 
    } 
} 

Bạn sẽ chèn sau công việc "Tìm tập hợp thử nghiệm".

+0

Xin chào Mike.Tôi đang sử dụng Gán hoạt động sau khi hoạt động FindMatchingFiles với truy vấn LINQ để lọc kết quả FindMatchingFiles.Tôi đã thêm phần giải pháp cho câu hỏi của mình. – Ludwo

+0

Ok, đó là cơ bản những gì tôi đang làm ở đây Tôi chỉ đang làm kiểm tra thêm một chút, tôi kiểm tra tên tập tin chứ không phải đường dẫn đầy đủ. Tôi cũng xuất ra một chút thông tin "gỡ lỗi". cho cùng một kết luận. lươn tốt hơn về phương pháp này! –

+0

Tôi đã viết một chương trình cho phép bạn kiểm tra các mẫu tìm kiếm của mình với FindMatchingFiles và đăng nó lên chủ đề này: http://stackoverflow.com/questions/4524910/use-matchpattern-property-of-findmatchingfiles-workflow-activity/24408935#24408935 – invalidusername

0

Tôi gặp sự cố này nhưng thấy rằng thay vì chỉ có bin và obj chứa các bản sao, tôi có nhiều bản sao của cùng một tệp DLL xuất hiện trong các thư mục dự án khác nhau.

Câu trả lời của Ludwo với Assign gần như đủ để khắc phục, nhưng đối với trường hợp của tôi, tôi cần một giá trị tổng quát hơn cho thông số From. VB này nhóm các đường dẫn tệp được phát hiện theo tên tệp và sau đó chọn đường dẫn đầu tiên từ mỗi nhóm. Tất nhiên nó sẽ chỉ hoạt động nếu và chỉ khi mỗi tên tệp ánh xạ tới một DLL hợp lệ:

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