Azure Pipeline CopyFiles@2任务通配符匹配异常与子目录遍历问题
问题原因
两个异常均由Azure DevOps CopyFiles@2 任务内置的minimatch通配符默认规则导致:
- 遍历无关子目录的原因:当
contents参数使用不带路径前缀的通配符时,任务会默认将规则解析为**/Setup*.sql,其中**代表递归遍历所有层级子目录,因此会扫描.git等无关目录,导致任务耗时大幅增加。而此前使用精确文件名README.MD时,任务会优先在源目录根路径查找,匹配到对应文件后就停止扫描,不会触发递归遍历,因此运行正常。 - 通配符匹配结果不符合预期的原因:默认递归匹配规则下,任务优先级会向子目录匹配偏移,根目录下无额外字符的
Setup.sql会被低优先级处理,甚至在大目录扫描时被遗漏,而子目录或名称带额外字符的SetupSecurity.sql反而会被优先匹配到。
解决方案
如果需要匹配的SQL文件都存放在源目录根路径下,修改contents参数添加根路径前缀/,关闭递归扫描即可:
- task: CopyFiles@2 condition: eq(variables.publishDeployables, true) displayName: 'Add SQL to output' inputs: sourceFolder: '$(Build.SourcesDirectory)' contents: '/Setup*.sql' targetFolder: '$(Build.ArtifactStagingDirectory)'
如果需要同时匹配指定子目录下的SQL文件,可手动添加对应路径规则,同时排除无关目录即可:
- task: CopyFiles@2 condition: eq(variables.publishDeployables, true) displayName: 'Add SQL to output' inputs: sourceFolder: '$(Build.SourcesDirectory)' contents: | /Setup*.sql /subdir/**/Setup*.sql !/.git/** targetFolder: '$(Build.ArtifactStagingDirectory)'
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

