2016-08-05 14 views
5

Tôi không thể nhớ nơi nhưng tìm thấy một ví dụ về cách loại trừ thư mục khỏi tìm kiếm. Vấn đề của chúng tôi là tìm kiếm node_modules sẽ gây ra trường hợp ngoại lệ đường dẫn dài.Thay đổi đột phá trong GetFiles với 0.15.2 không thể loại trừ các thư mục

Func<IFileSystemInfo, bool> exclude_node_modules = fileSystemInfo=>!fileSystemInfo.Path.FullPath.Contains("node_modules"); 

var solutions = GetFiles("./**/*.sln", exclude_node_modules); 

Bất kỳ trợ giúp nào để giải quyết vấn đề này đều hữu ích.

+0

Ví dụ ở đây: http://cakebuild.net/api/Cake.Common.IO/GlobbingAliases/2CDC8B98 Tôi thực sự rất vui khi tìm thấy nó khi nó xem xét để giải quyết vấn đề chính xác tôi đã có (node_modules). Có lẽ các tài liệu cần cập nhật nếu nó không giải quyết vấn đề này? –

Trả lời

3

Để tăng tốc độ truy nhập đệ quy của hệ thống tệp, Bánh sử dụng tính năng .NET được tích hợp sẵn, do đó giới hạn của giới hạn 260 char cũ của Windows. Vì vậy, khi đó là một cường độ nhanh hơn trong hầu hết các trường hợp sử dụng nó không thành công trên cấu trúc thư mục quá sâu như các module Node có thể giới thiệu.

Bạn có thể giải quyết vấn đề này bằng cách lặp lại thư mục theo thư mục và áp dụng vị từ trên thư mục cần loại trừ trước khi nhập.

Trong ví dụ của tôi cấu trúc thư mục dưới đây được sử dụng

Repo directory 
    | build.cake 
    | test.sln 
    | 
    \---src 
     | test.sln 
     | 
     +---proj1 
     | | test.sln 
     | | 
     | \---node_modules 
     |   node.sln 
     | 
     +---proj2 
     | | test.sln 
     | | 
     | \---node_modules 
     |   node.sln 
     | 
     +---proj3 
     | | test.sln 
     | | 
     | \---node_modules 
     |   node.sln 
     | 
     \---proj4 
      | test.sln 
      | 
      \---node_modules 
        node.sln 

gì chúng tôi muốn là để tìm tất cả các giải pháp đệ quy từ thư mục repo không vào thư mục node_modules và không tìm node.sln

Dưới đây là gợi ý giải pháp cho việc này là tạo phương thức tiện ích có tên là RecursiveGetFile thực hiện điều này cho bạn:

// find and iterate all solution files 
foreach(var filePath in RecursiveGetFile(
    Context, 
    "./", 
    "*.sln", 
    path=>!path.EndsWith("node_modules", StringComparison.OrdinalIgnoreCase) 
    )) 
{ 
    Information("{0}", filePath); 
} 


// Utility method to recursively find files 
public static IEnumerable<FilePath> RecursiveGetFile(
    ICakeContext context, 
    DirectoryPath directoryPath, 
    string filter, 
    Func<string, bool> predicate 
    ) 
{ 
    var directory = context.FileSystem.GetDirectory(context.MakeAbsolute(directoryPath)); 
    foreach(var file in directory.GetFiles(filter, SearchScope.Current)) 
    { 
     yield return file.Path; 
    } 
    foreach(var file in directory.GetDirectories("*.*", SearchScope.Current) 
     .Where(dir=>predicate(dir.Path.FullPath)) 
     .SelectMany(childDirectory=>RecursiveGetFile(context, childDirectory.Path, filter, predicate)) 
     ) 
    { 
     yield return file; 
    } 
} 

Kết quả của kịch bản này sẽ là một cái gì đó giống như

RepoRoot/test.sln 
RepoRoot/src/test.sln 
RepoRoot/src/proj1/test.sln 
RepoRoot/src/proj2/test.sln 
RepoRoot/src/proj3/test.sln 
RepoRoot/src/proj4/test.sln 

này khoảng trống vấn đề char 260 bằng cách bỏ qua các nhà sản xuất gặp khó khăn biết, sẽ không giải quyết được nếu đường dẫn không rõ khác có cùng một vấn đề.

+0

Tôi sẽ rất vui nếu hành vi GetFiles mặc định chậm hơn nhưng hoạt động trong nhiều trường hợp hơn, như trên. Tôi mong đợi một số ppl phải được sử dụng ví dụ: NPM, và sẽ có các cuộc gọi GetFiles sau đó. –

+1

Mô-đun Cake.LongPath sẽ cung cấp cho bạn hỗ trợ cho đường dẫn dài hơn trong Bánh. – devlead

+0

Đọc thêm tại đây: https://github.com/cake-contrib/Cake.LongPath.Module – devlead

Các vấn đề liên quan