【问题标题】:web.config transform from web.template.xml not working从 web.template.xml 转换的 web.config 不起作用
【发布时间】:2012-08-01 16:43:58
【问题描述】:

我正在尝试让 web.config 转换按照here 的描述工作。我们已经在其他项目上使用过这种方法,它可以正常工作,但在这个新项目上却没有。

这是我尝试过的测试但没有成功

  • 更改 wpp.targets 文件的名称以防我弄错了项目名称。我知道我正在使用的当前一个工作,因为它是唯一一个导致 web.config 从 web.template.xml 重建这个转换工作。只有子模板不起作用。
  • 尝试使用 xdt:Locator="Match(name)"
  • 尝试过 .config 扩展名与 .xml,我们其他适用的项目使用 .xml
  • 配置管理器设置为对我正在处理的项目使用“测试”配置。
  • web.template.Test.xml 有我要替换的部分的 xdt:Transform="Replace"
  • web.template.xml 有占位符
  • 尝试按照下面链接的堆栈问题中的建议从 wpp.targets 中删除“CopyWebTemplateConfig”部分。我们的其他项目有这个,并且“PropertyGroup”部分被注释掉了,我已经尝试了这两种组合。

我已多次阅读上述链接和相关堆栈question,但看不出问题出在哪里。

注意 发布转换确实以某种方式工作。它会创建一个 web.template.xml 文件,其中包含来自 web.template.Test.xml 的值,但不会按照 wpp.targets 的指示创建 web.config.xml。所以这似乎更像是一个让构建转换工作的问题。

有人知道缺少什么吗?

wpp.targets

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Make sure web.config will be there even for package/publish -->
  <Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
    <Copy SourceFiles="web.template.xml"
          DestinationFiles="web.config"/>
  </Target>

  <PropertyGroup>
    <PrepareForRunDependsOn>
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    </PrepareForRunDependsOn>
  </PropertyGroup>

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun">
    <Message Text="Configuration: $(Configuration): Web.template.$(Configuration).xml"/>
    <TransformXml Source="web.template.xml"
              Transform="web.template.$(Configuration).xml"
              Destination="web.config" />
  </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.xml;web.template.*.xml"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

web.template.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>           
    <sectionGroup name="TestSettings"></sectionGroup>
    ....
  </configSections>
    ....
  <TestSettings>
  </TestSettings>
   ....
</configuration>

web.template.Test.xml

<?xml version="1.0"?>
<!-- For more information on using transformations 
     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <TestSettings xdt:Transform="Replace">
    ...
  </TestSettings>
</configuration>

MSBuild 输出

Target "UpdateWebConfigBeforeRun: (TargetId:143)" in file "C:\...\Project.wpp.targets" from project "C:\...\Project.csproj" (target "PrepareForRun" depends on it):
Task "Message" (TaskId:93)
  Configuration: Test: Web.template.Test.xml (TaskId:93)
Done executing task "Message". (TaskId:93)
Task "TransformXml" (TaskId:94)
  Transforming Source File: Web.template.xml (TaskId:94)
    Applying Transform File: Web.template.Test.xml (TaskId:94)
    Executing Replace (transform line 5, 18) (TaskId:94)
      on /configuration/TestSettings (TaskId:94)
      Applying to 'TestSettings' element (source line 121, 4) (TaskId:94)
      Replaced 'TestSettings' element (TaskId:94)
    Done executing Replace (TaskId:94)
    Output File: web.config (TaskId:94)
  Transformation succeeded (TaskId:94)
Done executing task "TransformXml". (TaskId:94)
Done building target "UpdateWebConfigBeforeRun" in project "Project.csproj".: (TargetId:143)

【问题讨论】:

  • 你能给我一个不工作的示例项目吗?我的电子邮件是 sayedha[at]{MicrosoftDOTcom}。

标签: c# asp.net-mvc visual-studio-2010 visual-studio web-config


