Project Icon

repolinter

自动化开源仓库质量检测与修复工具

Repolinter是一款功能全面的开源仓库检测工具,可自动识别并修复常见问题。支持本地和远程仓库检查,允许用户自定义规则集,并提供多种输出格式。除了基本的文件存在性检查,Repolinter还能验证文件内容,并根据特定条件执行规则。其灵活性和可扩展性使其成为保障开源项目质量的有力工具。

仓库检查器 构建状态

对开源仓库进行常见问题检查。

安装

Repolinter 需要 Node.JS >= v12 才能正常运行。安装 Node.JS 后,可以使用 npm 安装 Repolinter:

npm install -g repolinter

检查本地仓库

安装完成后,运行以下命令来检查一个目录:

repolinter lint <directory>

上述命令将使用本地 repolinter.json 规则集或默认规则集(如果未找到本地规则集)来检查 <directory>

repolinter % repolinter lint .
目标目录:<directory>
检查:
✔ license-file-exists:找到文件(LICENSE)
✔ readme-file-exists:找到文件(README.md)
✔ contributing-file-exists:找到文件(CONTRIBUTING)
✔ code-of-conduct-file-exists:找到文件(CODE-OF-CONDUCT)
✔ changelog-file-exists:找到文件(CHANGELOG)
...
repolinter % echo $?
0

检查远程仓库

Repolinter 还支持使用 --git 标志检查 git 仓库。启用此标志后,目录输入将被解释为 git URL,Repolinter 会自动将其克隆到临时目录中。

repolinter lint -g https://github.com/todogroup/repolinter.git

格式化输出

Repolinter CLI 目前支持三种输出格式模式:

  • 默认(也称为结果)
  • JSON
  • Markdown

你可以使用 --format 标志切换格式。使用 JSON 格式的示例:

