web-ext 和 addons.mozilla.org 使用 Add-ons Linter 来检查 WebExtensions。
它还可以用作独立的二进制文件和库。
您可以在我们的文档中找到有关 linter 及其实施规则的更多信息。
您需要 Node.js 才能使用附加组件 linter。
要在本地验证您的附加组件,请从 npm 安装 linter:
# Install globally so you can use the linter from any directory on
# your machine.
npm install -g addons-linter
安装后,运行 linter 并将其定向到您的附加文件:
addons-linter my-addon.zip
或者,您可以将其指向一个目录:
addons-linter my-addon/src/
addons-linter 将检查您的附加组件,并向您显示附加组件的错误、警告和友好消息。如果您想了解有关可以为命令行应用程序启用/禁用的选项的更多信息,请使用--help
选项:
addons-linter --help
仅当将--privileged
选项传递给 addons-linter 时,addons-linter 才能检查特权扩展。此选项将 linter 的行为更改为:
您可以直接将 linter 作为库使用,以更好地将其集成到您的开发过程中。
import linter from 'addons-linter' ;
const sourceDir = process . cwd ( ) ;
const linter = linter . createInstance ( {
config : {
// This mimics the first command line argument from yargs,
// which should be the directory to the extension.
_ : [ sourceDir ] ,
logLevel : process . env . VERBOSE ? 'debug' : 'fatal' ,
stack : Boolean ( process . env . VERBOSE ) ,
pretty : false ,
warningsAsErrors : false ,
metadata : false ,
output : 'none' ,
boring : false ,
selfHosted : false ,
// Exclude files:
shouldScanFile : ( fileName ) => true ,
} ,
// This prevent the linter to exit the nodejs application
runAsBinary : false ,
} ) ;
linter . run ( )
. then ( ( linterResults ) => ... )
. catch ( ( err ) => console . error ( "addons-linter failure: " , err ) ) ;
linter.output
由以下属性组成(与“json”报告类型相同):
{
metadata : { ... } ,
summary : {
error , notice , warning ,
} ,
count ,
error : [ {
type : "error" ,
code , message , description ,
column , file , line
} , ... ] ,
warning : [ ... ] ,
notice : [ ... ]
}
如果您想帮助我们开发 addons-linter,那就太好了!上手非常简单,您只需要在计算机上安装 Node.js 即可。
如果您安装了 Node.js,可以通过以下方法快速开始安装开发依赖项并运行测试
git clone https://github.com/mozilla/addons-linter.git
cd addons-linter
npm install
# Build the project.
npm run build
# Run the test-suite and watch for changes. Use `npm run test-once` to
# just run it once.
npm run test
您还可以构建 addons-linter 二进制文件来测试您的更改。
npm run build
# Now run it against your add-on. Please note that for every change
# in the linter itself you'll have to re-build the linter.
bin/addons-linter my-addon.zip
addons-linter 需要 Node.js v16 或更高版本。查看我们正式测试的 Node.js 版本的.circleci/config.yml
文件。
使用 nvm 可能是并行管理多个 Node 版本的最简单方法。有关更多详细信息,请参阅 GitHub 上的 nvm。
使用 npm 安装依赖项:
npm install
脚本 | 描述 |
---|---|
npm测试 | 运行测试(观察更改) |
npm [运行] 构建 | 构建库(由 CI 使用) |
npm 运行测试覆盖率 | 运行覆盖范围的测试(观察变化) |
npm 运行测试一次 | 运行测试一次 |
npm 运行 lint | 运行 ESLint |
npm 运行测试覆盖率一次 | 运行测试一次并覆盖 |
npm 运行测试集成 linter | 运行我们的集成测试套件 |
npm 运行更漂亮 | 使用 Prettier 自动格式化整个代码库 |
npm 运行 prettier-ci | 如果某些代码未经格式化而被更改,则运行 Prettier 并失败 |
npm 运行 prettier-dev | 自动将修改后的源文件与主分支进行比较和格式化 |
您可以运行npm run build
来构建库。
构建库后,您可以在bin/addons-linter
中使用 CLI。
运行npm test
。这将监视文件更改并重新运行测试套件。
我们希望将覆盖率保持在 100%。使用测试输出中的覆盖率数据来确定哪些行未被覆盖并确保它们被覆盖。
我们使用Sinon进行断言、模拟、存根等,请参阅Sinon文档以了解可用的API。
Jest 被用作测试运行程序,但也提供了有用的工具。请确保您阅读了他们的文档以获取更多详细信息。
我们使用 pino 进行日志记录:
LOG_LEVEL=debug jest test
--log-level [level]
启用 CLI 上的日志记录。我们使用 Prettier 自动格式化 JavaScript 代码并停止所有关于样式的持续争论。作为开发人员,您必须在提交 Pull 请求之前运行它(使用npm run prettier-dev
)。
本地化过程与我们为 addons-frontend 所做的非常相似:语言环境始终在master
分支上更新,任何更改或引入新本地化字符串的 PR 应首先在master
上合并。
为了更新区域设置(当新的本地化字符串添加到代码库时),请从master
分支运行以下脚本。该脚本自动执行 addons-frontend 文档中描述的所有步骤,无需任何确认步骤。
./scripts/run-l10n-extraction
简而言之,linter 的工作方式是获取附加包,从 xpi (zip) 格式中提取元数据,然后处理通过各种内容扫描器找到的文件。
我们严重依赖 ESLint 进行 JavaScript linting、cheerio 进行 HTML 解析以及 Fluent.js 进行语言包解析。
每种文件类型都有一个扫描仪。例如:JavaScript 文件使用JavaScriptScanner
。每个扫描器都会查看相关文件,并将每个文件传递给解析器,然后解析器将其交给一组查找特定内容的规则。
规则通过单个文件中的单个函数导出。规则可以具有在内部使用的私有函数,但规则代码不应依赖于另一个规则文件,并且每个规则文件应导出一个规则。
每个规则函数都从扫描器传递数据,以便执行该规则的特定检查,它返回一个对象列表,然后将这些对象制成消息对象并传递给收集器。
收集器是在处理包内容时“收集”的所有验证消息对象的内存存储。
每条消息都有一个代码,这也是它的密钥。它有一条消息,它是消息所代表内容的简短概述,以及更详细地说明记录该消息的原因的描述。消息的类型是在添加消息时设置的,以便如有必要,同一消息可以是错误或警告。
最后,当处理完成时,linter 将以文本或 JSON 的形式输出收集到的数据。
我们使用 Circle CI 自动部署到 npm。要发布新版本,请增加package.json
中的版本并创建 PR。确保您的版本号符合 semver 格式,例如: 0.2.1
。
合并 PR 后,创建一个与新版本具有相同标签名称的新版本。一旦构建通过,它将进行部署。魔法!
截至 2021 年 11 月,dispensary 已合并到该项目中,并且可以通过运行./scripts/dispensary
来使用 CLI。
这是更新“药房”库的(手动)过程:
src/dispensary/libraries.json
src/dispensary/libraries.json
中更新的发行版本。请注意,某些库(例如 React)支持多个版本,因此我们需要检查每个“分支”。src/dispensary/libraries.json
npm run update-hashes
src/dispensary/libraries.json
和src/dispensary/hashes.txt
中的更改注意: hashes.txt
将嵌入到 addons-linter 包中。
scripts/update-dispensary-doc
命令根据src/dispensary/libraries.json
文件更新上面的发布页面列表。
该源代码可根据 Mozilla 公共许可证 2.0 获取。
此外,部分架构文件源自 Chromium 源代码:
版权所有 (c) 2012 Chromium 作者。版权所有。此源代码的使用受 BSD 样式许可证的约束,该许可证可在 LICENSE-CHROMIUM 文件中找到。
您未获得 Mozilla 基金会或任何一方的商标的权利或许可,包括但不限于 Firefox 名称或徽标。
欲了解更多信息,请参阅:https://www.mozilla.org/foundation/licensing.html