如何合并并利用Web.debug.config
Visual Studio 2010的内置调试器?
Answers:
这是一个已知的错误。该功能现在只能在部署过程中使用。
如果您也遇到此问题,请对其进行投票,因此将尽快修复。
这实际上非常简单,并且不管您信不信,似乎这就是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
Web.config
,因此您的所有变换都必须是“幂等的”(可以重新应用于任何其他变换的结果)。如果将文件放入源代码管理中,这也将阻止您保持理智(可能应该这样做)。总体而言,这是一种“简单”的破解方式,可将复杂性/痛苦转移到下一组问题上。如果您可以在这里“更好”地解决问题,那就好,否则就不好。还可以考虑使用$(VisualStudioVersion)而不是对VS版本进行硬编码(您将忘记对其进行更改)。
我已经通过在.csproj文件的末尾,标记之前添加了一个简单的方法解决了这个问题。这类似于keitn的答案,不同之处在于它不使用构建后事件。
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
我不想更新项目中的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。
在阅读了许多类似的文章并且由于无法读取而导致文件无法覆盖或无法访问web.config的问题后,这就是我为我工作的内容:
<Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
<ItemGroup>
<OriginalWebConfig Include="$(ProjectDir)Web.config"/>
<TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
</ItemGroup>
<Exec Command=""$(DevEnvDir)tf.exe" checkout "$(ProjectDir)Web.config"" />
<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
。有任何想法吗?
我知道这很老,但是我面临着同样的问题。我们具有测试,暂存,实时配置,这些配置可替换默认Web.config中的端点,连接字符串等。
但是,我将执行以下操作:
它的步骤并不多,并且一经掌握就可以很快完成。希望这可以帮助。:)
@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>