在TFS签入期间将版权声明附加到文件顶部

在TFS签入期间将版权声明附加到文件顶部,tfs,Tfs,我们所有代码文件的一个要求是在每个文件的顶部包含版权声明。既然我不可能记住这样做,那么有没有一种方法我可以利用TFS为我做这件事 我想要一个这样的流程: 签入时,获取要签入的文件列表 对于每个文件,请检查文件扩展名以确定文件类型 使用文件扩展名在每个文件的第一行追加注释,以确定注释格式 做这件事最简单的方法是什么?@Mike我列出了实现这一点的方法,按复杂性的增加顺序排列 将版权声明添加到默认文件模板。这样,默认情况下,所有新文件都将具有此标头 使用VS宏添加版权-可以在线找到这些 在预构建事件

我们所有代码文件的一个要求是在每个文件的顶部包含版权声明。既然我不可能记住这样做,那么有没有一种方法我可以利用TFS为我做这件事

我想要一个这样的流程:

  • 签入时,获取要签入的文件列表
  • 对于每个文件,请检查文件扩展名以确定文件类型
  • 使用文件扩展名在每个文件的第一行追加注释,以确定注释格式

  • 做这件事最简单的方法是什么?

    @Mike我列出了实现这一点的方法,按复杂性的增加顺序排列

  • 将版权声明添加到默认文件模板。这样,默认情况下,所有新文件都将具有此标头
  • 使用VS宏添加版权-可以在线找到这些
  • 在预构建事件期间添加版权-下面的示例脚本
  • 如果您有一个门控签入,那么修改构建模板以在搁置集排队等待签入时添加版权-您可以再次使用该脚本或将其转换为c代码
  • 通过验证是否需要该操作,可以避免构建时开销

    • 使用“tf状态”检查是否正在添加任何文件
    • 如果存在“添加”,请检查版权是否存在,如果不存在,请在标题中添加
    示例.ps1脚本用于在新的.cs源代码文件中全面添加

    $header = "// Copyright (c) My Corp. All rights reserved.`r`n"
    
    function Write-Header ($file)
    {
        $content = Get-Content $file
    
        $containsWord = $content | %{$_ -match "Copyright"}
    
        if($containsWord -match $true)
        {
            return
        }
    
        tf edit $file 
    
        $filename = Split-Path -Leaf $file
    
        Set-Content $file $header
    
        Add-Content $file $content
    }
    
    // you can modify this condition to apply this logic to new files only
    Get-ChildItem "E:\src" -Recurse | ? { $_.Extension -match "[a-zA-Z]*\.cs$" } | % `
    {
        Write-Header $_.PSPath.Split(":", 3)[2]
    }
    

    @Mike,我正在以越来越复杂的顺序列出实现这一点的方法

  • 将版权声明添加到默认文件模板。这样,默认情况下,所有新文件都将具有此标头
  • 使用VS宏添加版权-可以在线找到这些
  • 在预构建事件期间添加版权-下面的示例脚本
  • 如果您有一个门控签入,那么修改构建模板以在搁置集排队等待签入时添加版权-您可以再次使用该脚本或将其转换为c代码
  • 通过验证是否需要该操作,可以避免构建时开销

    • 使用“tf状态”检查是否正在添加任何文件
    • 如果存在“添加”,请检查版权是否存在,如果不存在,请在标题中添加
    示例.ps1脚本用于在新的.cs源代码文件中全面添加

    $header = "// Copyright (c) My Corp. All rights reserved.`r`n"
    
    function Write-Header ($file)
    {
        $content = Get-Content $file
    
        $containsWord = $content | %{$_ -match "Copyright"}
    
        if($containsWord -match $true)
        {
            return
        }
    
        tf edit $file 
    
        $filename = Split-Path -Leaf $file
    
        Set-Content $file $header
    
        Add-Content $file $content
    }
    
    // you can modify this condition to apply this logic to new files only
    Get-ChildItem "E:\src" -Recurse | ? { $_.Extension -match "[a-zA-Z]*\.cs$" } | % `
    {
        Write-Header $_.PSPath.Split(":", 3)[2]
    }
    

    为什么不将此作为构建后步骤而不是预签入?这样,你就会有一个额外的想法,就是文件中没有任何其他内容被弄乱了。@allen同样,添加这样的内容可以延长构建时间,这让我有点担心。似乎每次检查/添加到每个文件都是一项昂贵的操作。@MikeCole:您将在某个时候检查并添加到每个文件;TFS可能配置为仅允许在成功生成后签入。。。但我建议最好将其作为自定义代码分析规则(在StyleCop或类似的代码分析规则中)来完成,这样就可以警告您的违规行为。为什么不将其作为构建后步骤而不是预签入呢?这样,你就会有一个额外的想法,就是文件中没有任何其他内容被弄乱了。@allen同样,添加这样的内容可以延长构建时间,这让我有点担心。似乎每次检查/添加到每个文件都是一项昂贵的操作。@MikeCole:您将在某个时候检查并添加到每个文件;TFS可能配置为仅允许在成功生成后签入。。。但我建议最好将其作为自定义代码分析规则(在StyleCop或类似的格式中)来执行,这样就可以警告您的违规行为。我对后期构建方法的唯一评论是,这意味着您的构建立即过时:您已经更改了已构建的代码。显然,您只是在添加注释,但我的纯粹主义者仍然希望知道我刚才运行的绿色构建与我在磁盘上的代码相匹配……那么我如何执行场景3中的脚本呢?我复制并粘贴到VS中的后期生成事件命令行中,但失败了。@Dan。我同意这一点,当我在评论中回复时,我就想到了这一点,但仍然是在帖子中而不是在评论前打字。编辑了my ans:s/post/pre/gMy-only-comment-RE-the-post-build方法是,这意味着您的构建立即过时:您已经更改了构建的代码。显然,您只是在添加注释,但我的纯粹主义者仍然希望知道我刚才运行的绿色构建与我在磁盘上的代码相匹配……那么我如何执行场景3中的脚本呢?我复制并粘贴到VS中的后期生成事件命令行中,但失败了。@Dan。我同意这一点,当我在评论中回复时,我就想到了这一点,但仍然是在帖子中而不是在评论前打字。编辑我的答案:s/post/pre/g