ole*_*sii 114 .net configuration continuous-integration release-management visual-studio
我有一个包含MSTest集成测试的dll类型项目.在我的机器上测试通过,我希望在CI服务器上发生同样的事情(我使用TeamCity).但是测试失败了,因为我需要在app.config中调整一些设置.这就是为什么我想要一个单独的第二个app.config文件来保存CI服务器的设置.
所以我想拥有
/Sln /Proj app.config (I think this is required by VS) app.Release.config (This is a standalone independent config file)
因此,如果我在CI上的构建配置中选择Release配置,我想使用app.Release.config文件而不是app.config
问题
对于简单的.dll类型项目,这似乎并不简单.对于Web项目,我可以进行Web配置转换.我找到了一个黑客如何为dll类型的项目进行这些转换,但我不是黑客的忠实粉丝.
问题
根据.NET项目的构建配置(例如Debug,Release,...)调整app.config文件的标准方法是什么?
ole*_*sii 151
使用SlowCheetah插件.有关如何使用SlowCheetah继续阅读的更多选项和详细信息.
正如您已经注意到的那样,没有默认的简单方法可以为库类型(.dll)项目使用不同的配置文件.原因是目前的想法是:"你不需要"!框架开发人员认为您需要配置可执行文件:无论是控制台,桌面,Web,移动应用程序还是其他内容.如果你开始为一个dll提供配置,你可能会得到一些我称之为配置地狱的东西.您可能不再(轻易地)理解为什么这个和那些变量看起来似乎无处可见.
"等等", - 你可能会说,"但我需要这个用于我的集成/单元测试,它是一个库!".这是真的,这是你可以做的(只选一个,不要混合):
您可以安装SlowCheetah - 一个Visual Studio插件,为您执行所有低级XML戳(或转换).它的工作方式,简要说明:
最初取自这里.这是一个自定义的MSBuild任务,您可以将其嵌入到Visual Studio .proj文件中.将以下代码复制并粘贴到项目文件中
<Target Name="AfterBuild">
<Delete Files="$(TargetDir)$(TargetFileName).config" />
<Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config"
DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>
Run Code Online (Sandbox Code Playgroud)
现在在项目中创建一个名为的文件夹,Config
并在那里添加新文件:App.Debug.config,App.Release.config等.现在,根据您的配置,Visual Studio将从文件Config
夹中选择配置文件,并将其重命名为输出目录.因此,如果您选择了PatternPA.Test.Integration项目并选择了Debug配置,则在构建之后的输出文件夹中,您将找到一个PatternPA.Test.Integration.dll.config文件,该文件之后已复制并重Config\App.Debug.config
命名.
这些是您可以在配置文件中留下的一些注释
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->
<!-- Depending on the configuration the content of projectName.dll.config
is fully substituted by the correspondent to build configuration file
from the 'Config' directory. -->
</configuration>
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中,您可以拥有这样的东西
每个构建工具(如NAnt,MSBuild)将提供根据配置转换配置文件的功能.如果您在构建计算机上构建解决方案,这将非常有用,您需要更好地控制准备产品以供发布的内容和方式.
例如,您可以使用Web发布dll的任务来转换任何配置文件
<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
TaskName="TransformXml"/>
<PropertyGroup>
<!-- Path to input config file -->
<TransformInputFile>path to app.config</TransformInputFile>
<!-- Path to the transformation file -->
<TransformFile>path to app.$(Configuration).config</TransformFile>
<!-- Path to outptu web config file -->
<TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>
<Target Name="transform">
<TransformXml Source="$(TransformInputFile)"
Transform="$(TransformFile)"
Destination="$(TransformOutputFile)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
VHa*_*avy 22
您可以尝试以下方法:
<ItemGroup> <None Include="App.config"/> </ItemGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <None Include="App.Debug.config"/> </ItemGroup> <ItemGroup Condition=" '$(Configuration)' == 'Release' "> <None Include="App.Release.config"/> </ItemGroup>
我没有尝试过这种方法来处理app.config
文件,但它可以与其他Visual Studio项目一起使用.您可以以您喜欢的任何方式自定义构建过程.无论如何,让我知道结果.
Dan*_*son 12
你应该考虑ConfigGen.它是为此目的而开发的.它根据模板文件和设置文件为每个部署机器生成配置文件.我知道这并没有具体回答你的问题,但它可能很好地回答你的问题.
因此,您可能拥有测试,UAT,生产等,而不是调试,发布等.您还可以为每台开发人员计算机设置不同的设置,以便您可以生成特定于您的开发计算机的配置并更改它,而不会影响任何其他人的部署.
使用的一个例子可能是......
<Target Name="BeforeBuild">
<Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
$(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />
<Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
$(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>
Run Code Online (Sandbox Code Playgroud)
如果您将其放在.csproj文件中,并且您有以下文件...
$(ProjectDir)App.Config.Settings.xls
MachineName ConfigFilePath SQLServer
default App.config DEVSQL005
Test App.config TESTSQL005
UAT App.config UATSQL005
Production App.config PRODSQL005
YourLocalMachine App.config ./SQLEXPRESS
$(ProjectDir)App.config.template.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configuration>
<appSettings>
<add key="ConnectionString" value="Data Source=[%SQLServer%];
Database=DatabaseName; Trusted_Connection=True"/>
</appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
......那么这将是结果......
从第一个命令,为xls文件中指定的每个环境生成的配置文件,放在输出目录$(SolutionDir)ConfigGen中
.../solutiondir/ConfigGen/Production/App.config
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<configuration>
<appSettings>
<add key="ConnectionString" value="Data Source=PRODSQL005;
Database=DatabaseName; Trusted_Connection=True"/>
</appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
从第二个命令开始,dev计算机上使用的本地App.config将替换为本地(-l)开关和文件名(-n)开关指定的生成的配置.
小智 10
使用与Romeo相同的方法,我将其改编为Visual Studio 2010:
<None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />
<None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />
Run Code Online (Sandbox Code Playgroud)
在这里,您需要将两个App.config文件保存在不同的目录中(appDebug和appRelease).我测试了它,它工作正常!
我听说过 SlowCheetah 的好消息,但无法让它发挥作用。我执行了以下操作:为每个特定配置添加 am 标签。
前任:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'UAT|AnyCPU'">
<OutputPath>bin\UAT\</OutputPath>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AppConfig>App.UAT.config</AppConfig>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
106009 次 |
最近记录: |