Как загрузить модуль PowerShell из пользовательского сценария в агенте сборки vNext?
Я использую стандартный шаг сборки TFS vNext для выполнения скрипта PowerShell. Внутри скрипта я пытаюсь воспользоваться некоторыми функциями стандартных модулей TFS Agent.
Перечислено здесь: http://blog.majcica.com/2015/11/14/available-modules-for-tfs-2015-build-tasks/
Я видел следующие две строки во многих скриптах PowerShell, найденных на этапах сборки:
Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Internal"
Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Common"
Я пытался использовать те же строки в моем скрипте, однако я получаю сообщение об ошибке:
VERBOSE: Loading module from path
'C:\TFS2015-Agent\Agent1\agent\agent\worker\Modules\Microsoft.TeamFoundation.DistributedTask.Task.Common\Microsoft.TeamFoundation.DistributedTask.Task.Common.dll'.
Import-Module : Could not load file or assembly 'Microsoft.TeamFoundation.DistributedTask.Agent.Interfaces, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
The system cannot find the file specified.
At C:\tfsVnBw1\3\s\Configuration\BuildScripts\CommonFunctions.ps1:25 char:5
+ Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Common" - Error ... + CategoryInfo : NotSpecified: (:) [Import-Module], FileNotFoundException + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerShell.Commands.ImportModuleCommand
Если я пытаюсь не импортировать, он пишет что-то вроде:
The 'Find-Files' command was found in the module 'Microsoft.TeamFoundation.DistributedTask.Task.Common',
but the module could not be loaded. For more information, run 'Import-Module Microsoft.TeamFoundation.DistributedTask.Task.Common'.
At C:\tfsVnBw1\3\s\Configuration\BuildScripts\CommonFunctions.ps1:71 char:16
+ $files = @(FindFiles $filePattern)
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Find-Files:String) [FindFiles], CommandNotFoundException + FullyQualifiedErrorId : CouldNotAutoloadMatchingModule
Разве нельзя использовать модули из "обычных" сценариев PowerShell, а не только из сценариев PowerShell, зарегистрированных как фактический этап сборки?
2 ответа
Попробуйте указать путь к модулю агента сборки, например:
# Import the Task.Common and Task.Internal dll that has all the cmdlets we need for Build
$agentWorkerModulesPathRoot = "$($env:AGENT_HOMEDIRECTORY)\agent\worker"
$agentDistributedTaskInterfacesModulePath = "$agentWorkerModulesPathRoot\Microsoft.TeamFoundation.DistributedTask.Agent.Interfaces.dll"
$agentWorkerModulesPath = "$($env:AGENT_HOMEDIRECTORY)\agent\worker\Modules"
$agentDistributedTaskCommonModulePath = "$agentWorkerModulesPath\Microsoft.TeamFoundation.DistributedTask.Task.Common\Microsoft.TeamFoundation.DistributedTask.Task.Common.dll"
Write-Host "Importing VSTS Module $agentDistributedTaskInterfacesModulePath"
Import-Module $agentDistributedTaskInterfacesModulePath
Write-Host "Importing VSTS Module $agentDistributedTaskCommonModulePath"
Import-Module $agentDistributedTaskCommonModulePath
Разве нельзя использовать модули из "обычных" сценариев PowerShell, а не только из сценариев PowerShell, зарегистрированных как фактический этап сборки?
В шаге сборки можно использовать скрипт powershell, ссылающийся на модуль. Я предпочитаю использовать встроенную задачу powershell, поскольку это означает, что мне не нужно проходить через ритуал gated checkin, чтобы просто изменить способ упаковки кода. Я использую это довольно часто, чтобы делать такие вещи, как...
- загрузите сценарий ps1 для управления версиями общей сборки из общего проекта в TFVC и выполните его для отметки сборок, пакетов nuget и т. д. с номером сборки.
- изменить номер сборки
Save-Module
для модуля в частном репозитории PS и включите его в артефакт (установите помощников)Save-Module
снова во временную папку, затем импортируйте модуль и используйте его, чтобы сделать что-то для создаваемого кода.- Создание заметок о выпуске или аналогичных документов
... но вы можете использовать обычный "Запуск сценария powershell", чтобы сделать все это тоже.
Возможно, проще, хотя бы поместить модуль в путь и обновить powershell, если он < 5.1, если у вас есть powershell 3 или новее на сервере сборки, а модуль уже установлен на сервере и в учетной записи агента $PSModulePath
тогда вам даже не нужно Import -Module
Вы можете напрямую вызывать команды в этом модуле.