如何在内置的Visual Studio调试器服务器中使用Web.debug.config?


Answers:


92

这是一个已知的错误。该功能现在只能在部署过程中使用。

https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development

如果您也遇到此问题,请对其进行投票,因此将尽快修复。


16
根据记录,这不是错误,而是设计使然。这些文件用于打包/发布。但这不应阻止任何人投票赞成该项目。
易卜拉欣(Ibrahim Hashimi)说

26
对我来说,这是一个错误,否则在本地服务器上进行Debug / Release转换的目的是什么?有时设计是错误的,这并不意味着它是正确的:)
脚本之王2012年

4
当您使用Github并在同步时需要忽略web.config时,就会出现问题。但这违反了进行备份的目的-我的意思是这就是为什么我使用Github。现在将AppHarbor添加到方案中,并且您必须支持两种类型的web.config文件,因为您确实希望将apikey发布在Github上,因此在同步和发布之前必须替换配置中的值。这是一个问题。忘记在配置中替换您的值并错误地同步,您猜怎么着?您的apikey刚刚放入公共存储库中。kes,怎么了。
大卫·罗宾斯

8
到MS Connect的链接已断开
Michael Freidgeim

17
@LordofScripts:当“按设计要求”关闭错误时,有时我想说:“那么设计中就有错误!”
罗伊·廷克

34

这实际上非常简单,并且不管您信不信,似乎这就是VS设计的工作方式。

在包含web.config的项目的.csproj文件的关闭“ Project”标记之前,逐字添加以下行。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
    <MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" />
</Target>

在包含web.config文件的项目的项目属性中,将以下各行逐字放入构建后事件中。对要运行转换的每个构建配置执行此操作。

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y

1
我只建议在$(ProjectDir)和$(ProjectPath)周围加上双引号,以免在项目路径包含空格的情况下出错。
亚历山大·普罗科菲耶夫

1
最好使用<Target Name =“ BeforeBuild”>,如在stackoverflow.com/a/10506476/52277中
Michael Freidgeim 2014年

我能够使用这种方法使转换工作,但是我无法达到断点。我已将调试设置为true,但是我从未遇到断点,并且收到以下消息:“当前不会命中断点。没有为该文档加载任何符号。”。这仅在我的自定义配置中发生,并且如果我将配置设置为“调试”就可以正常工作。有任何想法吗?
mithun_daa 2014年

1
我必须在$(MSBUILDBINPATH)周围加上双引号以使其起作用,否则它将退出,并显示代码9009
sotn 2014年

6
请注意,这将替换原始Web.config,因此您的所有变换都必须是“幂等的”(可以重新应用于任何其他变换的结果)。如果将文件放入源代码管理中,这也将阻止您保持理智(可能应该这样做)。总体而言,这是一种“简单”的破解方式,可将复杂性/痛苦转移到下一组问题上。如果您可以在这里“更好”地解决问题,那就好,否则就不好。还可以考虑使用$(VisualStudioVersion)而不是对VS版本进行硬编码(您忘记对其进行更改)。
TNE

16

我已经通过在.csproj文件的末尾,标记之前添加了一个简单的方法解决了这个问题。这类似于keitn的答案,不同之处在于它不使用构建后事件。

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

3
确认,可以正常工作。但是要小心,它会修改Web.config的本地副本。因此,如果您使用的是诸如RemoveAttributes之类的XSLT转换,则一定会将其删除!与SetAttributes配合使用
Loul G.15年

这正是我想要的。简单直接。不知道为什么所有其他解决方案都必须如此复杂。
David Carrigan

有谁知道如何在<Target name =“ AfterBuild”>部分中撤消此操作?
卡梅隆腰带

1
这应该是答案。
卡梅隆腰带

2

我不想更新项目中的web.config,而只是更新到bin文件夹中的那个,所以这就是我的操作方式。

将以下内容添加到.csproj的末尾(恰好在最终关闭项目标签之前)

<Target Name="Transform">
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
  </Target>

然后添加以下发布构建步骤

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU

这意味着在构建时,将发生从调试/发布配置到输出bin目录中的WebsiteName.Config文件的转换,因此不会干扰项目中的主web.config。


2
这确实会转换bin目录中的配置,不幸的是,此配置从未使用过。加载的配置实际上是项目文件夹中的Web.Config,而不是bin目录中的Web.Config。
米克

2

在阅读了许多类似的文章并且由于无法读取而导致文件无法覆盖或无法访问web.config的问题后,这就是我为我工作的内容:

  <Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
    <ItemGroup>
      <OriginalWebConfig Include="$(ProjectDir)Web.config"/>
      <TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
    </ItemGroup>
    <Exec Command="&quot;$(DevEnvDir)tf.exe&quot; checkout &quot;$(ProjectDir)Web.config&quot;" />
    <Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
    <TransformXml Source="$(ProjectDir)TempWeb.config"
                            Transform="Web.$(Configuration).config"
                            Destination="Web.config" />
  </Target>

笔记:

这作为BeforeBuild目标运行。

我只希望它在特定配置(替代调试环境)下运行,所以这就是为什么我有条件的原因。通过Web部署时,发布目标启动了,我不需要运行该目标。

我不想记住必须签出web.config(仅在完成后才撤消它),所以我在开始转换之前先签出web.config。如果您不使用TFS,则可以删除此行。

因为VS(2010)\ msbuild不想放开Source web.config,所以我使用了一个临时文件(感谢本文提供的信息:http : //www.diaryofaninja.com/blog/2011/09/ 14 / using-custom-webconfig-transformations-in-msbuild

我尝试添加一条命令删除TempWeb.config,但VS \ msbuild不想放手。我可以忍受,因为它没有添加到TFS中。


我有这个错误The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009。有任何想法吗?
sky91

1

我知道这很老,但是我面临着同样的问题。我们具有测试,暂存,实时配置,这些配置可替换默认Web.config中的端点,连接字符串等。

但是,我将执行以下操作:

  • 右键单击所需的转换配置(例如Web.Live.config
  • 点击“预览转换”
  • 从右边复制所有内容(这是Web.config在转换后的外观)
    • CTRL + A + CTRL + C
  • 打开Web.config文件(默认一个)
  • 选择所有内容(CTRL + A)并将其粘贴到(CTRL + V)

它的步骤并不多,并且一经掌握就可以很快完成。希望这可以帮助。:)


如果我已正确理解,则这是对原始web.config文件的破坏性更改。在问题的上下文中,每次启动调试会话时都需要执行这些步骤。
Red Taz

-1

@ologesa:您的解决方案需要对原始Web.config的写权限(您必须在TFS中签出)。更好的解决方案是像keitn这样直接在bin文件夹中生成Web.config。当我们结合keitn和您的解决方案时,我们得到了这一点:

<Target Name="BeforeBuild">
    <Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" />
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>

3
会很好,但正如Mick所说;该文件未使用。如何使应用程序或IIS使用此配置文件?
HMR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.