如何在转换时将configSource转换为web.config中的内联元素

Mar*_*ten 2 msbuild web-config msdeploy web-config-transform config-transformation

目前我的web.config看起来像这样:

<configuration>
  <connectionStrings configSource="connectionstrings.config"/>
</configuration>
Run Code Online (Sandbox Code Playgroud)

在生成部署包(Msbuild.exe + target = Package)时,它不会"神奇地"将我的连接字符串参数化到parameters.xml文件以进行部署时的替换.

当我内联我的连接线时,一切都很好,并为我的连接线生成参数..

所以:

如何通过web.config转换复制connectionstrings.config的内容作为部署<... configsource ="xxx"/>的替换?

编辑: 我接受了Sayed Ibrahim的答案,因为'默认'行为非常好(web.config中连接字符串的自动参数化)但最后更好地指定需要参数化的确切内容(通过{projectname} .wpp.targetsparameters.xml文件).

Say*_*imi 6

你有点问错误的问题,不要担心如何转换回web.config.而只是为文件中的连接字符串创建参数.我刚刚在http://sedodream.com/2012/05/13/VSWebPublishHowToParameterizeConnectionStringsOutsideOfWebconfig.aspx上发布了此博文.我也贴了下面的内容给你.

如果您已在VS 2010或VS 11中使用Visual Studio Web发布来创建Web Deploy包,那么您可能知道我们会自动参数化web.config中的连接字符串.如果您不熟悉Web Deploy参数,它们是一种声明您希望在以后发布包时能够轻松更新某些值的方法.连接字符串是通常需要在发布期间更新的内容的良好示例.

正如我之前所说,如果您在Visual Studio中创建Web Deploy包,我们将自动为web.config中的所有连接字符串创建Web Deploy参数.今天早些时候我在StackOverflow上看到一个问题,询问如何在非web.config文件中参数化连接字符串(问题实际上是问别的,但我认为这是他真正想要的).我创建了一个示例,展示了如何执行此操作.下面是web.config中connectionStrings元素的样子.

<connectionStrings configSource="connectionStrings.config" />
Run Code Online (Sandbox Code Playgroud)

这是connectionStrings.config

<connectionStrings>
  <clear/>
  <add name="ApplicationServices"
       connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
       providerName="System.Data.SqlClient" />
  <add name="OtherConnectionString"
       connectionString="data source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=foo"
       providerName="System.Data.SqlClient"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

为了参数化这些连接字符串,您必须扩展Web Publish Pipeline.为此,在您正在使用的项目的根目录中创建名为{project-name} .wpp.targets的文件(对于VS 11项目,您可以将所有这些直接放在.pubxml文件中).这将是一个MSBuild文件,它将被导入到构建/发布过程中.下面是需要创建的文件.

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

  <ItemGroup>
    <!-- Here we need to declare MSDeploy parameters for connection strings in connectionStrings.config -->
    <MsDeployDeclareParameters Include="ApplicationServices-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='ApplicationServices']/@connectionString</Match>
      <Description>Connection string for ApplicationServices</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=AppServices</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>

    <MsDeployDeclareParameters Include="OtherConnectionString-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='OtherConnectionString']/@connectionString</Match>
      <Description>Connection string for OtherConnectionString</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=OtherDb</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到我正在为MSDeployDeclareParameters创建值.打包/发布此项目列表用于创建MSDeploy参数.以下是每个包含的元数据值的说明.

  • Kind =对于这种情况,它将永远是Xmlfile,了解更多
  • Scope =需要修改的文件的正则表达式
  • Match =要更新的属性/元素的XPath表达式
  • 说明=可选说明(如果导入了pkg,这将显示在IIS管理器中)
  • DefaultValue =参数的可选默认值Tags = optional,连接字符串使用SqlConnectionString

创建此文件后,您需要关闭/重新打开VS(它会缓存导入的.targets文件).然后,您可以创建Web部署包.执行此操作时,将声明这些新参数.在我的情况下,我然后在IIS管理器中导入它,这是显示参数的对话框. 在此输入图像描述

如您所见,此处显示了Application Path参数以及我的自定义连接字符串值.当我更新文本框中的值并在我的Web服务器上打开connectionStrings.config时,它们是我在对话框中输入的值.

仅供参考我已将此样本上传到我在ParameterizeConStringConfig的 github帐户.