repolinter % repolinter lint --format json .
{"params":{"targetDir":"/Users/nkoontz/Documents/code/repolinter","filterPaths":[],...

使用 Markdown 格式的示例:

repolinter % repolinter lint --format markdown .
# Repolinter 报告

此次 Repolinter 运行生成以下结果:
| ❗  错误 | ❌  失败 | ⚠️  警告 | ✅  通过 | 忽略 | 总计 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 15 | 10 | 25 |
...

限制路径

Repolinter 通过 --allowPaths 选项支持允许的路径列表,以防止意外检查构建产物。这些路径仍必须包含在目标目录/仓库中。

repolinter lint --allowPaths ./a/path --allowPaths /another/path

禁用修改

默认情况下,Repolinter 会自动执行规则集指定的修复。如果不希望这样做,可以使用 --dryRun 标志禁用此功能。

规则集配置

类似于 eslint 使用 eslintrc 文件来确定要执行的验证过程,Repolinter 使用 JSON 或 YAML 配置文件(称为规则集)来确定对仓库应运行哪些检查。在规则集中,可以配置两种主要行为:

  • 规则 - Repolinter 应对仓库执行的检查。
  • 公理 - Repolinter 应用于有条件运行规则的外部库。

这些组合功能让你能够精细控制 Repolinter 运行的检查。

提供规则集

Repolinter 将按以下优先顺序从这些来源获取配置:

  1. 使用 --rulesetFile--rulesetUrl 指定的规则集
  2. 被检查项目根目录下的 repolint.jsonrepolinter.jsonrepolint.yamlrepolinter.yaml 文件
  3. 默认规则集

创建规则集

任何规则集都以以下基础开始,分别以 JSON 和 YAML 格式显示:

{
  "$schema": "https://raw.githubusercontent.com/todogroup/repolinter/master/rulesets/schema.json",
  "version": 2,
  "axioms": {},
  "rules": {}
}
version: 2
axioms: {}
rules:

其中:

  • $schema - 指向所有 Repolinter 规则集的 JSON schema。此 schema 既验证规则集,又使规则集创建过程更加简便。
  • version - 指定 Repolinter 应期待的规则集版本。目前有两个版本:遗留配置省略版本号(示例)和其他所有情况使用的 2。除非你知道自己在做什么,否则请使用 2
  • axiom - 公理功能,在公理部分covered。
  • rules - 实际的规则集,在规则部分covered。

规则

规则是以下格式的对象:

"<规则名称>": {
  "level": "error" | "warning" | "off",
  "rule": {
    "type": "<规则类型>",
    "options": {
      // <规则选项>
    }
  },
  "where": ["condition=*"],
  "fix": {
    "type": "<修复类型>",
    "options": {
      // <修复选项>
    }
  },
  "policyInfo": "...",
  "policyUrl": "..."
}
<规则名称>:
  level: error | warning | off
  rule:
    type: <规则类型>
    options:
      <规则选项>
  where: [condition=*]
  fix:
    type: <修复类型>
    options:
      <修复选项>
  policyInfo: >-
    ...
  policyUrl: >-
    ...
  • rule - 要执行的检查。Repolinter 可以执行规则文档中列出的任何检查。与 eslint 不同,Repolinter 的检查旨在被重复使用和专门化:例如,file-existence 检查可以在同一规则集中用于 README-file-exists 规则和 LICENSE-file-exists 规则。这允许用户通过配置通用检查来编写非常具体的规则集。
  • level - 如果检查失败时通知的错误级别。warning 不会改变退出代码,而 off 则不会运行检查。
  • where - 基于公理有条件地启用或禁用此规则。此数组中的字符串遵循 <axiom>=<value> 格式,其中 value 可以是公理输出或 *,用于简单测试公理是否启用。如果存在此选项,则仅当所有指定的公理输出都存在时,此规则才会运行。Repolinter 中可用的公理可以在公理文档中找到。
  • fix (可选) - 如果 rule 执行的检查失败时要执行的操作。Repolinter 可以执行修复文档中列出的任何操作。
  • policyInfo, policyUrl (可选) - 格式化程序用于从政策角度说明检查存在原因的信息。注意:policyInfo 将自动在末尾添加句点以便于格式化。

一个检查 README 是否存在的最小规则示例:

"readme-file-exists" : {
  "level": "error",
  "rule": {
    "type": "file-existence",
    "options": {
      "globsAny": ["README*"]
    }
  }
}
readme-file-exists:
  level: error
  rule:
    type: file-existence
    options:
      globsAny:
      - README*

检查 README 是否匹配特定哈希值,如果不匹配则替换:

"readme-file-up-to-date" : {
  "level": "error",
  "rule": {
    "type": "file-hash",
    "options": {
      "globsAny": ["README*"],
      "algorithm": "sha256",
      "hash": "..."
    }
  },
  "fix": {
    "type": "file-create",
    "options": {
      "file": "README.md",
      "replace": true,
      "text": { "url": "www.example.com/mytext.txt" }
    }
  },
  "policyInfo": "必须保持 readme 更新",
  "policyUrl": "www.example.com/mycompany"
}
readme-file-up-to-date:
  level: error
  rule:
    type: file-hash
    options:
      globsAny:
      - README*
      algorithm: sha256
      hash: "..."
  fix:
    type: file-create
    options:
      file: README.md
      replace: true
      text:
        url: www.example.com/mytext.txt
  policyInfo: 必须保持 readme 更新
  policyUrl: www.example.com/mycompany

公理

"axioms": {
  "<axiom-id>": "<axiom-target>"
}
axioms:
  <axiom-id>: axiom-target

每个公理都被配置为axioms对象中的键值对,其中<axiom-id>指定要运行的程序,<axiom-target>指定在where条件中使用的目标。可用的公理ID可以在公理文档中找到。需要注意的是,某些公理需要外部包才能运行。

使用公理来检测项目的打包系统的配置示例:

{
  "$schema": "https://raw.githubusercontent.com/todogroup/repolinter/master/rulesets/schema.json",
  "version": 2,
  "axioms": {
    "packagers": "package-type"
  },
  "rules": {
    "this-only-runs-if-npm": {
      "level": "error",
      "where": ["package-type=npm"],
      "rule": { /* ... */ }
    }
  }
}
version: 2
axioms:
  packagers: package-type
rules:
  this-only-runs-if-npm:
    level: error
    where: [package-type=npm]
    rule:
      ...

一些公理(例如contributor-count)输出数值而不是字符串。对于这些公理,也可以在where条件中指定数值比较(<><=>=)。请注意,如果对非数值公理使用数值比较,比较将始终失败。

{
  "axioms": {
    "contributor-count": "contributors"
  },
  "rules": {
    "my-rule": {
      "where": ["contributors>6", "contributors<200"],
      // ...
    }
  }
}
axioms:
  contributor-count: contributors
rules:
  my-rule:
    where:
    - contributors>6
    - contributors<200
    rule:
      ...

扩展规则集

一个规则集可以扩展另一个规则集,在这种情况下,两个文件将被递归合并。被扩展的规则集本身可以扩展额外的规则集,最多可深入20个规则集。

通过包含一个指定URL或文件路径的"extends"顶级键来扩展规则集:

{
  "extends": "https://raw.githubusercontent.com/todogroup/repolinter/master/rulesets/default.json"
  "rules": {
    # 禁用CI检查
    "integrates-with-ci": {
      "level": "off"
    }
  }
}
extends: https://raw.githubusercontent.com/todogroup/repolinter/master/rulesets/default.json
rules:
  # 禁用CI检查
  integrates-with-ci
    level: off
    ...

相对路径是相对于用于访问扩展文件的位置解析的。例如,如果repolinter被调用为:

repolinter -u http://example.com/custom-rules.yaml

而该规则集包含extends: "./default.yaml",路径将相对于原始URL解析为http://example.com/default.yaml。如果repolinter被调用为:

repolinter -r /etc/repolinter/custom-rules.yaml

而该规则集包含extends: "./default.yaml",路径将相对于原始文件路径解析为/etc/repolinter/default.yaml

YAML和JSON规则集可以从任一格式扩展。

API

Repolinter还包括一个可扩展的JavaScript API:

const repolinter = require('repolinter')
const result = await repolinter.lint('.')

此API允许开发人员完全控制Repolinter应使用的配置和格式。该库的文档可以在API文档中找到。

进一步了解

许可证

本项目根据Apache 2.0许可证授权。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号