If you haven't been paying attention to the "New Microsoft", you may have missed that a lot of their new code is ending up on places like Github. Included in that is the backbone of their new Visual Studio Team Services build and deploy services: tasks.
In exploring the
I noticed that they were making use of some interesting, non-public modules
(primarily in the
Several of their scripts referenced code like this:
# Import the Task.Common and Task.Internal dll that has all the cmdlets we need for Build Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Internal" Import-Module "Microsoft.TeamFoundation.DistributedTask.Task.Common"
In attempting to create my own tasks, I found that I couldn't do that same import. Errors like this would prevent me from utilizing them:
##[error]import-module : Could not load file or assembly 'Microsoft.TeamFoundation.DistributedTask.Agent.Interfaces, Version=126.96.36.199, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. At C:\LR\MMS\Services\Mms\TaskAgentProvisioner\Tools \agents\default\tasks\ BuildDnxWebApp\0.1.11\Build-DnxWebApp.ps1:24 char:1 + import-module "Microsoft.TeamFoundation.DistributedTask.Task.Internal" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Import-Module], FileNotFoundException + FullyQualifiedErrorId : System.IO.FileNotFoundException, + Microsoft.PowerShell.Commands.ImportModuleCommand
After much investigation, I found where the modules live on the VSO/VSTS server. Change your import line to directly reference the agent's module path:
# Import the Task.Common and Task.Internal dll that has all the cmdlets we need for Build $agentWorkerModulesPath = "$($env:AGENT\_HOMEDIRECTORY)\\agent\\worker\\Modules" $agentDistributedTaskInternalModulePath = "$agentWorkerModulesPath\\Microsoft.TeamFoundation.DistributedTask.Task.Internal\\Microsoft.TeamFoundation.DistributedTask.Task.Internal.dll" $agentDistributedTaskCommonModulePath = "$agentWorkerModulesPath\\Microsoft.TeamFoundation.DistributedTask.Task.Common\\Microsoft.TeamFoundation.DistributedTask.Task.Common.dll" Write-Host "Importing VSTS Module $agentDistributedTaskInternalModulePath" Import-Module $agentDistributedTaskInternalModulePath Write-Host "Importing VSTS Module $agentDistributedTaskCommonModulePath" Import-Module $agentDistributedTaskCommonModulePath
The vital part is the
$env:AGENT_HOMEDIRECTORY. This is a
available to the build runner pointing to the agent's home directory. Underneath
this is where the tasks, modules, and other agent-specific assets live. After
prefixing the modules with the proper path, I was back in business!
Hopefully this helps someone; I couldn't find a single piece of info on this. Good luck!