2013-04-10 69 views
6

我有以下設置:ASP.Net MVC .NET 4.0解決方案在這5個項目,和一些解決方案配置(站點1級,站點1-直播,站點2級等)。原因很簡單 - 我們將相同的代碼庫部署到具有不同配置設置的多個服務器。MSBuild - 如何在部署時強制執行「AfterBuild」目標?

爲了管理這些配置,我用特洛伊亨特在他的文章You're deploying it wrong! TeamCity, Subversion & Web Deploy part 1: Config transforms描述的方法。在2個字 - 我沒有的web.config在我的SVN回購,而不是我有Web.Base.ConfigWeb.Site1-Stage.Config等,並在項目XmlTransformation任務AfterBuild目標。在構建,所需的web.config是基於選擇的配置生成:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> 
    <Target Name="AfterBuild"> 
    <TransformXml Source="Web.Base.config" Transform="Web.$(Configuration).config" Destination="Web.config" StackTrace="true" /> 
    </Target> 

這裏談到的問題:當我執行的MSBuild這樣的:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild 

一切順利那麼,web.config適用於Site1-Stage配置。但是,如果我運行此命令:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild /P:DeployOnBuild=True 

我收到以下錯誤:

"MySolution.sln" (rebuild target) (1) -> "MySolution\MyWebProj.csproj" (Rebuild target) (3) -> (PreTransformWebConfig target) -> C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.5\Web\Microsoft.Web.Publishing.targets(1399,5): error : Copying file Web.config to obj\Site1-Stage\TransformWebConfig\original\Web.config failed. Could not find file 'Web.config'. [MySolution\MyWebProj.csproj]

我想明確地添加 「AfterBuild」 目標到MSBuild的命令行:

msbuild MySolution.sln /P:configuration=Site1-Stage /t:rebuild,AfterBuild /P:DeployOnBuild=True 

但它導致了相同的錯誤。

爲什麼需要這樣:這是一個非常孤立的例子,在現實中我是從的TeamCity CI服務器在嘗試設置自動發佈。我想,如果我添加了「的Visual Studio(SLN)」亞軍新建步驟之前,我目前的發佈步驟,將工作,它首先會重建項目(和產生的web.config) - 然後發佈。但是,我有很多發佈步驟(大約20個),我想避免這些。我的理解是,「發佈」流程將構建作爲其一部分,所以我想「重複使用」。

問題是:我該如何修改我的MSBuild命令行來強制進行配置轉換?

謝謝。

+0

你'AfterBuild'目標沒有任何產出。似乎MSBuild跳過這個目標,認爲它是最新的。將輸出(你的案例中的'Web.Config')添加到你的'AfterBuild'目標輸出中。 – Romeo 2013-04-10 18:25:15

+1

也許使用「BeforeBuild」?順便說一句你有web.config包含在csproj中嗎?我相信大多數發佈活動都依賴項目中的項目而不是文件夾 - 儘管沒有檢查它。如果沒有 - 您可以包含網頁。配置在項目中,而仍然從源代碼管理中排除它 – Lanorkin 2013-04-10 19:17:22

+0

@Lanorkin - 工作!非常感謝 - 請發表您的評論作爲答案。 – avs099 2013-04-11 21:36:00

回答

4

也許用 「BeforeBuild」?

BTW你有沒有包含在web.config中的csproj?我相信大多數發佈活動都依賴於項目中的項目而不是文件夾中的項目。您可以在項目中包含web.config,但仍將其從源代碼管理中排除。

+1

我使用「BeforeBuild」目標,它工作。 – avs099 2013-04-12 14:27:21

+0

@ avs099,你是否需要將web.config包含到項目或源代碼控制中? (即使它會被變換覆蓋...) – Mobigital 2017-06-01 18:27:06

+0

@Mobigital我不包括它 – avs099 2017-06-01 19:18:49