2

我正在使用标准 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 脚本?

4

2 回答 2

3

尝试指定构建代理的模块路径,如:

 # 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
于 2016-09-09T09:04:13.090 回答
0

是否不能使用“普通”PowerShell 脚本中的模块,而不仅仅是注册为实际构建步骤的 PowerShell 脚本?

在构建步骤中可以有一个 powershell 脚本引用一个模块。我更喜欢使用内联 powershell 任务,因为这意味着我不必为了更改代码的打包方式而经历门控签入的繁琐工作。我经常用它来做一些事情,比如......

  • 从 TFVC 中的共享项目下载通用程序集版本控制 ps1 脚本并执行它以使用内部版本号标记程序集、nuget 包等。
  • 更改内部版本号
  • Save-Module用于私有 PS 存储库中的模块,并将其包含在工件中(安装助手)
  • Save-Module再次到临时文件夹,然后导入模块并使用它对正在构建的代码执行某些操作。
  • 生成发行说明或类似文档

...但是您也可以使用常规的“运行 powershell 脚本”来执行所有这些操作。

也许更简单的方法是将模块放在路径中并在其 < 5.1 时更新 powershell,如果您在构建服务器上安装了 powershell 3 或更高版本,并且该模块已经安装在服务器和代理帐户中$PSModulePath,那么您甚至不需要需要Import -Module,您可以直接调用该模块中的命令。

于 2018-11-05T04:29:04.627 回答