有几种方法可以解决这个问题。
只需选择以下脚本之一,将其添加到源代码管理并在构建配置中设置 PowerShell 构建运行器,以在运行 NUnit 步骤之前运行传递所需参数的脚本。如果您选择选项二,那么您还需要考虑转换 dll。
应用设置替换.ps1
如果您只想更改单个值,您可以使用一些简单的 PowerShell 来实现此目的,该 PowerShell 会将配置文件加载到 xml 文档中,迭代应用程序设置并更改匹配的设置。
# -----------------------------------------------
# Config Transform
# -----------------------------------------------
#
# Ver Who When What
# 1.0 Evolve Software Ltd 13-05-16 Initial Version
# Script Input Parameters
param (
[ValidateNotNullOrEmpty()]
[string] $ConfigurationFile = $(throw "-ConfigurationFile is mandatory, please provide a value."),
[ValidateNotNullOrEmpty()]
[string] $ApplicationSetting = $(throw "-ApplicationSetting is mandatory, please provide a value."),
[ValidateNotNullOrEmpty()]
[string] $ApplicationSettingValue = $(throw "-ApplicationSettingValue is mandatory, please provide a value.")
)
function Main()
{
$CurrentScriptVersion = "1.0"
Write-Host "================== Config Transform - Version"$CurrentScriptVersion": START =================="
# Log input variables passed in
Log-Variables
Write-Host
try {
$xml = [xml](get-content($ConfigurationFile))
$conf = $xml.configuration
$conf.appSettings.add | foreach { if ($_.key -eq $ApplicationSetting) { $_.value = $ApplicationSettingValue } }
$xml.Save($ConfigurationFile)
}
catch [System.Exception] {
Write-Output $_
Exit 1
}
Write-Host "================== Config Transform - Version"$CurrentScriptVersion": END =================="
}
function Log-Variables
{
Write-Host "ConfigurationFile: " $ConfigurationFile
Write-Host "ApplicationSetting: " $ApplicationSetting
Write-Host "ApplicationSettingValue: " $ApplicationSettingValue
Write-Host "Computername:" (gc env:computername)
}
Main
用法
AppSettingReplace.ps1 "D:\MyPath\app.config" "BaseTestDataPath" "%teamcity.build.workingDir%"
XdtConfigTransform.ps1
另一种方法是使用 XDT 提供完整的配置转换支持——这确实需要Microsoft.Web.XmlTransform.dll以某种方式在服务器上结束(我通常将其放入源代码控制中)。
以下脚本将一个配置文件转换为另一个配置文件。
# -----------------------------------------------
# Xdt Config Transform
# -----------------------------------------------
#
# Ver Who When What
# 1.0 Evolve Software Ltd 14-05-16 Initial Version
# Script Input Parameters
param (
[ValidateNotNullOrEmpty()]
[string] $ConfigurationFile = $(throw "-ConfigurationFile is mandatory, please provide a value."),
[ValidateNotNullOrEmpty()]
[string] $TransformFile = $(throw "-TransformFile is mandatory, please provide a value."),
[ValidateNotNullOrEmpty()]
[string] $LibraryPath = $(throw "-LibraryPath is mandatory, please provide a value.")
)
function Main()
{
$CurrentScriptVersion = "1.0"
Write-Host "================== Xdt Config Transform - Version"$CurrentScriptVersion": START =================="
# Log input variables passed in
Log-Variables
Write-Host
if (!$ConfigurationFile -or !(Test-Path -path $ConfigurationFile -PathType Leaf)) {
throw "File not found. $ConfigurationFile";
Exit 1
}
if (!$TransformFile -or !(Test-Path -path $TransformFile -PathType Leaf)) {
throw "File not found. $TransformFile";
Exit 1
}
try {
Add-Type -LiteralPath "$LibraryPath\Microsoft.Web.XmlTransform.dll"
$xml = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
$xml.PreserveWhitespace = $true
$xml.Load($ConfigurationFile);
$xmlTransform = New-Object Microsoft.Web.XmlTransform.XmlTransformation($TransformFile);
if ($xmlTransform.Apply($xml) -eq $false)
{
throw "Transformation failed."
}
$xml.Save($ConfigurationFile)
}
catch [System.Exception] {
Write-Output $_
Exit 1
}
Write-Host "================== Xdt Config Transform - Version"$CurrentScriptVersion": END =================="
}
function Log-Variables
{
Write-Host "ConfigurationFile: " $ConfigurationFile
Write-Host "TransformFile: " $TransformFile
Write-Host "LibraryPath: " $LibraryPath
Write-Host "Computername:" (gc env:computername)
}
Main
用法
XdtConfigTransform.ps1 "D:\MyPath\app.config" "D:\MyPath\app.transform.config" "%teamcity.build.workingDir%\Library"
注意:最后一个参数是包含 Microsoft.Web.XmlTransform.dll 的目录的路径
Github 存储库 - teamcity-config-transform
希望这可以帮助