Использование Newtonsoft.Json в определении версии TFS от powershell - PullRequest
0 голосов
/ 11 октября 2018

Народ,

Мы используем локальную версию TFS 2017 и работаем над подготовкой / развертыванием веб-сайта и базы данных Azure.Наша задача подготовки / обновления базы данных Azure работает хорошо, но пока мы не сможем автоматизировать часть веб-сайта, у нас будет промежуточный этап, на котором мы копируем веб-пакет из сборки в промежуточный общий ресурс.

Этот шаг выполняется наГруппа развертывания в VFSagent TFS выглядит следующим образом:

  1. Создать временную папку
  2. Развернуть zip-файл во временную папку
  3. Получить папку Out под развернутым zip-файломfile
  4. Перемещение папки в корень временной папки
  5. Объединение файла appsettings.json с файлом master.appsettings.json для среды.
  6. Повторная архивация сетипакет
  7. Копирование веб-пакета в промежуточный целевой каталог в PRJ \ build #

Шаг 5) выполняется с помощью функции слияния Newtonsoft.Json.

# Load the Newtonsoft.Json dll
$asmNewtonsoftJson = [Reflection.Assembly]::LoadFile([io.path]::combine($FolderToZip, "Newtonsoft.Json.dll"))

# Read the appsettings.json file and store as a JObject
$appSettingsPath = [io.path]::combine($folderToZip, "appsettings.json")
$appSettingsJson = (Get-Content $appSettingsPath | Out-String)
$appSettings = [Newtonsoft.Json.Linq.JObject]::Parse($appSettingsJson)

# Read the master appsettings.json file from the env and store as a JObject
$appSettingsMasterPath = [io.path]::combine($AppSettingsMasterFolderPath, $Environment + ".appsettings.json")
$appSettingsMasterJson = (Get-Content $appSettingsMasterPath | Out-String)
$appSettingsMaster = [Newtonsoft.Json.Linq.JObject]::Parse($appSettingsMasterJson)

# Merge the master appsettings.json file into the appsettings.json file
$jms = New-Object Newtonsoft.Json.Linq.JsonMergeSettings
$jms.MergeArrayHandling = [Newtonsoft.Json.Linq.MergeArrayHandling]::Merge
$appSettings.Merge($appSettingsMaster, $jms)

# Write out the updated appsettings.json file
[io.File]::WriteAllText($appSettingsPath, $appSettings.ToString())

Примечание: $ folderToZip содержит расширенное содержимое веб-пакета.Он также содержит dll Newtonsoft.Json (и предположительно его зависимости).

Приведенный выше код прекрасно работает в приложении Windows PowerShell ISE, но завершается неудачно при запуске в задаче определения выпуска TFS.

Сбой на шаге 5) со следующей ошибкой:

2018-10-11T19:29:39.1790546Z ##[error]Unable to find type  [Newtonsoft.Json.Linq.JObject].
At C:\vstsagent\A1\_work\r7\a\<path>\drop\Build\mymergescript.ps1:84 char:20
$appSettings = [Newtonsoft.Json.Linq.JObject]::Parse($appSettings)
CategoryInfo          : InvalidOperation: (Newtonsoft.Json.Linq.JObject:TypeName) [], RuntimeException
FullyQualifiedErrorId : TypeNotFound

Похоже, что Newtonsoft.Json.dll не загружается должным образом при развертывании vtsagent TFS.

Любая помощь здесь приветствуется.

...