首页 > 解决方案 > 如何正确使用负通配符来清除工件中不必要的文件?

问题描述

我有一个构建管道,到目前为止似乎正在按预期工作。然而,困扰我和开发人员的一件事是,生成的工件有很多不必要的文件,这些文件在发布管道使用时会被部署,虽然它不会损害 Web 应用程序,但它会添加所有那些不必要的依赖项(即 dll)和调试(例如 pdb)无用的文件。

这是预期的工件:

预期的

这是今天正在生产的:

产品

这是 zip 文件中的内容:

压缩内容

zip 文件也需要看起来像预期的工件。事实上,如果我可以生成内容与上面预期的工件完全一样的 zip 文件,那就太棒了。

请注意,由于列表太长,我从图片中删除了大部分 pdb/dll/xml 文件,但我希望您能理解。

以下是复制任务和相关任务 YAML:

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    SourceFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
    Contents: |
     assets/**
     bin/**
     Content/**
     Scripts/**
     Views/**
     *.config
     *.asax
     *.ico
     *.txt
    TargetFolder: '$(Build.ArtifactStagingDirectory)'
  condition: succeededOrFailed()
  
steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
  inputs:
    SourceFolder: Project123
    Contents: |
     Bundles/**
     !(packages.config|phantomjs-license.txt)
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

steps:
- task: ArchiveFiles@2
  displayName: 'Archive $(Build.ArtifactStagingDirectory)'
  inputs:
    rootFolderOrFile: '$(Build.ArtifactStagingDirectory)'
    includeRootFolder: false
    verbose: true
    
steps:
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: Release'
  inputs:
    ArtifactName: Release

我尝试了不同的负通配组合,但我似乎无法正确删除不必要的文件以实现像预期工件一样的文件。

我不想使用 Powershell 任务,如果可能的话,我想在复制任务中使用负通配符来删除这些文件。

标签: azure-devopsazure-pipelines

解决方案


经过这么多尝试/错误,我终于巧合地找到了解决方案!!!

这个想法基本上是将复制任务TargetFolder属性设置为不仅根Build.ArtifactStagingDirectory,而且设置为最终发布的子文件夹(例如 Release 或 Drop),如下所示:

TargetFolder: '$(Build.ArtifactStagingDirectory)/Release'

确保存档文件路径也更新到该子文件夹位置:

archiveFile: '$(Build.ArtifactStagingDirectory)/Release/$(Build.BuildId).zip'

最后,确保发布工件PathtoPublish属性也调整到子文件夹:

PathtoPublish: '$(Build.ArtifactStagingDirectory)/Release'
ArtifactName: Release

我还重新安排了复制任务,我认为将包含AngularOutput的Bundles目录复制到_PublishedWebsites会更有意义,这样_PublishedWebsites将作为我们想要存档/发布的所有工件内容的源目录

因此,这里是更新的工作副本/存档/发布 YAML!

steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
  inputs:
    SourceFolder: Project123
    Contents: |
     Bundles/**
     !(packages.config|phantomjs-license.txt)
    TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
    
steps:
- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)/Release'
  inputs:
    SourceFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
    Contents: |
     assets/**
     bin/**
     Bundles/**
     Content/**
     Scripts/**
     Views/**
     Web.config
     ApplicationInsights.config
     *.asax
     *.ico
     *.txt
    TargetFolder: '$(Build.ArtifactStagingDirectory)/Release'
  condition: succeededOrFailed()
  
steps:
- task: ArchiveFiles@2
  displayName: 'Archive $(Build.ArtifactStagingDirectory)/Release'
  inputs:
    rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/Release'
    includeRootFolder: false
    archiveFile: '$(Build.ArtifactStagingDirectory)/Release/$(Build.BuildId).zip'
    verbose: true

steps:
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: Release'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/Release'
    ArtifactName: Release

结果发布

释放


推荐阅读