2015-06-24 72 views
2

通常我製作的解決方案包含多個應用程序,它可能是一個Web應用程序,服務和一個簡單的控制檯應用程序。如何使用FAKE將項目構建到多個輸出?

要建立我的項目,我用:

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

然後

projects 
|> MSBuildRelease buildDir "ResolveReferences;Build" 

的問題,這是我所有的服務的DLL和控制檯dll文件在同一目錄下,buildDir結束了,是有辦法強制每個項目在buildDir內有一個子文件夾?對於Web項目,它看起來沒問題,因爲我有_PublishedWebsites文件夾依賴。

另外,當用這種方式構建它時,是不是打開了一些要多次構建的項目?我的意思是,如果ServiceWeb都有LibA的引用,那麼這三次不會結束建立LibA?有一次,它與文件格式本身相匹配,並且由於來自WebService的引用而兩次匹配。

UPDATE:

這是一個示範項目,你可以在這裏找到代碼:https://github.com/mastoj/FAKESimpleDemo

+0

好吧不,它不應該多次構建依賴關係(即使VS不會) - 對你的問題:最簡單的方法是,如果你將你的'項目'分成不同的部分(我猜你已經有一些子-src /'下的文件夾結構),然後執行多個'projects |> MSBuildRelease ...' - 也不要分割依賴關係嗎?通常,在構建腳本中有多個「目標」 – Carsten

+0

你見過[入門](https://fsharp.github.io/FAKE/gettingstarted.html)嗎?在那裏它將輸出分成'./ build'和'。/ test' - 與你想要做的非常相似 – Carsten

+0

@Carsten,謝謝你的評論。如果你構建sln,VS構建依賴項,但是在這裏我匹配每個csproj並構建它......這不會使每個csproj都單獨構建嗎?我確實分成了'build'和'test'。我想分裂成多個部分是最簡單的事情,但如果你可以指定基於項目的輸出,這將是很好的。 –

回答

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 
) 

這樣你就可以在每個項目的輸出目錄中建立一個文件夾。該文件夾的名稱取自項目文件的父目錄名稱。如果你願意,你可以使用文件名。

相關問題