如何获取解决方案文件引用的项目?
这里我有一个具体的用例。我从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中有没有类似假设的功能?
答案 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"))
这可以合并,并将功能跳过到您喜欢的任何分组中。你可能已经发现了这个或其他东西,但每个人都知道有选择是好的。谢谢。美好的一天。