Чтобы ускорить рекурсивную ходьбу файловой системы, Cake использует встроенные функции .NET для этого, но она ограничена старым ограничением 260 символов в Windows. Таким образом, когда в большинстве случаев использования это происходит быстрее, он не работает на слишком глубоких структурах папок, таких как, например, модули узла.
Вы можете решить эту проблему, выполнив итерацию папки по папке и применяя предикат, в какой папке исключить его перед вводом.
В моем примере ниже структура папок используется
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
То, что мы хотим, чтобы найти все решения рекурсивно из каталога репо, не входящих в каталог node_modules
и не найдя node.sln
Ниже предлагается решением для этого было бы создать полезный метод, который называется RecursiveGetFile
, который сделает это за вас:
// 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;
}
}
Вывод этого сценария будет что-то вроде
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
Это аннулирует 260 обугленного вопрос, пропуская известных производителей неприятности, не исправит, если другие неизвестные пути имеет такой же вопрос.
Пример здесь: http://cakebuild.net/api/Cake.Common.IO/GlobbingAliases/2CDC8B98 Я был очень рад найти его, поскольку он решил решить точную проблему, которую я имел (node_modules). Возможно, документы требуют обновления, если они не решают эту проблему? –