处理开发时间 web.config 冲突
Handling development time web.config conflicts
我正在寻找应对这一挑战的方法:我们是一个地理分散的开发团队,使用 ASP.NET Web API 和 Angular 构建网络应用程序。
导致悲伤的是并非所有团队成员都使用相同的数据库设置进行开发工作。是的,我知道——我可以使用 web.config
转换来为测试、暂存和生产设置正确的连接字符串(我已经在这样做了)——但这不是我要说的。
由于目前我们无法控制的原因,我们有
- 一些开发人员在本地 SQL 服务器实例上使用
server=(local);database=OurDB
作为他们的连接字符串
- 其他开发人员在他们的位置使用中央开发人员 SQL 服务器,使用类似
server=someserver.mycorp.com;database=OurDB
的东西
- 以及一些具有其他设置的奇特案例
现在,每当有人提交对 Git 存储库的更改,并且碰巧也在 web.config 中更改某些内容时,他的连接字符串就会提交到存储库。因此,当我提取最新的提交时,我对本地数据库服务器的设置被其他人的设置覆盖了。
我正在寻找一种方法来处理这个问题 - 我希望我可以
挂钩到 Git 拉取过程并在我拉取某些内容时自动更新 web.config
连接字符串以满足我的本地需求
以某种方式引用连接字符串(或外部配置文件),例如基于我当前登录的用户名或类似名称
但我似乎找不到任何方法来做到这一点。我想知道我是否需要构建一个 VS 扩展来处理这个问题——有没有启动器?有没有人以前做过这样的事情并且可以分享他的代码? (或者在 Github 上)
ASP.NET 中使用的 web.config 配置系统不够灵活,无法支持您描述的更高级的场景。那么,为什么要使用它?您可以将配置存储在存储库中的文件中,每个开发人员一个。或者它们可以存储在存储库之外或以其他方式忽略。
真正的诀窍是大多数较旧的应用程序没有检索配置的单一根,因此您必须重构您的应用程序以利用灵活的配置系统。对于您的 staging/production 环境,您可能仍想使用 web.config 中的配置。下面的代码可以让您对一种构建它的方法有一个基本的了解:
public class MyApplicationConfiguration
{
public string MainConnectionString { get; set; }
}
public class ConfigurationRetriever
{
public MyApplicationConfiguration GetConfiguration()
{
// You might look for the absence or presence of an environment variable to determine this
bool isLocalDevelopment = IsApplicationLocalDevelopment();
var config = new MyApplicationConfiguration();
if(isLocalDevelopment)
{
config.MainConnectionString = Environment.GetEnvironmentVariable("MyApplication_MainConnectionString");
//or get it from a JSON file or XML file or config database
}
else
{
config.MainConnectionString = ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString;
}
}
}
您可以重构您的应用程序以利用 Microsoft.Extensions.Configuration,而不是滚动您自己的配置构建逻辑。它不仅适用于 .NET Core。它适用于 .NET 标准。因此,您甚至可以在旧版 ASP.NET 应用程序中使用它。要阅读 web.config,您可能会使用 Microsoft.Extensions.Configuration.Xml。或者您可以编写自己的适配器,从 ConfigurationManager 中提取值。我做了一个基本测试,这按预期工作。
我正在寻找应对这一挑战的方法:我们是一个地理分散的开发团队,使用 ASP.NET Web API 和 Angular 构建网络应用程序。
导致悲伤的是并非所有团队成员都使用相同的数据库设置进行开发工作。是的,我知道——我可以使用 web.config
转换来为测试、暂存和生产设置正确的连接字符串(我已经在这样做了)——但这不是我要说的。
由于目前我们无法控制的原因,我们有
- 一些开发人员在本地 SQL 服务器实例上使用
server=(local);database=OurDB
作为他们的连接字符串 - 其他开发人员在他们的位置使用中央开发人员 SQL 服务器,使用类似
server=someserver.mycorp.com;database=OurDB
的东西
- 以及一些具有其他设置的奇特案例
现在,每当有人提交对 Git 存储库的更改,并且碰巧也在 web.config 中更改某些内容时,他的连接字符串就会提交到存储库。因此,当我提取最新的提交时,我对本地数据库服务器的设置被其他人的设置覆盖了。
我正在寻找一种方法来处理这个问题 - 我希望我可以
挂钩到 Git 拉取过程并在我拉取某些内容时自动更新
web.config
连接字符串以满足我的本地需求以某种方式引用连接字符串(或外部配置文件),例如基于我当前登录的用户名或类似名称
但我似乎找不到任何方法来做到这一点。我想知道我是否需要构建一个 VS 扩展来处理这个问题——有没有启动器?有没有人以前做过这样的事情并且可以分享他的代码? (或者在 Github 上)
ASP.NET 中使用的 web.config 配置系统不够灵活,无法支持您描述的更高级的场景。那么,为什么要使用它?您可以将配置存储在存储库中的文件中,每个开发人员一个。或者它们可以存储在存储库之外或以其他方式忽略。
真正的诀窍是大多数较旧的应用程序没有检索配置的单一根,因此您必须重构您的应用程序以利用灵活的配置系统。对于您的 staging/production 环境,您可能仍想使用 web.config 中的配置。下面的代码可以让您对一种构建它的方法有一个基本的了解:
public class MyApplicationConfiguration
{
public string MainConnectionString { get; set; }
}
public class ConfigurationRetriever
{
public MyApplicationConfiguration GetConfiguration()
{
// You might look for the absence or presence of an environment variable to determine this
bool isLocalDevelopment = IsApplicationLocalDevelopment();
var config = new MyApplicationConfiguration();
if(isLocalDevelopment)
{
config.MainConnectionString = Environment.GetEnvironmentVariable("MyApplication_MainConnectionString");
//or get it from a JSON file or XML file or config database
}
else
{
config.MainConnectionString = ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString;
}
}
}
您可以重构您的应用程序以利用 Microsoft.Extensions.Configuration,而不是滚动您自己的配置构建逻辑。它不仅适用于 .NET Core。它适用于 .NET 标准。因此,您甚至可以在旧版 ASP.NET 应用程序中使用它。要阅读 web.config,您可能会使用 Microsoft.Extensions.Configuration.Xml。或者您可以编写自己的适配器,从 ConfigurationManager 中提取值。我做了一个基本测试,这按预期工作。