具有多种环境的MsBuild和MsDeploy

时间:2010-08-16 22:03:06

标签: .net asp.net-mvc-2 msbuild package msdeploy

是否有很好的模式可以将解决方案配置映射到环境并使用MsDeploy进行每个环境的打包?

最短版本:Grab this file, and try to change the .msbuild file so that a package is created.


详细

我有一个包含大量库和ASP.NET MVC应用程序的解决方案。我使用msbuild文件驱动构建,该文件调用主解决方案,然后执行其他操作。我想使用新的msdeploy包来准备一个.zip文件供以后分发,但我遇到了各种各样的困难。

我的解决方案有4种配置:LocalDevTestProd,它们与我要映射到的环境相匹配。在该解决方案中,所有库都像往常​​一样具有DebugRelease模式。例如,在Local解决方案模式下,所有库都以Debug模式进行编译。然后,主应用程序具有与解决方案匹配的环境,因此我可以使用Web.Dev.config等等,这似乎是使用事物的自然方式。

如果我打包这样:

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Site\Site.vbproj"
           Targets="Package"/>
</Target>

我遇到一个问题,Configuration=Local被错误地映射到Site.vbproj引用的库项目,并且它无法编译它们。


我看到两种可能的解决方案:一种是我无法正常工作,另一种是非常难看。

尝试1

我尝试通过解决方案调用Package目标(在此示例中,“Applications”是Site项目所在的解决方案文件夹...我已经简化了这篇文章,因为有实际上解决方案中有多个应用程序。)

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Publisher.sln"
           Targets="Applications\Site:Package"/>
</Target>

我认为这个SolutionFolder\ProjectName:Target语法是如何执行此操作的,因为:Clean会运行...但是,这会抛出

error MSB4057: The target "Applications\Site:Package" does not exist in the project.

尝试2

现在对于丑陋的解决方案:如果我修改所有库,为这4种解决方案配置提供4个额外配置,它就可以工作。但是,如果我想稍后与具有不同环境的项目共同开发共享库,那么这是一个丑陋而且实际上是一个糟糕的计划。此外,这些环境与库无关,只有在使用库的顶级应用程序的上下文中才有意义。口味不好。


咦?

我喜欢在解决方案中使用多个环境,以及花哨的新Web.config替换内容,但我不知道在这种情况下如何调用msdeploy Package任务,因此我可以构建包TeamCity的。

(请注意,我可能不想调用msdeploy命令行,因为它用于将IIS应用程序转换为包。不是我在这里做的。)


样品

同样,我已经完全被困在这里了,所以如果你想帮助实验,我会把this sample solution放在一起。

2 个答案:

答案 0 :(得分:40)

第一次尝试失败,因为解决方案文件中不存在 Package 目标。在解决方案文件上使用MSBuild时,会创建一个临时MSBuild项目( SamplePackage.sln.metaproj );此项目文件仅包含一些目标(构建清除重建 发布 ,...)

解决方案:DeployOnBuild&amp; DeployTarget属性

执行所需操作的一种方法是使用 DeployOnBuild 属性,如下所示:

<PropertyGroup Condition="'$(Configuration)' == ''">
  <Platform>Any Cpu</Platform>
  <Configuration>Dev</Configuration>
  <PackageLocation>$(MSBuildProjectDirectory)\package.zip</PackageLocation>
</PropertyGroup>

<Target Name="Build">
  <MSBuild Projects="SamplePackage.sln"
           Targets="Build"/>
</Target>

<Target Name="BuildWebPackage">
  <MSBuild Projects="SamplePackage.sln"
           Properties="Platform=$(Platform);
                       Configuration=$(Configuration);
                       DeployOnBuild=true;
                       DeployTarget=Package;
                       PackageLocation=$(PackageLocation);"/>
</Target>
  • DeployOnBuild = true :调用Build时必须进行部署
  • DeployTarget = Package :用于部署创建包
  • PackageLocation :表示包文件的文件路径

其他链接:

答案 1 :(得分:0)

我做过类似可能有用的事情。在最近的一个项目中,我们有'Dev','Test'和'Prod'环境。

我为每一个添加了解决方案配置......例如。

  • 推出-DEV
  • 发布 - 测试
  • 推出-PROD

对于解决方案中的大多数项目,这些配置只是链接到常规的“发布”版本,但在适当的情况下,某些项目确实具有不同的“发布 - 测试”构建配置,其中可能存在#if / #endif内容代码。

这也适用于每个配置允许自定义msdeploy配置。

关于msbuild目标。目标引用元素的名称。例如,您可以使用/ t:BuildWebPackage为上面的示例调用msbuild。