Asp.net mvc 如何使用MSBuild或MSDeploy执行web.config转换?

Asp.net mvc 如何使用MSBuild或MSDeploy执行web.config转换?,asp.net-mvc,asp.net-mvc-3,msbuild,web-config,msdeploy,Asp.net Mvc,Asp.net Mvc 3,Msbuild,Web Config,Msdeploy,我已经尝试了许多不同的配置,但我没有达到我的效果 TL;博士 我正在尝试将配置转换添加到构建过程中,并正在寻找从MSBuild执行配置转换的正确方法,以便它通过MSDeploy显示在我的部署中 背景 我有一个WebApp(MVC3)、一个核心app(CS类Lib)和两个测试类Lib,每个Lib对应一个 我的解决方案中有一个使用MSBuild编译的构建脚本 其中一个MSBuild目标使用MSDeploy部署到IIS服务器 到目前为止,该过程正在手动和通过CruiseControl.NET运行

我已经尝试了许多不同的配置,但我没有达到我的效果

TL;博士 我正在尝试将配置转换添加到构建过程中,并正在寻找从MSBuild执行配置转换的正确方法,以便它通过MSDeploy显示在我的部署中

背景
  • 我有一个WebApp(MVC3)、一个核心app(CS类Lib)和两个测试类Lib,每个Lib对应一个
  • 我的解决方案中有一个使用MSBuild编译的构建脚本
  • 其中一个MSBuild目标使用MSDeploy部署到IIS服务器
  • 到目前为止,该过程正在手动和通过CruiseControl.NET运行
目标 我想将Web.Config转换添加到此过程中。我想我首先会做一些简单的事情,比如一个名为“PEAppsEnvironmentName”的应用程序设置,我会基于当前环境进行开发、测试或产品开发

迄今为止的理论 在我看来,使用MSDeploy打包时,我并没有转换配置文件

当我在DeployOnBuild选项设置为true的情况下运行MSBuild时,它会创建另一个具有适当转换的配置的包。我只是觉得不知怎么的,我无法让这一切匹配起来。最终结果是网页显示“None”(初始设置),而不是转换后的“Development”字符串

我想如果我能在打包阶段找到如何使用MSDeploy来转换MSConfig,我会很乐意去做

代码 我的web.config文件

...  
我的Web.Dev.config文件

我的MSBuild目标 显示默认配置的属性组为“Dev”


发展
我的MSBuild“编译”目标

   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>
<Target Name="Package" DependsOnTargets="Compile;Test">
    <PropertyGroup>
        <PackageDir>%(PackageFile.RootDir)%(PackageFile.Directory)</PackageDir>
        <Source>%(WebSite.FullPath)</Source>
        <Destination>%(PackageFile.FullPath)</Destination>
    </PropertyGroup>
    <MakeDir Directories="$(PackageDir)"/>
    <Exec Command='"@(MSDeploy)" -verb:sync -source:iisApp="$(Source)" -dest:package="$(Destination)" '/>
</Target>

我的MSBuild“包”目标

   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>
<Target Name="Package" DependsOnTargets="Compile;Test">
    <PropertyGroup>
        <PackageDir>%(PackageFile.RootDir)%(PackageFile.Directory)</PackageDir>
        <Source>%(WebSite.FullPath)</Source>
        <Destination>%(PackageFile.FullPath)</Destination>
    </PropertyGroup>
    <MakeDir Directories="$(PackageDir)"/>
    <Exec Command='"@(MSDeploy)" -verb:sync -source:iisApp="$(Source)" -dest:package="$(Destination)" '/>
</Target>

%(PackageFile.RootDir)%(PackageFile.Directory)
%(网址:FullPath)
%(PackageFile.FullPath)
我的MSBuild“部署”目标

   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>
<Target Name="Package" DependsOnTargets="Compile;Test">
    <PropertyGroup>
        <PackageDir>%(PackageFile.RootDir)%(PackageFile.Directory)</PackageDir>
        <Source>%(WebSite.FullPath)</Source>
        <Destination>%(PackageFile.FullPath)</Destination>
    </PropertyGroup>
    <MakeDir Directories="$(PackageDir)"/>
    <Exec Command='"@(MSDeploy)" -verb:sync -source:iisApp="$(Source)" -dest:package="$(Destination)" '/>
</Target>
(清洗PWs等)


%(PackageFile.FullPath)

这个问题有很多问题,我不确定我是否和你完全站在同一页上,但我将总结一下我对你所问问题的印象。您有一个现有的web项目,该项目与其他项目位于解决方案中。您需要能够打包web项目,以便可以将其发布到多个目标

我已经创建了一个NuGet包,可以用于这个确切的目的。它叫。当您将其添加到web项目时,它将更新打包过程。创建包时,包中将包含一些附加文件,包括所有web.config转换文件。包旁边也将创建一个.ps1文件。您可以使用此脚本发布包。它将提示您运行哪个转换以及所有Web部署参数。您还可以将响应保存到文件,然后将其传递到.ps1文件,以便执行非交互式发布。我在网站上制作了一个5分钟的视频 包web:。仅供参考,这还不适用于VS 2012,但我正在进行修复,应该在VS 2012发布时进行更新

如果您不觉得这很有用,您可以查看我是如何在上实现该解决方案的,并且您应该可以看到为实现自己的解决方案而需要执行的所有操作的示例


仅供参考,如果您需要在创建包时转换除web.config以外的任何文件,那么您应该查看我的VS扩展名。这里是一个关于如何将其集成到一个。

可能重复的@KyleTrauberman的博客,我查看了该线程,并考虑到该解决方案不是我想要的(我认为现在不是最佳实践)。我没有试图编辑项目文件,也没有试图创建仅用于转换web.config的MSBuild任务(除非这是唯一的方法)。我想这是不同的,因为我在问如何使用MSBuild或MSDeploy实现这一点。您使用的是哪种构建配置?@frennky我创建的一个名为“Dev”的配置。我在MSBuild配置中将其作为默认值列出(即,如果命令行中未指定任何内容,请使用它)。在我的编译任务中使用DeployOnBuild=True时,它确实会弹出一个包含正确修改的Web.config的目录。@KyleTrauberman道歉;答案似乎是相似的,尽管我认为这个问题的独特之处在于它假设一定有比这个问题更好的方法。我将编辑我的问题/答案以反映这一点。