2015-10-22 26 views
0

我设法使用grunt-tslint来分析我的打字稿项目。我有几个问题。如何让grunt-tslint生成一个pmd文件在jenkins中使用

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

这个问题是,如果你使用这个post中讨论过的pmd格式化程序。如果分析一个文件就没有问题。一个pmd.xml文件被创建并且是有效的。如果创建多个文件,并使用appendOutput选项你在同一个文件中的多根标签与此类似多个XML文档:

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

(我不能粘贴实际的文件内容,我可以”从我的工作电脑发布)。 当这个文件被jenkins分析时,它会失败,因为它不是一个有效的xml文档。

像有这个问题的一些解决方案,在我看来:

  1. 输出非PMD文件(JSON也许),并创建一个新的咕噜任务,把这一JSON文件分割成一个有效的PMD任务
  2. 修复grunt-tslint,以便它可以输出具有不同名称的多个文件(查看代码,从代码的角度来看这不会太难)
  3. 创建一个咕噜任务,将修复破损的xml也可能会被一些正则表达式进行查找和替换)

有没有人有这个问题的任何经验或有任何其他解决办法?

回答

0

我写了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>"; 

然后在詹金斯创建一些shell命令的步骤像:

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

请注意我从内存中写这个,但它应该工作。

+0

谢谢你。我曾尝试使用grunt-text-replace来删除根标签,但是这样删除了所有这些标签。我不能让它与正则表达式一起工作,不要删除第一个和最后一个。如果你可以共享单行巫术来将整个文件包装在根标签中,那么我就可以解决我的问题了。 – Roaders

+0

我编辑了我的答案以包含更多详细信息。这不是最优雅的解决方案,但应该可以正常工作。 – antweiss

+0

谢谢,就是这样。 – Roaders

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

然后使用生成后动作捕捉和利用PMD分析结果

0

我也需要此功能,所以我另一方面做了它,并创建一个分支,允许输出到自定义输出目录和扩展名。我的环境使用Checkstyle,但对于jenkins,我可以设置一个文件模式来解析来自指定自定义输出目录(例如reports/checkstyle/**/*。xml)的所有xml文件。

叉可以在这里找到:

我已经有这样的线把它添加到我的packages.json:

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

在我的呼噜声我现在可以指定的文件:

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

我可能不是最漂亮的解决方案,因为它会将所有文件放入与已插入的模式相同的文件夹结构中;但它至少为我完成了这项工作。我会看看我是否可以将此形式化为公关,但现在,您可以成为地球上的第二人使用它!

相关问题