是否有很好的模式可以将解决方案配置映射到环境并使用MsDeploy进行每个环境的打包?
最短版本:Grab this file, and try to change the .msbuild file so that a package is created.
我有一个包含大量库和ASP.NET MVC应用程序的解决方案。我使用msbuild文件驱动构建,该文件调用主解决方案,然后执行其他操作。我想使用新的msdeploy包来准备一个.zip文件供以后分发,但我遇到了各种各样的困难。
我的解决方案有4种配置:Local
,Dev
,Test
和Prod
,它们与我要映射到的环境相匹配。在该解决方案中,所有库都像往常一样具有Debug
和Release
模式。例如,在Local
解决方案模式下,所有库都以Debug
模式进行编译。然后,主应用程序具有与解决方案匹配的环境,因此我可以使用Web.Dev.config
等等,这似乎是使用事物的自然方式。
如果我打包这样:
<Target Name="BuildWebPackage">
<MSBuild Projects="..\Publisher\Site\Site.vbproj"
Targets="Package"/>
</Target>
我遇到一个问题,Configuration=Local
被错误地映射到Site.vbproj
引用的库项目,并且它无法编译它们。
我看到两种可能的解决方案:一种是我无法正常工作,另一种是非常难看。
我尝试通过解决方案调用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.
现在对于丑陋的解决方案:如果我修改所有库,为这4种解决方案配置提供4个额外配置,它就可以工作。但是,如果我想稍后与具有不同环境的项目共同开发共享库,那么这是一个丑陋而且实际上是一个糟糕的计划。此外,这些环境与库无关,只有在使用库的顶级应用程序的上下文中才有意义。口味不好。
我喜欢在解决方案中使用多个环境,以及花哨的新Web.config替换内容,但我不知道在这种情况下如何调用msdeploy Package
任务,因此我可以构建包TeamCity的。
(请注意,我可能不想调用msdeploy命令行,因为它用于将IIS应用程序转换为包。不是我在这里做的。)
同样,我已经完全被困在这里了,所以如果你想帮助实验,我会把this sample solution放在一起。
答案 0 :(得分:40)
第一次尝试失败,因为解决方案文件中不存在 Package 目标。在解决方案文件上使用MSBuild时,会创建一个临时MSBuild项目( SamplePackage.sln.metaproj );此项目文件仅包含一些目标(构建,清除,重建, 发布 ,...)
执行所需操作的一种方法是使用 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>
其他链接:
答案 1 :(得分:0)
我做过类似可能有用的事情。在最近的一个项目中,我们有'Dev','Test'和'Prod'环境。
我为每一个添加了解决方案配置......例如。
对于解决方案中的大多数项目,这些配置只是链接到常规的“发布”版本,但在适当的情况下,某些项目确实具有不同的“发布 - 测试”构建配置,其中可能存在#if / #endif内容代码。
这也适用于每个配置允许自定义msdeploy配置。
关于msbuild目标。目标引用元素的名称。例如,您可以使用/ t:BuildWebPackage为上面的示例调用msbuild。