假:获取解决方案文件引用的所有项目

时间:2016-01-27 10:02:32

标签: f# f#-fake

如何获取解决方案文件引用的项目?

这里我有一个具体的用例。我从ProjectScaffold偷了这个目标CopyBinaries。它将项目构建的输出复制到单独的文件夹中。它不是很挑剔,并复制它找到的每个项目的输出。

Target "CopyBinaries" (fun _ ->
    !! "src/**/*.??proj"
    -- "src/**/*.shproj"
    |> Seq.map (fun f -> 
            ((System.IO.Path.GetDirectoryName f) </> "bin/Release", 
             binDir </> (System.IO.Path.GetFileNameWithoutExtension f)))
    |> Seq.iter (fun (fromDir, toDir) -> 
            CopyDir toDir fromDir (fun _ -> true))
)

如果我只想复制在解决方案文件中明确引用的项目的输出,该怎么办?我想到这样的事情:

Target "CopyBinaries" (fun _ ->
    !! solutionFile
    |> GetProjectFiles
    |> Seq.map (fun f -> 
            ((System.IO.Path.GetDirectoryName f) </> "bin/Release", 
             binDir </> (System.IO.Path.GetFileNameWithoutExtension f)))
    |> Seq.iter (fun (fromDir, toDir) -> 
            CopyDir toDir fromDir (fun _ -> true))
)

GetProjectFiles函数获取解决方案文件并提取引用的项目文件。

在FAKE中有没有类似假设的功能?

1 个答案:

答案 0 :(得分:0)

我发现没有任何内容可以提供有关解决方案文件的开箱即用信息。只需少量功能,就可以选择:

let root = directoryInfo "."

let solutionReferences baseDir = baseDir |> filesInDirMatching "*.sln" |> Seq.ofArray

let solutionNames paths = paths |> Seq.map (fun (f:System.IO.FileInfo) -> f.FullName)

let projectsInSolution solutions = solutions |> Seq.collect ReadFile |> Seq.filter (fun line -> line.StartsWith("Project"))

let projectNames projects = projects |> Seq.map (fun (line:string) -> (line.Split [|','|]).[1])

Target "SLN" ( fun () -> root |> solutionReferences |> solutionNames |> projectsInSolution |> projectNames |> Seq.iter (printfn "%s"))

这可以合并,并将功能跳过到您喜欢的任何分组中。你可能已经发现了这个或其他东西,但每个人都知道有选择是好的。谢谢。美好的一天。