0

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

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

问题在于,如果您使用本文中提到的 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(这可以通过一些正则表达式查找和替换来完成)

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

4

3 回答 3

0

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

于 2016-07-24T00:54:12.520 回答
0

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

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

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

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

于 2015-10-26T09:51:39.113 回答
0

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

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

grunt -f jenkins-tslint

cd jenkins_tslint_error

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

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

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

sed -i '$a ' pmd.xml

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

于 2015-11-07T09:43:24.520 回答