MS Deploy可以执行包和转换,但不能部署吗?

时间:2010-09-01 16:53:47

标签: msbuild web-config msdeploy

在.NET 4.0中使用msbuild,我可以使用“Package”目标构建web项目,并且可以将包放在zip文件中。但是,当我在那里查看web.config时,它没有被转换,它有“$(ReplacableToken_Web_SiteConnection-Web.config Connection String_0)”

我可以运行“TransformWebConfig”目标,它将进行正确的转换,但只是在自己的孤岛中。

我还可以运行“Build”目标并传递“DeployOnBuild = True; DeployTarget = MSDeployPublish”属性,它将在我的服务器上部署包,并完成正确的web.config转换。

但是,如果我想手动将软件包部署到服务器,如何使用“TransformWebConfig”执行“Package”,以便zip文件中包含最终的web.config?

2 个答案:

答案 0 :(得分:12)

如果您想跳过这种情况,则需要在构建中设置属性。你可以用两种方式做到这一点

  1. 编辑项目文件
  2. 创建.wpp.targets文件
  3. 我会推荐#2。对于这种情况,请在与项目文件相同的目录中创建一个名为{ProjectName} .wpp.targets的新文件,其中{ProjectName}是项目的名称。然后在这个文件里面放置以下内容。

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
             ToolsVersion="4.0">
      <PropertyGroup>
        <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>
      </PropertyGroup>
    </Project>
    

    在这种情况下,您要设置属性AutoParameterizationWebConfigConnectionStrings,告知Web发布管道不要在web.config中为连接字符串插入这些{}占位符。

答案 1 :(得分:10)

我们这样做的方法是修改项目构建以在打包之前进行转换。

目标是调用TransformXml并且是Microsoft.Web.Publishing.Tasks.dll的一部分

在你自己的目标中

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"  /> 

但它将包含在默认的VS C#build中。

所以

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" />

我们的诀窍。

使用正确的ItemGroup(最有可能是“内容”)设置这些路径,并确保在.csproj中调用Package之前触发目标,并且构建输出将包含“Web.config”,就像正常一样,使用正确的转换值。

或者(我们已经将它用于需要每个人的所有内容的软件包),您可以使用该技巧完成所有转换并将其中的每一个包含在最终包中。

然后手动调用Msdeploy并使用其skip和replace指令(忘记技术术语)仅在部署时输出正确的指令

假设您的包中有web.usethisone.config,看起来像

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config