【问题标题】:How to get grunt-tslint to generate one pmd file for use in jenkins如何让 grunt-tslint 生成一个用于 jenkins 的 pmd 文件
【发布时间】:2016-01-22 05:15:41
【问题描述】:

我已经设法使用 grunt-tslint 来分析我的 typescript 项目。我有一些问题。

默认情况下,会为每个输入 TS 文件创建一个输出文件。这会失败,因为所有输出文件的文件名都相同,并且保存第二个输出文件失败,因为该文件已经存在。 这个问题可以通过使用 appendOutput 来避免。这会将每个文件的分析输出附加到现有文件中。使用此选项会生成一个文件用于分析整个项目。

问题在于,如果您使用post 中提到的 pmd 格式化程序。如果分析一个文件就可以了。一个 pmd.xml 文件被创建并且是有效的。如果创建了多个文件并且您使用 appendOutput 选项,您会在同一个文件中获得多个带有多个根标签的 xml 文档,类似于:

<pmd>content</pmd>
<pmd>content</pmd>
<pmd>content</pmd>
<pmd>content</pmd>

(我无法粘贴实际文件内容,因为我无法从我的工作 PC 上发布)。 当 jenkins 分析此文件时,它会失败,因为它不是有效的 xml 文档。

在我看来,这个问题有几个解决方案:

  1. 输出一个非 pmd 文件(可能是 json)并创建一个新的 grunt 任务以将该 json 文件转换为一个有效的 pmd 任务
  2. 修复 grunt-tslint,使其可以输出多个不同名称的文件(从代码的角度来看,这不会太难)
  3. 创建一个 grunt 任务来修复损坏的 xml(这可以通过一些正则表达式查找和替换来完成)

有没有人对此问题有任何经验或有任何其他解决方案?

【问题讨论】:

    标签: jenkins gruntjs pmd tslint


    【解决方案1】:

    我编写了 tslint pmd 格式化程序。我现在记得我们也遇到过你所说的问题。我不太记得了,但我认为我们最终使用的是一个自定义格式化程序版本,它不会将&lt;pmd&gt;..&lt;/pmd&gt; 标记附加到每个文件违规和一些单行巫术以最终将整个输出包装起来。 希望这会有所帮助

    我要做的是: 像这样更改pmd formatter(您可以将其创建为自己的格式化程序):

    export class Formatter extends AbstractFormatter {
    public format(failures: Lint.RuleFailure[]): string {
       # comment this out
       #let output = "<pmd version=\"tslint\">";
        #insert this instead
        let output ="";
         ...
    
        #and comment this out
        #output += "</pmd>";
    

    然后在 jenkins 中创建一个 shell 命令步骤,如下所示:

    echo '<pmd version="tslint">'`cat tslint.out`'</pmd>' > tslint.out
    

    请注意,我是凭记忆写的,但它应该可以工作。

    【讨论】:

    • 谢谢。我曾尝试使用 grunt-text-replace 删除根标签,但这会删除所有这些。我不能让它与正则表达式一起工作,也不能删除第一个和最后一个。如果您可以共享单行魔法将整个文件包装在根标签中,我认为这也可以解决我的问题。
    • 我编辑了我的答案以包含更多细节。这不是最优雅的解决方案,但应该可以正常工作。
    【解决方案2】:

    我按照上面链接中指定的相同说明进行操作。 简单的 linux 命令帮助了我,而不是修改 pmd 格式化程序。 假设 jenkins_tslint_error 目录包含 pmd.xml 文件,其中包含 tslint 错误。

    在构建步骤“执行 shell 脚本”中添加一个任务

    grunt -f jenkins-tslint

    cd jenkins_tslint_error

    sed -i 的|| |g' pmd.xml

    sed -i 的|| |g' pmd.xml

    sed -i '1s/^//' pmd.xml

    sed -i '$a' pmd.xml

    然后使用 Post-build Actions 捕获并使用 PMD 分析结果

    【讨论】:

      【解决方案3】:

      我也需要这个功能,所以我反其道而行之,并创建了一个允许输出到自定义输出目录和扩展的分支。我的环境使用 Checkstyle,但使用 jenkins,我可以设置一个文件模式,该模式可以解析来自指定自定义输出目录的所有 xml 文件(例如,reports/checkstyle/**/*.xml)。

      可以在这里找到分叉:

      我已经通过这样的一行将它添加到我的 packages.json 中:

      "devDependencies": {
         ..
         "grunt-tslint": "https://github.com/UXabre/grunt-tslint/tarball/master",
         ..
      }
      

      现在我可以在我的 grunt 文件中指定:

      tslint: {
          options: {
              outputFolder: 'reports/checkstyle/',
              ext: '.xml',
              formatter: 'checkstyle'
          },
          files: {
              src: "src/**/*.ts"
          }
      }
      

      我可能不是最漂亮的解决方案,因为它会将与已插入模式相同的文件夹结构中的所有文件正确;但它至少对我有用。我会看看我是否可以将它正式化为 PR,但现在,你可以成为地球上第二个使用它的人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 2019-11-25
        • 2014-08-31
        • 1970-01-01
        • 2022-12-05
        相关资源
        最近更新 更多