TFS投放,使用minimatch模式排除obj文件夹

12

我正在安装本地的TFS 2015,但在最后的构建步骤“发布构建工件”中遇到了问题。由于某种原因,构建代理似乎正在归档旧二进制文件,导致我得到一个庞大的文件路径:

E:\TFSBuildAgent\_work\1a4e9e55\workspace\application\Development\project\WCF\WCF\obj\Debug\Package\Archive\Content\E_C\TFSBuildAgent\_work\1a4e9e55\workspace\application\Development\project\WCF\WCF\obj\Debug\Package\PackageTmp\bin

我将首先使用示例 minimatch 模式复制文件:

**\bin

目前我只是在测试,因此这不是永久性的解决方案,但是我该如何复制所有位于 bin 文件夹中但不是 obj 的子文件夹中的二进制文件呢?

根据研究,我认为这应该可以工作,但实际上它并不起作用(它没有匹配任何内容):

**!(obj)**\bin

我正在使用www.globtester.com 进行测试。 有什么建议吗?

另外,关于存档问题,我稍后会进行调查,但如果有人有任何指针,请随意评论。 谢谢


关于存档问题,我怀疑您的定义未配置为清理工作区或在msbuild命令行上调用/t:rebuild/t:clean,build,这将触发增量构建,速度更快,但可能会留下旧的位。 - jessehouwing
还要考虑将您想要删除的所有内容复制到 $(Build.ArtifactsStagingDirecotry),该文件夹将在每次构建后自动清除。请参阅:https://msdn.microsoft.com/Library/vs/alm/Build/scripts/variables - jessehouwing
2个回答

13
在VSTS中,SDK内置了两种URL模式匹配。现今大多数任务使用Matt答案中描述的Minimatch模式。然而,一些任务使用1.x Agent的PowerShell SDK使用的模式。顺便提一下,该格式仍可在2.x Agent的Powershell SDK中使用。
这意味着有5种不同类型的任务:
  • 1.x代理- PowerShell SDK
  • 2.x代理-节点SDK
  • 2.x代理- PowerShell 1向后兼容性
  • 2.x代理- PowerShell 3 SDK-使用find-files
  • 2.x代理-PowerShell 3 SDK-使用find-match
加粗部分不使用Minimatch,而是使用VSTS-Task-SDK中的find-files方法所记录的格式。

这个问题最初是在2015年发布的,在那时2.x代理程序还不存在。在这种情况下,模式很可能是:

 **\bin\$(BuildConfiguration)\**\*;-:**\obj\**
< p > -: 排除前面的项目。


1
谢谢回复。但是我无法让它工作。看起来很合理,但没有选择任何内容。您的另一个建议是重新构建,第一次可以工作,但之后失败了。这让我觉得我有根本性的问题。 - Rodders
1
听起来有点可疑...你在msbuild调用中使用了构建配置变量吗?你能发一些截图吗? - jessehouwing
我在 Visual Studio Test 构建步骤中看到过这种语法。但是在复制文件部分(内容)中,它对我没有起作用。例如,将它附加为 **\?(*.exe|*.dll|*.pdb|*.xml|*.resx);-:**\obj\** 并没有排除 obj ... - Matt
1
任何依赖于 find-vstsfiles 或使用随附 2015 年的 V1 SDK 的 PowerShell 任务的任务。https://github.com/Microsoft/vsts-task-lib/blob/master/powershell/Docs/FullHelp/Find-VstsFiles.md - jessehouwing
1
@chamberlain 我已经构建了很多任务并长期使用这些存储库。知道要查找什么也有帮助。我尝试弄清楚 Azure Pipelines 任务是如何做事的。 - jessehouwing
显示剩余4条评论

4
根据Microsoft的文档,这里是一些与文件匹配相关的文件匹配模式。其中最重要的规则如下:

使用?进行匹配

  • ?匹配文件或目录名称中的任何单个字符(零次或一次)。

使用*+进行匹配

  • *+匹配文件或目录名称中的零个或多个字符。

使用@符号进行匹配

  • @仅匹配一次。

使用括号()|进行匹配

  • 如果您在使用带有|的括号,则它被视为逻辑OR,例如*(hello|world)表示“零次或多次出现的hello或world”

使用双星号**进行匹配

  • **递归通配符。例如,/hello/**/*匹配/hello的所有后代。

使用!排除模式

  • 前导!将一个包含模式的含义更改为排除。支持交错的排除模式。

使用[]字符集

  • []匹配文件或目录名称中的一组或范围字符。

使用#进行注释

  • #开头的模式被视为注释。

转义

  • 将特殊字符包装在[]中可用于转义文件名中的文本字符。例如,文字文件名hello[a-z]可以转义为hello[[]a-z]

示例

以下表达式可用于“复制文件”构建步骤的“内容”字段中,以创建Web项目的部署包:

**\?(.config|.dll|*.sitemap)
**\?(.exe|.dll|.pdb|.xml|*.resx)
**\?(.js|.css|.html|.aspx|.ascx|.asax|.Master|.cshtml|*.map)
**\?(.gif|.png|.jpg|.ico|*.pdf)

注意:根据您的项目需求,您可能需要添加更多扩展名。


这部分是正确的。不幸的是,任务的PowerShell和TypeScript版本使用不同的minimatch库,一个任务中可行的操作在另一个任务中可能无法正常工作。对于使用较旧任务实现的TFS 2015和2017用户来说,这一点尤其重要。 - jessehouwing
@jessehouwing - 我在想微软为什么选择了 minimatch 而不是常见的正则表达式,或者就像我们从“好旧”的 dir 命令中所知道的通配符一样。 - Matt
这与gitignore和许多开源惯例的格式相同。对于ms♥️OSS,我有一个想法是什么触发了这一举动... - jessehouwing
@jessehouwing - 没错;-) - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接