代码之家  ›  专栏  ›  技术社区  ›  Dan Fitch

具有多个环境的MsBuild和MsDeploy

  •  33
  • Dan Fitch  · 技术社区  · 14 年前

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

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


    细节

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

    Local Dev , Test Prod ,与我要映射到的环境匹配。在这个解决方案中,所有的库都有 Debug Release 像往常一样。例如,在 本地 调试 模式。然后,主应用程序具有与解决方案匹配的环境,因此我可以 Web.Dev.config 诸如此类,这似乎是使用事物的自然方式。

    如果我这样包装:

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

    我有个问题 Configuration=Local Site.vbproj


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

    我试着打电话给 Package 通过解决方案的目标(在本例中,“应用程序”是站点项目所在的解决方案文件夹。。。我简化了本文的内容,因为解决方案中实际上有多个应用程序。)

    <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个额外的配置,它就会起作用。然而,如果我想在以后与一个环境不同的项目共同开发一个共享库,那么这是一个非常糟糕的计划。而且,这些环境与库无关,只有在使用库的顶级应用程序的上下文中才有意义。味道不好。


    包裹

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


    样品

    this sample solution .

    2 回复  |  直到 14 年前
        1
  •  40
  •   Community dbr    7 年前

    第一次尝试失败,因为 包裹 解决方案文件中不存在目标。对解决方案文件使用MSBuild时,将创建临时MSBuild项目( ); 此项目文件仅包含一些目标( 建造 , 重建 ,

    解决方案:部署构建;部署目标属性

    做你想做的事的一个方法就是使用 这样的属性:

    <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>
    
    • :调用生成时必须进行部署
    • :for deployment创建包
    • :指示包文件的文件路径

    其他链接:

        2
  •  0
  •   David Gardiner    14 年前

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

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

    • 释放试验
    • 发布产品

    对于解决方案中的大多数项目,这些配置只是链接到常规的“Release”构建,但在适当的情况下,有些项目确实具有不同的“Release Test”构建配置,其中代码中可能包含“if/”endif内容。

    这也有意义,允许定制每个配置的msdeploy配置。

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