【问题标题】:Can MS Deploy do a package and transform, but not deploy?MS Deploy 可以打包和转换,但不能部署吗?
【发布时间】:2011-04-06 22:17:39
【问题描述】:

在 .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”执行“包”,以便 zip 文件中包含最终的 web.config?

【问题讨论】:

    标签: msbuild web-config msdeploy


    【解决方案1】:

    如果您想避免这种情况发生,那么您需要在构建中设置一个属性。您可以通过两种方式做到这一点

    1. 编辑您的项目文件
    2. 创建一个 .wpp.targets 文件

    我会推荐#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 Publishing Pipeline 不要在 web.config 中为连接字符串插入那些 {} 占位符。

    【讨论】:

    • 处理占位符但没有解释如何在打包时应用转换。
    【解决方案2】:

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

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

    在你自己的目标中

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

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

    所以

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

    对我们有用。

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

    或者(我们已将其用于需要成为所有人的一切的包),您可以使用该技巧进行所有转换并将它们中的每一个都包含在最终包中。

    然后您手动调用 Msdeploy 并使用它的跳过和替换指令(忘记技术术语)仅在部署时输出正确的指令

    假设你的包中有一个 web.usethisone.config,看起来像

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

    【讨论】:

    • 谢谢,它就像一个魅力,节省了我很多时间。我确实花了很多时间为各种部署环境转换多个 Web.config 文件。
    • 我正在努力解决同样的问题。我将 添加到我的 Web 应用程序的 .csproj 文件中,但我不太明白应该将 部分放在哪里。如何在我的 .csproj 文件中找出哪个是“正确的 ItemGroup(最有可能是“内容”)以及如何“确保在调用 Package 之前触发目标”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多