我有以下設置: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.Config,Web.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命令行來強制進行配置轉換?
謝謝。
你'AfterBuild'目標沒有任何產出。似乎MSBuild跳過這個目標,認爲它是最新的。將輸出(你的案例中的'Web.Config')添加到你的'AfterBuild'目標輸出中。 – Romeo 2013-04-10 18:25:15
也許使用「BeforeBuild」?順便說一句你有web.config包含在csproj中嗎?我相信大多數發佈活動都依賴項目中的項目而不是文件夾 - 儘管沒有檢查它。如果沒有 - 您可以包含網頁。配置在項目中,而仍然從源代碼管理中排除它 – Lanorkin 2013-04-10 19:17:22
@Lanorkin - 工作!非常感謝 - 請發表您的評論作爲答案。 – avs099 2013-04-11 21:36:00