首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MSBuild或MSDeploy执行MSBuild转换?

如何使用MSBuild或MSDeploy执行MSBuild转换?
EN

Stack Overflow用户
提问于 2012-06-25 18:58:37
回答 1查看 3.1K关注 0票数 2

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

TL;DR

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

背景

  • 我有一个WebApp (MVC3)、一个核心应用程序(CS类Lib)和两个测试类库,每个库一个。
  • 我的解决方案中有一个构建脚本,它使用MSBuild进行编译。
  • 其中一个MSBuild目标使用MSDeploy部署到IIS服务器。
  • 到目前为止,这个过程是手动的和通过CruiseControl.NET完成的。

目标

我想将Web.Config转换添加到这个过程中。我想我一开始会做一些简单的事情,比如一个名为"PEAppsEnvironmentName“的应用程序设置,我将根据当前的环境进行开发、测试或Prod。

迄今为止的理论

在我看来,当使用MSDeploy打包时,我不会转换配置文件。

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

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

代码

我的web.config文件

代码语言:javascript
复制
<appSettings>
      <add key ="PEAppsEnvironmentName" value="None"/>
      ...  
</appSettings>

我的Web.Dev.config文件

代码语言:javascript
复制
<appSettings>
    <add key ="PEAppsEnvironmentName" xdt:Transform="Replace" xdt:Locator="Match(key)" value="Development" />
</appSettings>

我的MSBuild目标

显示默认配置的属性组为"Dev"

代码语言:javascript
复制
<PropertyGroup>
    <Configuration Condition="'$(Configuration)' == ''">Dev</Configuration>
</PropertyGroup>

My MSBuild“编译”目标

代码语言:javascript
复制
   <Target Name="Compile" DependsOnTargets="Init">
        <MSBuild Projects="@(SolutionFile)" Targets="Rebuild" Properties="OutDir=%(BuildArtifacts.FullPath);DeployOnBuild=True"/>
    </Target>

My MSBuild "Package“目标

代码语言:javascript
复制
<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“部署”目标

(为PWs等擦洗)

代码语言:javascript
复制
   <Target Name='Deploy' DependsOnTargets='Package'>
        <PropertyGroup>
            <Source>%(PackageFile.FullPath)</Source>
        </PropertyGroup>
        <Exec Command ='"@(MsDeploy)" -verb:sync -source:package="$(Source)" -dest:iisApp=PEApps,computerName=$(WebServerName),username=[User],password=[Password]'/>
    </Target>
EN

回答 1

Stack Overflow用户

发布于 2012-08-09 03:30:54

这个问题有很多,我不确定我是否和你完全一样,但我会总结一下我对你要求的印象。您有一个现有的web项目,它与其他项目一起处于解决方案中。您需要能够打包web项目,以便将其发布到多个目的地。

我已经创建了一个NuGet包,它可以用于此目的。它叫包装-网页。当您将它添加到您的web项目时,它将更新打包过程。创建包时,包中将包含一些附加文件,包括所有web.config转换文件。还将在包旁边创建一个.ps1文件。您可以使用此脚本发布包。它将提示您运行哪个转换和所有的Web部署参数。您还可以保存对文件的响应,然后将它们传递给.ps1文件,以便执行非交互式发布。我在http://nuget.org/packages/PackageWeb软件包web:http://sedodream.com/2012/03/14/PackageWebUpdatedAndVideoBelow.aspx上制作了一个5分钟的视频。FYI,这还不是VS 2012,但我正在进行修复,应该在VS 2012发布时更新它。

如果您不觉得这很有用,那么您可以看到我是如何在https://github.com/sayedihashimi/package-web上实现该解决方案的,并且您应该看到您需要做的所有事情的示例。

如果您需要在包创建上转换除web.config之外的任何文件,那么您应该看看我的VS扩展名SlowCheetah。下面是一个关于如何将它集成到生成服务器中的博客。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11195573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档