如何使用 FAKE 将项目构建到多个输出?

How do I build projects to multiple outputs using FAKE?

通常我做的解决方案包含多个应用程序,它可能是一个网络应用程序、服务,也可能是一个简单的控制台应用程序。

为了构建我使用的项目:

let projects = !! "src/**/*.csproj" -- "src/**/*.Tests.csproj"

然后

projects
|> MSBuildRelease buildDir "ResolveReferences;Build" 

这个问题是我所有的服务 dll 和控制台 dll 最终都在同一个目录中,buildDir,有没有办法强制每个项目在 buildDir 中有一个子文件夹?对于 Web 项目,它看起来很好,因为我有 _PublishedWebsites 文件夹可以依赖。

另外,这样构建的时候,不是有一些项目可以多次构建吗?我的意思是,如果 ServiceWeb 都有对 LibA 的引用,这不会以构建 3 次 LibA 结束吗?一次匹配文件模式本身,两次匹配来自 WebService 的引用。

更新:

这是一个演示项目,您可以在此处找到代码:https://github.com/mastoj/FAKESimpleDemo

我这样做的时候一定很累,因为很明显该做什么。我可以自己进行迭代并确定输出文件夹应该是什么,而不是立即传递所有项目。所以为了解决这个问题,我添加了两个辅助函数:

let getOutputDir proj =
    let folderName = Directory.GetParent(proj).Name
    sprintf "%s%s/" buildDir folderName

let build proj =
    let outputDir = proj |> getOutputDir
    MSBuildRelease outputDir "ResolveReferences;Build" [proj] |> ignore

Target "Build" (fun() ->
    trace "Building again!"

    projects
    |> Seq.iter build
)

这样,您将在每个构建的项目的输出目录中获得一个文件夹。文件夹的名称取自项目文件的父目录名称。如果您愿意,您可以使用文件的名称。