38

我想让 web.config 转换在本地工作,但显然只有在部署时才会发生转换。

有没有人知道在不经过“重建”过程的情况下运行 msbuild 目标“TransformWebConfig”的方法,并且还指定和输出目录来吐出转换后的 web.config?

编辑:使用赛义德的回答,我创建了一个.bat文件来为我运行任务:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Msbuild.exe "D:\Demo\Transformation.proj" /t:TransformWebConfig 

copy /Y  "D:\Demo\Web.config" "D:\MyProject\Web.config" 

del ""D:\Demo\Web.config"

“Transformation.proj”是下面答案中 Sayed 代码片段的副本。只需指定转换的源、目标和目的地。新文件,在这种情况下,转换后的“web.config”将位于“D:\Demo”目录中。我只是将它复制过来以覆盖我项目的 web.config,最后删除“demo”文件夹中生成的文件。

另外,我创建了一个宏来运行这个批处理文件并为我执行转换:

Public Module DoTransform
    Sub RunTransformBatchFile()
        Try
          Process.Start("D:\Demo\RunTransform.bat")
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Module

您还可以在工具栏上添加一个按钮来运行此批处理和/或分配一个快捷键来执行。

4

2 回答 2

39

如果您想在不使用 Web 发布管道的情况下转换配置文件,那么您只需手动使用 TransformXml 任务。我已经在http://sedodream.com/2010/04/26/ConfigTransformationsOutsideOfWebAppBuilds.aspx上写了一篇详细的博客文章,但这里是重点:

<Project ToolsVersion="4.0" DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="TransformXml"
             AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>

    <Target Name="Demo">
        <TransformXml Source="app.config"
                      Transform="Transform.xml"
                      Destination="app.prod.config"/>
    </Target>
</Project>

在这里,我使用 transform.xml 文件手动转换 app.config 文件,目标文件是 app.prod.config。

您提到的一件事是在运行应用程序时能够在本地进行转换。我们只对 package/publish 执行转换的原因是,如果我们转换了 web.config 本身,那么下次调试应用程序时,web.config 会再次转换。因此,例如,如果在您的 web.debug.config 中,您具有向配置添加值的转换,那么第一次添加时一切正常,但下次运行/调试应用程序时,它将再次添加。所以最好避免这种情况。

于 2010-09-01T03:38:49.583 回答
8

如果您使用的是 Visual Studio 2015,您只需右键单击所需环境的转换,然后单击“查看预览”...它将生成转换,您可以将其复制并粘贴到普通的 Web.config用于调试目的的文件。只是不要犯!

如果您使用的是 Visual Studio 2013,则可以安装 SlowCheetah - XML Transforms 扩展

于 2016-10-10T22:46:02.640 回答