问题 TFS删除,使用minimatch模式排除obj文件夹


我在本地设置了TFS 2015,我在上一个构建步骤Publish Build Artifacts上遇到了问题。由于某种原因,构建代理似乎正在存档旧的二进制文件,我留下了一个巨大的文件路径:

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

我现在只是测试,所以这不是一个永久的解决方案,但我怎么能复制所有二进制文件 箱子 文件夹但不是后代 OBJ

从研究我认为这应该工作,但它没有(它不匹配任何东西):

**!(obj)**\bin

我在用着 www.globtester.com 去测试。有什么建议么?

另外,我将在稍后讨论归档问题,但如果有人对此有任何指示,请随时发表评论。谢谢


7299
2017-08-25 10:40


起源

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


答案:


在VSTS中,内置于SDK的URL有两种模式匹配。现在大多数任务都使用 Mini匹配模式如Matt的回答中所述。 但是,有些人使用1.x Agent的Powershell SDK使用的模式。顺便说一句,该格式仍然可以在2.x代理的Powershell SDK中使用。

这意味着有4种任务:

  • 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任务-SDK的 find-files 方法

原始问题发布于2015年,此时2.x代理尚未出现。在这种情况下,模式很可能是:

 **\bin\$(BuildConfiguration)\**\*;-:**\obj\**

-: 排除前面的物品。


10
2017-08-25 12:35



谢谢回复。我不能让这个工作。它看似合乎逻辑,但没有选择任何东西。你重建的另一个建议是第一次工作但后来失败了。这让我觉得我有一些根本错误的东西。 - Rodders
听起来很可疑......你是否使用构建配置变量作为msbuild调用的一部分?你能发布截图吗? - jessehouwing
我在Visual Studio Test构建步骤中看到了这种语法。但是在复制文件部分(内容)中,它对我不起作用。例如,将其添加为 **\?(*.exe|*.dll|*.pdb|*.xml|*.resx);-:**\obj\** 不排除obj ... - Matt
你能分享参考吗? -:?在里面 DOC,据说 ! 用于排除模式.. - sotn
任何依赖的任务 find-vstsfiles 或者是使用2015年附带的V1 SDK的powershell任务。 github.com/Microsoft/vsts-task-lib/blob/master/powershell/Docs/... - jessehouwing


根据微软的文档,这里有一个列表 文件匹配模式 您可以使用。最重要的规则是:

匹配 ?

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

匹配 * 要么 +

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

匹配 @ 标志

  • @ 恰好匹配一次。

与Brackets匹配 () 和 |

  • 如果您使用括号 | 它被视为一个 逻辑或,例如 *(hello|world) 意味着“零或更多的问候或世界”

与双星号匹配 **

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

排除模式 !

  • 领导 ! 更改要排除的包含模式的含义。支持交错排除模式。

字符集 [ 和 ]

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

评论 #

  • 以...开头的模式 # 被视为评论。

逃离

  • 包装特殊字符 [] 可用于在文件名中转义文字glob字符。例如文字文件名 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注意|巴纽|.JPG |.ICO | * .PDF)

注意: 您可能需要添加更多扩展,具体取决于项目的需要。


2
2017-07-19 08:32



这是部分正确的。不幸的是,PowerShell和TypeScript版本的任务使用不同的minimatch库,在一个任务中工作的可能在另一个任务中不起作用。对于具有较旧任务实施的TFS 2015和2017用户尤其如此。 - jessehouwing
@jessehouwing - 我想知道为什么MS选择了minimatch而不是常见的正则表达式 - 或者只是通配符,因为我们从“老旧的”dir命令中知道它们。 - Matt
它与gitignore和一大堆开源约定的格式相同。有了ms️OSS的事情,我知道是什么引发了这一举动...... - jessehouwing
@jessehouwing - 确切地说;-) - Matt