具有多种环境的MsBuild和MsDeploy

Dan*_*tch 33 .net msbuild package msdeploy asp.net-mvc-2

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

最短版本:抓取此文件,并尝试更改.msbuild文件,以便创建包.


细节

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

我的解决方案有4种配置:Local,Dev,Test,和Prod,符合我要地图的环境哪个.在该解决方案中,所有库都具有通常的模式DebugRelease模式.例如,在Local解决方案模式下,所有库都以Debug模式编译.然后,主应用程序具有与解决方案匹配的环境,因此我可以拥有Web.Dev.config等等,这似乎是使用事物的自然方式.

如果我打包像这样:

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Site\Site.vbproj"
           Targets="Package"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

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


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

尝试1

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

<Target Name="BuildWebPackage">
  <MSBuild Projects="..\Publisher\Publisher.sln"
           Targets="Applications\Site:Package"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

我认为这种SolutionFolder\ProjectName:Target语法是如何做到的,因为:Clean运行...但是,这会抛出

error MSB4057: The target "Applications\Site:Package" does not exist in the project.
Run Code Online (Sandbox Code Playgroud)

尝试2

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


咦?

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

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


样品

再一次,我已经完全被困在这里,所以如果你想帮助实验,我已经把这个样本解决方案放在一起了.

Jul*_*rau 40

第一次尝试失败,因为解决方案文件中不存在目标.在解决方案文件上使用MSBuild时,会创建一个临时MSBuild项目(SamplePackage.sln.metaproj); 这个项目文件只包含一些目标(Build,Clean,Rebuild,Publish,...)

解决方案:DeployOnBuild和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>
Run Code Online (Sandbox Code Playgroud)
  • DeployOnBuild = true:必须在调用Build时进行部署
  • DeployTarget = Package:用于部署创建包
  • PackageLocation:表示包文件的文件路径

其他链接: