【问题标题】:TFS variables for connection string连接字符串的 TFS 变量
【发布时间】:2017-09-03 10:12:56
【问题描述】:

我在 tfs 项目中持续集成。我想在发布时将连接字符串替换为我的生产数据库,但网络上的所有信息都令人困惑。我用这个创建了parameters.xml

<?xml version="1.0" encoding="utf-8" ?>
<parameters>
  <parameter name="connectionString" description="connectionString" defaultvalue="(localdb)\MSSQLLocalDB;InitialCatalog=BlogsPostsLocalDb;Integrated Security=true;" tags="">
    <parameterentry kind="XmlFile" scope="\\web.config$" match="What to write here?" />
  </parameter>
</parameters>

在 TFS 中,在我的App Deploy 任务中我可以看到SetParameters File 选项,所以我怀疑我必须使用它,但我不明白如何告诉它Web.config 中的哪个参数属于该参数在parameters.xml

在我的Web.config 中,我需要将静态路径替换为parameters.xml 中的路径。我的Web.config

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(localdb)\MSSQLLocalDB;InitialCatalog=BlogsPostsLocalDb;Integrated Security=true;" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

编辑:

我使用一个工具创建了parameters.xml,现在看起来像这样:

<parameters>
    <parameter name="ConnectionString" description="Description for ConnectionString" defaultvalue="__CONNECTIONSTRING__" tags="">
    <parameterentry kind="XmlFile" scope="\\web.config$" match="/configuration/appSettings/add[@key='ConnectionString']/@value" />
    </parameter>
</parameters>

我的web.config

  <appSettings>
    <add key="ConnectionString" value="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=BlogsPostsTestDb;Integrated Security=True" />
  </appSettings>

在我的上下文中,我这样做:

public BlogsPostsContext() : base(WebConfigurationManager.AppSettings["ConnectionString"]) { }

在 TFS 中我为 relase 设置变量

Name             | Value
ConnectionString | Data Source=WIN-7ADV5BGRBE3\SQLEXPRESS;Initial Catalog=BlogsPostsDb;Integrated Security=True

不幸的是,当我发布并查看服务器上的web.config 时,我只能看到&lt;add key="ConnectionString" value="__CONNECTIONSTRING__" /&gt; 还有parameters.xml

<parameters> 
    <parameter name="ConnectionString" description="Description for ConnectionString" defaultvalue="__CONNECTIONSTRING__" tags="">
    <parameterentry kind="XmlFile" scope="\\web.config$" match="/configuration/appSettings/add[@key='ConnectionString']/@value" />
    </parameter>
</parameters>

MsBuild 参数:

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"

【问题讨论】:

  • 您使用哪个任务将连接字符串替换为变量?你能分享一下那个任务的设置截图吗?
  • @MSFT 我更新了我的问题。
  • 能否展开“文件转换和变量替换选项”设置,然后分享截图?
  • @Eddie-MSFT 我更新了截图。
  • 所以您使用“XML 变量替换”选项来替换连接字符串?您使用的 IIS Web 应用程序部署任务是预览版,非常旧,我再也找不到了。你可以分享扩展程序,以便我可以在我身边检查它吗?顺便说一句,该扩展已被弃用并替换为:marketplace.visualstudio.com/…,如果可能,我建议您尝试使用新的扩展。

标签: asp.net entity-framework tfs connection-string web-deployment


【解决方案1】:

在您构建 Web 应用程序项目时会生成一个 [project name].SetParameters.xml 文件。

这为MSDeploy.exe 命令提供了一组参数值。 您可以更新此文件中的值并将其作为 部署 web 包时的命令行参数。

因为SetParameters.xml 文件是从您的Web 应用程序项目文件和项目中的任何配置文件动态生成的。

您还可以通过将parameters.xml 文件添加到您的项目来参数化其他设置。下面的条目使用 XML 路径语言 (XPath) 查询来定位和参数化 web.config 文件中 ContactService Windows Communication Foundation (WCF) 服务的端点 URL。

<parameters>
  <parameter name="ContactService Service Endpoint Address"
             description="Specify the endpoint URL for the ContactService WCF 
                          service in the destination environment"
             defaultValue="http://localhost/ContactManagerService">
    <parameterEntry kind="XmlFile" scope="Web.config"
                    match="/configuration/system.serviceModel/client
                           /endpoint[@name='BasicHttpBinding_IContactService']
                           /@address" />
  </parameter>
</parameters>

WPP 还将相应的条目添加到与部署包一起生成的 SetParameters.xml 文件中。

<parameters>
  ...  
  <setParameter 
    name="ContactService Service Endpoint Address" 
    value="http://localhost/ContactManagerService" />
  ...
</parameters>

关于如何告诉它Web.config中的哪个参数属于parameters.xml中的参数,你需要使用match entry来做到这一点。更多详细信息请参考本教程:Configuring Parameters for Web Package Deployment

【讨论】:

  • 我使用了一个程序来生成文件。问题是将变量从 tfs 链接到我的配置不起作用。我更新了我的问题。
【解决方案2】:

我有一个类似的问题,我在 Visual Studio 中使用 ASP.Net 和 IIS 应用程序我创建了一个配置,例如测试任何 cpu 然后我发布一个名为 test.pubxml 的 IIS 文件(右键单击项目单击发布),该文件将包含来自您的 web.config 文件的连接字符串,然后右键单击您创建的文件 (test.pubxml) 并选择 add web-transform file 添加您想要的以下内容转换连接字符串。

<connectionStrings>
    <add name="test" connectionString="Data Source=(localdb)\MSSQLLocalDB;InitialCatalog=BlogsPostsLocalDb;Integrated Security=true;" xdt:Transform="SetAttributes(connectionString)" xdt:Locator="Match(name)" />
  </connectionStrings> 

现在您有了一个文件,该文件将执行与 parameters.xml 文件完全相同的操作。

在您的构建定义中,将以下内容添加到 ms 参数中

/p:DeployOnBuild=true;PublishProfile=test.pubxml;Configuration=Test;

这将构建一个 .zip 包,

在您的发布定义中

在您的部署步骤中,将以下内容添加到您的 Web 部署参数文件输入中

路径/路径/test.SetParameters.xml

这将使用转换后的连接字符串部署网站。

我知道很多,但你可以关注这个博客,它真的很有帮助Colin

【讨论】:

    【解决方案3】:

    以下关于parameters.xml 的文章误导了我。事实证明,我要做的就是按照Web.Release.Config 中的说明进行操作。

    这是我在Web.config里面添加的:

      <connectionStrings>
        <add name="BlogsPostsDb"
             providerName="System.Data.SqlClient"
             connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=BlogsPostsTestDb;Integrated Security=True"/>
      </connectionStrings>
    

    这就是我在Web.Release.Config 中添加的内容:

      <connectionStrings>
        <add name="BlogsPostsDb" 
             connectionString="Data Source=myServerInstance;Initial Catalog=BlogsPostsDb;User ID=*********;Password=******;" 
             xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
      </connectionStrings>
    

    现在说得通了。只要两个配置中的名称匹配,它们就会被替换。我还必须告诉我的上下文我想使用哪个连接字符串:

    public BlogsPostsContext() : base("BlogsPostsDb") { }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2016-11-15
      • 2018-06-23
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多