【解决方案1】:

我已经安装了StyleCop,它正在为我做覆盖。

所以我卸载了它,问题就解决了。

有趣的是,我重新安装了 StyleCop 并且转换仍在工作!

在某些时候我注意到我也应该删除 CopyWebTemplateConfig 目标部分。

【讨论】:

  • 听起来和我描述的场景非常相似,只需将 StyleCop 替换为 SlowCheetah 即可。
  • 是的。好消息是他们正在考虑在 F5 到 SlowCheetah 上支持 web。 github.com/sayedihashimi/slow-cheetah/issues/39请大家投票!
【解决方案2】:

我已经找到了解决问题的方法,但不确定原因是什么,所以不确定这是否会在其他情况下解决。

我查看了 MSBuild 诊断的输出,并注意到最后有另一个部分将 web.template 复制到了 web.config。请注意,这是在 UpdateWebConfigBeforeRun 目标已经运行并将其从子模板转换文件更新到 web.config 之后。看起来最后一步是用我想要的转换覆盖 web.config。

我不确定最后一组复制指令的来源,因此我搜索了我 PC 上的所有文件,以寻找其他 wpp.target 文件。我在 Slow Cheetah 的扩展文件夹中找到了另一个,并看到顶部的某些部分将属性“transformOnBuild”设置为 false。

认为与 SlowCheetah 存在冲突,我将其卸载,并且转换开始按预期工作。这仍然有点奇怪,因为其他解决方案在启用 SlowCheetah 的情况下工作。一时兴起,我重新安装了 SlowCheetah,并且转换继续按预期工作。

所以我的解决方案最终是重新安装 SlowCheetah。我仍然对这个问题的原因感到困惑,所以如果其他人对此发表了答案,我会给他们赏金。

【讨论】:

    【解决方案3】:

    上周我遇到了类似的问题。 事实证明,每当您将项目添加到 VS 2010 中的解决方案时,都不会始终应用正确的项目配置。 因此,您认为您有一个配置处于活动状态,但另一个配置实际上在该项目上处于活动状态,因此您期望的转换不会得到应用。

    查看本期最后评论中的步骤:Custom solution configuration not showing up in Visual Studio 2010

    【讨论】:

    • 一个新项目没有添加到解决方案中。当我说转换适用于其他项目时,我指的是我们已经构建的其他解决方案或其他系统。我尝试了该答案中概述的步骤,但没有解决问题。
    【解决方案4】:

    “我知道我正在使用的当前一个有效,因为它是唯一一个导致从 web.template.xml 重建 web.config 这个转换有效。只有子模板不起作用。”

    这是否意味着,转换工作,但单独的 TestSettings 部分没有得到转换?

    您能否将详细程度设置为诊断/详细的 msbuild 共享构建输出?

    【讨论】:

    • 没错,转换工作,但 TestSettings 部分没有从子模板转换。如何在构建中启用详细程度?
    • 好的,找到了如何启用详细诊断,但我认为我不能公开分享输出。有没有我应该特别看的部分?在 VS 2010 中,选项 => 项目和解决方案 => 构建和运行 => MSBuild 项目构建输出详细程度的下拉菜单。
    • 我确实在该输出中发现 web.template.xml 属性显示“TransformOnBuild”设置为 true,但所有其他文件都将其显示为 false。
    • 我在问题中添加了相关的 MSBuild 输出。看起来它按照指示执行了步骤,但结果却不如预期。我将此与转换工作的其他解决方案生成的输出进行了比较,这部分是相同的。
    【解决方案5】:

    我写了一篇关于这个主题的博客文章。我每天都在我们的 Web 应用程序中使用它。我写这篇博文是因为 slowcheetah 中的功能还没有准备好。 http://www.locktar.nl/general/use-config-transforms-when-debugging-your-web-application/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2019-04-24
      • 2016-05-26
      相关资源
      最近更新 更多