我正在使用标准的TFS vNext构建步骤来执行PowerShell脚本。在脚本内部,我试图利用标准TFS代理模块中的一些功能。
此处列出: 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脚本?
答案 0 :(得分: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
答案 1 :(得分:0)
是否不可能仅从“常规” PowerShell脚本中使用模块,而不仅是从注册为实际构建步骤的PowerShell脚本中使用模块?
在构建步骤中可能有一个Powershell脚本引用一个模块。我更喜欢使用inline powershell task,因为这意味着我不必经历门控签入的繁琐操作,而无需更改代码的打包方式。我经常用它来做类似...
Save-Module
用于私有PS存储库中的模块,并将其包含在工件(安装助手)中Save-Module
再次移至temp文件夹,然后导入模块并使用它对正在构建的代码进行某些操作。...但是您也可以使用常规的“运行powershell脚本”来完成所有这些操作。
也许更简单的方法是将模块放入路径并更新Powershell(如果其<5.1),如果在构建服务器上安装了Powershell 3或更高版本,并且该模块已安装在服务器上以及代理帐户的{{ 1}},那么您甚至不需要$PSModulePath
,就可以直接在该模块中调用命令。