当目标条目文件不在根目录中时,Azure DevOps自定义生成任务扩展无法找到PowerShell VstsTaskSdk.psd1
我不久前构建了Azure DevOps构建/发布任务扩展,最近它在运行时开始报告以下警告: [警告]任务“等待”(1.2.3)正在使用不推荐使用的任务执行处理程序。任务应使用支持的任务库: 因此,按照链接到,然后钻取到,看起来我需要在我的当目标条目文件不在根目录中时,Azure DevOps自定义生成任务扩展无法找到PowerShell VstsTaskSdk.psd1,powershell,azure-devops,azure-pipelines,azure-devops-extensions,Powershell,Azure Devops,Azure Pipelines,Azure Devops Extensions,我不久前构建了Azure DevOps构建/发布任务扩展,最近它在运行时开始报告以下警告: [警告]任务“等待”(1.2.3)正在使用不推荐使用的任务执行处理程序。任务应使用支持的任务库: 因此,按照链接到,然后钻取到,看起来我需要在我的task.json文件中将我的扩展名从旧的PowerShell执行处理程序更新到新的PowerShell3执行处理程序,因此我进行了更改,代码现在如下所示: "execution": { "PowerShell3&quo
task.json
文件中将我的扩展名从旧的PowerShell
执行处理程序更新到新的PowerShell3
执行处理程序,因此我进行了更改,代码现在如下所示:
"execution": {
"PowerShell3": {
"target": "$(currentDirectory)/Code/Wait.ps1",
"workingDirectory": "$(currentDirectory)"
}
}
按照页面上的说明,我已经完成了Save Module-Name VstsTaskSdk-Path.\
下载SDK模块并将其提交到扩展任务根目录下的ps\u modules\VstsTaskSdk
目录
但是,在MS Hosted agent上构建并运行扩展后,会出现以下错误:
[错误]未找到文件:“D:\a_tasks\Wait_f3e9b3d7-a528-5245-91c7-453406bcb038\1.2.17\Code\ps_modules\VstsTaskSdk\VstsTaskSdk.psd1”
我注意到它在code
目录中查找ps\u modules
目录,所以我尝试将它放在我的git repo中,但仍然会导致相同的错误
我找到了,但他们的解决方案是从他们的ps\u modules\[version]\VstsTaskSdk
层次结构中删除版本目录,我还没有
我也发现了,看起来我做的每件事都是正确的,但我仍然得到了错误
这就是我的文件层次结构的外观:
|-- Wait\ <task root>
|-- Code\
|-- Convert-Unit.Tests.ps1
|-- Convert-Unit.psm1
|-- Wait.ps1
|-- ps_modules\
|-- VstsTaskSdk\
|-- [All the module files, including VstsTaskSdk.psd1]
|-- icon.png
|-- task.json
|--Wait\
|--代码\
|--Convert-Unit.Tests.ps1
|--Convert-Unit.psm1
|--等等,ps1
|--ps_模块\
|--VstsTaskSdk\
|--[所有模块文件,包括VstsTaskSdk.psd1]
|--icon.png
|--task.json
我想问题可能是我将我的任务“业务逻辑代码”与
“任务基础结构代码”,将其放置在code
目录中;也就是说,我的task.json
文件和Wait.ps1
目标入口点文件不在同一目录中。根据这个假设,我删除了code
目录并转储了根目录中的所有文件,错误消失了(我现在收到了不同的错误,但它似乎已经解决了这个问题)
在迁移到新的PowerShell执行处理程序时,我可以做些什么来将“业务逻辑代码”与“任务基础结构代码”分开?我不确定它如何确定应该在哪里查找ps\u modules
目录
代码也都是开源的,所以请随意使用
更新
虽然我无法解决如何将task.json
和目标入口点PowerShell脚本文件放在不同目录中的问题,但我能够进行更改,使所有扩展基础结构代码都位于根目录中,而“业务逻辑”代码位于code
目录中
如您所见,我选择在tasks根目录中创建一个
task.ps1
文件,并将其用作任务的目标入口点。更新到PowerShell3
执行处理程序也意味着必须更新检索任务输入的方式,因此我使用task.ps1
文件获取输入,然后只需调用code\Wait.ps1
脚本。这使我能够保持代码的整洁和隔离,因此如果Azure DevOps决定再次使用新的执行处理程序更改内容,我将不需要接触code
目录中的任何代码,只需接触task.ps1
文件。事实上,我认为您尝试的解决方案是,将扩展条目脚本(task.ps1
)与SDK打包文件夹处于同一级别,是迄今为止您的最佳选择
作为正常的编译过程,当您启动输入脚本时,它会找到从相同文件夹级别自动存储.dll
文件的文件夹。对于Azure Devops,用于存储.dll
文件的默认文件夹是ps\u modules
。这是一个默认操作,它与设计一致
这就是为什么您收到关于服务器正在从代码文件夹中查找.dll
的错误的原因。此外,这也是为什么我们建议开发人员采用以下布局:
将SDK和脚本文件完全分离到两个文件夹中并非不可能,只要选择此布局,文件结构就会非常干净,但会大大增加代码成本(使用$PSScript root覆盖所有SDK加载脚本),以及以后的维护成本
创建条目脚本,并将其与SDK文件夹放在同一文件夹级别(
ps_modules
),然后从存储在同一文件夹中的相关脚本文件调用该函数,这是保持文件结构干净和维护代码可维护性的最佳方法,此外,它不会增加额外的代码消耗,这将导致代码冗余增加。我提交此PR是为了更新文档,其中提到将任务入口点文件放在根目录中是PowerShell3
执行处理程序的新要求。