33

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

最短版本:获取此文件,并尝试更改 .msbuild 文件以创建一个包。


细节

我有一个包含大量库和 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通过解决方案调用目标(在此示例中,“应用程序”是 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 替换东西,但我不知道Package在这种情况下如何调用 msdeploy 任务,以便我可以在 TeamCity 中构建包。

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


样本

同样,我在这里完全被难住了,所以如果你想帮助实验,我已经把这个示例解决方案放在一起。

4

2 回答 2

40

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

解决方案: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>
  • DeployOnBuild=true:必须在调用 Build 时进行部署
  • DeployTarget=Package:为部署创建一个包
  • PackageLocation:表示包文件的文件路径

附加链接:

于 2010-08-24T21:06:44.980 回答
0

I've done something similar that may be useful. In a recent project, we had 'Dev', 'Test' and 'Prod' environments.

I added solution configurations for each of these.. eg.

  • Release-Dev
  • Release-Test
  • Release-Prod

For most projects in the solution, these configurations were just linked to the regular 'Release' build, but where appropriate, some projects did have distinct 'Release-Test' build configurations where there might be #if/#endif stuff in the code.

This would also make sense to allow customisation for your msdeploy config per configuration too.

Regarding the msbuild target. The target referrs to the name of a element. eg you could call msbuild with /t:BuildWebPackage for your example above.

于 2010-08-20T06:59:51.300 回答