当 SQL 连接字符串已经存在时,不使用转换在部署时发布它

Not publishing a SQL connection string on deployment when it already exists using Transforms

TFS 2015,vNext 构建过程(不是 xaml)

我正在尝试自动化 MVC 网络应用程序的部署过程。它将要部署的服务器具有不同的 SQL 连接字符串。所以我当前的部署是手动将 web.config 文件复制到 web.config.save,使用 WebDeploy 部署新版本,然后转到旧的 web.config.save 文件并复制连接字符串。我现在的规模已经无法持续太久了。所以我需要进一步自动化这个过程。我已经让 TFS 自动构建并部署到我的测试服务器(它也有一个不同的连接字符串,所以这是一个很好的测试)。在 "publish" 属性中,我尝试取消选择 publish-settings-database 部分中的 "Use This connection string at runtime (update destination web.config)" 复选框,然后再次将项目签入 TFS。但是在部署时,web.config 采用默认设置。我不想删除此设置,因为我想要一个用于新安装的默认连接字符串。

我可以编写一个 xml 传输程序来保存当前连接字符串,然后在完成时再次覆盖。但我认为必须有一种方法可以使用当前的工具集来做到这一点,为什么要尝试重新发明轮子?

我开始使用转换。所以我在 VS2015 中创建了一个 web.config.release,然后将其添加到 web.config.release 文件中:

<connectionStrings>
   <add xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)" name="AppEntities"       connectionString="metadata=res://*/Models.DBName.csdl|res://*/Models.DBName.ssdl|res://*/Models.DBName.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLExpress;initial catalog=DBName;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

那么,有谁知道我如何才能使 SQL 连接字符串仅在当前 web.config 中不存在的情况下进行部署更新?

我获得了 TFS 2015 vNext 构建的经验, 在 2016 年第二季度,我们指派了一名非常擅长 PowerShell 的 Dev Ops 人员,他负责构建和部署过程。他想出的一些东西是 post 构建脚本。

现在回答您的问题:对于我们来说,Post-Build 脚本将执行部署部分,作为部署的一部分,您将更新 web.config 中的连接字符串。现在,这需要您团队中的某个人非常擅长使用 PowerShell。

现在我要做的是在原始文件中写一个特殊的词,比如“{ConStringHere}”,然后用 Powershell 脚本替换它,这样你就只会替换它一次。

了解如何验证文件是否包含单词并使用 PowerShell 替换它: Powershell, using contains to check if files contain a certain word

我将重点介绍我们通过这种方法获得的一些好处:

  • 您不需要解决方案、项目和 类 来修改某些文件。大多数 post-build 文件修改可以在 powershell 中用行或 2 完成。
  • 您可以在 TFS 中保留 powershell 脚本,以保留更改的历史记录和注释。
  • 您可以将特殊值(连接字符串、用户、密码)定义为构建变量,与项目中的硬编码值相比,它们更易于更改且安全性更高。
  • 每个环境可以有多个脚本。理想情况下,每个环境的所有脚本都应该几乎相同,但也许在生产中您要发布到 2 个不同的服务器,因此您需要调用一行两次。
  • 您将节省开发人员的时间,因为维护 powershell 的人不必是全栈开发人员。