如何让 grunt-tslint 生成一个用于 jenkins 的 pmd 文件

How to get grunt-tslint to generate one pmd file for use in jenkins

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

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

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

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

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

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

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

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

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

我会做的是: 像这样更改 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

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

我遵循了上面指定的相同说明 link。 而不是修改 pmd 格式化程序,简单的 linux 命令帮助了我。 假设 jenkins_tslint_error 目录包含 pmd.xml 包含 tslint 错误的文件。

在构建步骤中添加任务 "execute shell script " as

grunt -f jenkins-tslint</p> <p>cd jenkins_tslint_error </p> <p>sed -i 's|| |g' pmd.xml</p> <p>sed -i 's|| |g' pmd.xml</p> <p>sed -i '1s/^//' pmd.xml</p> <p>sed -i '$a' pmd.xml

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

我也需要这个功能,所以我反其道而行之,创建了一个允许输出到自定义输出目录和扩展的分支。我的环境使用 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,但现在,您可以成为地球上第二个使用它的人!