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

时间:2015-06-24 06:11:55

标签: f#-fake

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

要构建我使用的项目:

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

然后

projects
|> MSBuildRelease buildDir "ResolveReferences;Build" 

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

此外,在以这种方式构建时,是否会为多个项目打开多次?我的意思是,如果ServiceWeb都引用了LibA,那么最终会建立LibA三次?有一次,由于来自WebService的引用,它与文件模式本身匹配两次。

更新

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

1 个答案:

答案 0 :(得分:1)

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

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
)

这样,每个项目构建的输出目录中都会有一个文件夹。文件夹的名称取自项目文件的父目录名称。如果你愿意,你可以使用文件的名称。