0

我似乎找不到任何有关如何转换多个文件中存在的密钥的文档或信息。文件转换任务似乎只支持唯一键的转换。我设置的 Windows Web 应用程序是一个带有 3 个租户的 OrchardCore CMS,每个租户都有自己的 appSettings.json 文件,每个文件中都有一个 ConnectionString。

我最初认为有某种方法可以将文件转换任务连接到特定变量,在这种情况下这很容易,但看起来不太可能。除此之外,由于某些项目要求,我们不能使用来自 Market Place 的任何扩展,例如 MagicChunks。

任何帮助将不胜感激,这让我发疯了。

4

2 回答 2

0

好的,我找到了一个临时解决方法,但它很脏,需要修改以下内容,以便我更新 json 属性而不是替换字符串值。我也不喜欢这种方法直接修改工件。下面是一个带有内联脚本的 Power Shell 任务,它使用管道变量。希望这对某人有帮助。

# cd to the agent artifacts directory (where the zip file exist)
cd $env:Agent_ReleaseDirectory

[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");
# Open zip and find the particular file (assumes only one inside the Zip file)

$zipfileName = Get-ChildItem $(System.DefaultWorkingDirectory) -depth 4 -filter '*.zip'
$zip =  [System.IO.Compression.ZipFile]::Open($zipfileName.FullName,"Update")

$defaultAppSettings = $zip.Entries | Where-Object { $_.FullName -eq "App_Data/Sites/Default/appsettings.json" }
$secondaryAppSettings = $zip.Entries | Where-Object { $_.FullName -eq "App_Data/Sites/Secondary/appsettings.json" }

Write-Host "Update Default App Settings"

# Update Default Settings
$defaultAppSettingsFile = [System.IO.StreamReader]($defaultAppSettings).Open()
$defaultAppSettingsText = $defaultAppSettingsFile.ReadToEnd()
$defaultAppSettingsFile.Close()
$defaultAppSettingsFile.Dispose()

$defaultAppSettingsText = $defaultAppSettingsText -replace  "Server=###.###.###.###;Initial Catalog=############;MultipleActiveResultSets=true;User ID=######;Password=#######;ConnectRetryCount=0","$(Default.ConnectionString)"
$defaultAppSettingsText = $defaultAppSettingsText -replace  "#########","$(Default.AppSettings.ApiSetting.ApiKey)"
$defaultAppSettingsText = $defaultAppSettingsText -replace  "#########","$(Default.AppSettings.ApiSetting.ApiBaseUrl)"

#update file with new content
$defaultAppSettingsFile = [System.IO.StreamWriter]($defaultAppSettings).Open()
$defaultAppSettingsFile.BaseStream.SetLength(0)

# Insert the $text to the file and close
$defaultAppSettingsFile.Write($defaultAppSettingsText)
$defaultAppSettingsFile.Flush()
$defaultAppSettingsFile.Close()

Write-Host "Default App Settings Updated"

Write-Host "Update Secondary App Settings"

# Update Scoot Settings
$secondaryAppSettingsFile = [System.IO.StreamReader]($secondaryAppSettings).Open()
$secondaryAppSettingsText = $secondaryAppSettingsFile.ReadToEnd()
$secondaryAppSettingsFile.Close()
$secondaryAppSettingsFile.Dispose()

$secondaryAppSettingsText = $secondaryAppSettingsText -replace  "Server=###.###.###.###;Initial Catalog=############;MultipleActiveResultSets=true;User ID=######;Password=#######;ConnectRetryCount=0","$(Secondary.ConnectionString)"
$secondaryAppSettingsText = $secondaryAppSettingsText -replace  "#########","$(Default.AppSettings.ApiSetting.ApiKey)"
$secondaryAppSettingsText = $secondaryAppSettingsText -replace  "#########","$(Default.AppSettings.ApiSetting.ApiBaseUrl)"

#update file with new content
$secondaryAppSettingsFile = [System.IO.StreamWriter]($secondaryAppSettings).Open()
$secondaryAppSettingsFile.BaseStream.SetLength(0)

# Insert the $text to the file and close
$secondaryAppSettingsFile.Write($secondaryAppSettingsText)
$secondaryAppSettingsFile.Flush()
$secondaryAppSettingsFile.Close()

Write-Host Secondary App Settings Updated"
# Write the changes and close the zip file
$zip.Dispose()
于 2021-06-02T03:06:40.317 回答
0

您可以尝试安装这个免费的 3rd-party 扩展:XDT Transform,然后在管道中获取外部任务: XDT 转换任务。

于 2021-05-14T01:36:25.983 回答