Как копировать папки - FAKE F#MAKE

Я использую Copy Функция FAKE для копирования файлов из project1 в папку release, я использую следующий код:

Target "CopyProject1" (fun _ ->
    !!(buildDir @@ "/_PublishWebsites/Project1/**/*.*")
        |> Copy releaseDir
)

чтобы скопировать файлы из папки Project1 в папку выпуска, затем все файлы внутри Project1 копируются в папку выпуска, но я хочу сохранить структуру папок Project1 внутри папки выпуска, т.е. я хочу скопировать папки Project1 для выпуска, возможно ли это или мне придется создавать подпапки внутри моих папок релиза и копировать одну за другой. а если такого способа нет, то возможно ли это с помощью пользовательской задачи?

Если кто-то может помочь в этом отношении, это было бы очень полезно.

2 ответа

Это доступно через CopyWithSubfoldersTo. Это описание говорит, что это:

Копирует несколько групп файлов, каждая из которых представлена ​​объектом FileInclude, в целевую папку, сохраняя структуру папок, начиная с BaseDirectory каждого FileInclude.

Параметры такие же, как у Copy:

Target "CopyProject1" (fun _ ->
    [!!(buildDir @@ "/_PublishWebsites/Project1/**/*.*")]
        |> CopyWithSubfoldersTo releaseDir
)

РЕДАКТИРОВАТЬ

CopyWithSubfoldersTo работает с seq<FileInculdes> в то время как !! возвращает один FileIncludes, Это должно быть преобразовано в один список элементов, прежде чем его можно будет использовать.

Я использовал CopyDir Функция FAKE, и это рекурсивное копирование каталогов, нам просто нужно дать имя папки и место назначения, куда мы хотим копировать папки. Вот код:

Target "CopyFoldersTargetLocation" (fun _ ->
    CopyDir targetDir SourceDir allFiles
)

Поскольку другие решения не работали для моего случая, вот мое домашнее решение с использованием основных методов.NET:

let rec copyFilesRecursively (source: DirectoryInfo) (target: DirectoryInfo) =
    source.GetDirectories()
    |> Seq.iter (fun dir -> CopyFilesRecursively dir (target.CreateSubdirectory dir.Name))
    source.GetFiles()
    |> Seq.iter (fun file -> file.CopyTo(target.FullName @@ file.Name, true) |> ignore)

Target "CopyProject1" <| fun _ ->
    let source = buildDir @@ "/_PublishWebsites/Project1/"
    let target = releaseDir
    copyFilesRecursively (directoryInfo source) (directoryInfo target)
Другие вопросы по тегам