https://dart-lang.github.io/linter/lints/index.html
The analysis options file
檢查器會根據(jù)項(xiàng)目根目錄下的分析腳本執(zhí)行檢查, 該文件通常會與pubspec文件處于同一層級.
老版本的分析腳本命名為.analysis_options, 沒有yaml后綴, 新版本統(tǒng)一命名為:analysis_options.yaml
檢查器會使用#1檢查other package和other other package, 使用#2檢查my package.
https://blog.csdn.net/hdwhappy/article/details/113946151
前言
Dart語言在統(tǒng)一代碼規(guī)范這方面做的還是比較完善的惶室,不僅有官方文檔 effective-dart 指導(dǎo)我們寫出優(yōu)雅的dart代碼铃拇,更是提供了像eslint(寫過js/ts的應(yīng)該都知道)一樣的工具linter來檢查我們的代碼是否符合規(guī)范肴敛。當(dāng)然乳蓄,檢查項(xiàng)是可以配置的仆潮,這個后面再說签则,我們先來介紹如何使用官方提供的工具阵具。
使用工具檢查代碼規(guī)范
首先拢驾,我們需要在項(xiàng)目的根目錄下添加analysis_options.yaml文件奖磁,再次確認(rèn)下這個文件應(yīng)該跟pubspec.yaml在同一級目錄下(不要嫌啰嗦)。文件添加好了繁疤,那應(yīng)該怎么寫配置的內(nèi)容呢咖为?這里有三個預(yù)設(shè)可供選擇:
- pedantic : Google內(nèi)部執(zhí)行的規(guī)則
- effective_dart : 與effective-dart 指南相對應(yīng)的規(guī)則
- flutter : flutter analyze中使用的規(guī)則
我們以pendantic為例,首先在pubspec.yaml文件的dev_dependencies下添加pendantic庫稠腊,接著運(yùn)行pub get將該庫加載到項(xiàng)目中躁染。
dev_dependencies:
pedantic: ^1.9.0
然后我們在analysis_options.yaml文件中添加如下配置:
include: package:pedantic/analysis_options.yaml
當(dāng)然也可以像下面這樣寫,指定具體的options版本號:
include: package:pedantic/analysis_options.1.9.0.yaml
通過查看pedantic庫的代碼結(jié)構(gòu)也能夠看出analysis_options.yaml里一直是引用最新的預(yù)設(shè)文件架忌。
第一種引用option的方式可能會在庫更新的時候帶來新版本的option文件吞彤,這樣的話有可能會帶來新的錯誤警告信息,而第二種引用指定版本option的方式會比較的穩(wěn)定叹放,這個大家選擇合適自己的就好(星座決定選擇饰恕,手動滑稽一下)。
配置好analysis_options文件后我們就可以在Android Studio的Dart Analysis下看到提示了井仰,鼠標(biāo)點(diǎn)擊具體條目可以跳轉(zhuǎn)到具體代碼進(jìn)行修改調(diào)整埋嵌。(VS Code應(yīng)該會在PROBLEMS下面看到相應(yīng)的提示)
配置analysis_options.yaml文件
include: package:pedantic/analysis_options.1.9.0.yaml
analyzer:
exclude: [build/**]
strong-mode:
implicit-casts: false
linter:
rules:
- camel_case_types
復(fù)制代碼
- include : 指定引用第三方庫中預(yù)設(shè)文件的路徑
- analyzer : 配置static analysis的條目,包括啟用更嚴(yán)格的類型檢查糕档,排除文件莉恼,忽略特定規(guī)則拌喉,更改規(guī)則的嚴(yán)重程度等速那。
- linter : 配置linter規(guī)則
需要注意:不要在YAML文件中使用制表符,而是要用2個空格來表示每個縮進(jìn)級別尿背。
啟用更嚴(yán)格的類型檢查
analyzer:
strong-mode:
implicit-casts: false
implicit-dynamic: false
復(fù)制代碼
我們可以使用implicit-casts和implicit-dynamic這兩個配置項(xiàng)來啟用更嚴(yán)格的類型檢查端仰,他們的默認(rèn)值都為true,可以組合使用田藐,也可以分開使用荔烧。
- implicit-casts的值為false時,可以確保類型推斷引擎不會隱式轉(zhuǎn)換成具體的數(shù)據(jù)類型汽久。
- implicit-dynamic的值為false時, 可以確保類型推斷引擎在無法確定具體的數(shù)據(jù)類型時不會轉(zhuǎn)換成動態(tài)類型鹤竭。
這個大家可以設(shè)置一下試試,99%的人應(yīng)該會收獲一堆錯誤景醇,然后開始懷疑自己寫的是什么粑粑臀稚。。三痰。吧寺。
定制自己的linter規(guī)則
linter:
rules:
- annotate_overrides
- await_only_futures
- camel_case_types
- cancel_subscriptions
復(fù)制代碼
按照上面的格式窜管,可以根據(jù)實(shí)際需要添加自己的linter規(guī)則, dart-lang.github.io/linter/lint… 這里可以查看所有的linter規(guī)則稚机,下面標(biāo)注的標(biāo)簽會很清楚的標(biāo)注每條規(guī)則的所在以及類別(例如:style)
但是如果你要禁用前面通過include引入的linter規(guī)則幕帆,則需要下面的配置格式
include: package:pedantic/analysis_options.1.9.0.yaml
linter:
rules:
avoid_shadowing_type_parameters: false
await_only_futures: true
復(fù)制代碼
當(dāng)然也可以啟用新的規(guī)則。這里需要注意的是赖条,以上兩種配置linter的方式不能混用失乾。
排除文件
有些時候我們需要排除一些文件,比如json_serializable庫生成的.g.dart文件纬乍,這時候就需要配置exclude仗扬,可以指定具體文件,也可以指定一類文件或者這個文件夾下的所有文件蕾额,所以說這個還是比較靈活的早芭。
analyzer:
exclude:
- lib/http_client.dart
- lib/models/*.g.dart
- lib/mock/**
復(fù)制代碼
忽略特定規(guī)則
我們可以忽略指定的linter規(guī)則,配置樣式如下:
analyzer:
errors:
todo: ignore
復(fù)制代碼
更改規(guī)則的嚴(yán)重程度
我們也可以全局更改指定規(guī)則的嚴(yán)重程度诅蝶,配置樣式如下:
analyzer:
errors:
invalid_assignment: warning
missing_return: error
dead_code: info
復(fù)制代碼
IDE的提示修復(fù)功能
不管是VS Code 還是Android Studio退个,提示錯誤的同時一般都會帶著修復(fù)提示的。
鼠標(biāo)點(diǎn)點(diǎn)就能搞定大部分的警告调炬,strong-mode開啟的話另說语盈,不是很強(qiáng)迫癥的話可以忽略這個選項(xiàng)。
結(jié)束語
既然dart自帶的代碼規(guī)范功能這么強(qiáng)大缰泡,我們也不能浪費(fèi)了google工程師們的一片良苦用心刀荒。簡單的設(shè)置一下就可以讓代碼規(guī)范很多,趕快動手試試吧棘钞。
Auto-fix suggestions
不過在加了analyzer以后我發(fā)現(xiàn)VSCode出現(xiàn)了幾百個warning, 大部分warning都有簡單的fix方法(比如給Text("foo")
加個const
之類的). 雖然只要點(diǎn)一下就能fix, 點(diǎn)幾百下也實(shí)在是太麻煩了...
搜索一下以后發(fā)現(xiàn)了解決辦法: https://stackoverflow.com/a/62664168
首先用dartfmt
可以解決一些簡單的格式問題:
# simple style/format fixes
$ dartfmt --fix --overwrite --follow-links .
要應(yīng)用analyzer的fix, 需要使用dartfix. 不過它目前只支持pedantic, 不能直接用analysis_options.yaml的配置:
# install dartfix:
$ pub global activate dartfix
# Use dartfix to auto-apply pedantic suggestions:
$ dartfix --pedantic --excludeFix unnecessary_this lib/ --fix prefer_const_declarations --overwrite
但我發(fā)現(xiàn)pedantic的檢查確實(shí)不如lint嚴(yán)格(cf. 二者的比較), 所以我并沒有直接用--pedantic
.
但是, 我們依然可以用dartfix來fix某一類問題(需要先確認(rèn)某個fix是否被dartfix支持). 比如我看到很多sort_child_properties_last
的建議, 于是可以:
# Check if the "sort_child_properties_last" lint is supported by dartfix:
$ dartfix -h | grep sort_
? sort_child_properties_last
# This fix is available ==> Apply it with dartfix:
$ dartfix --fix sort_child_properties_last lib/ --overwrite
用類似的方式, 就可以快速應(yīng)用linter的建議:
$ dartfix --fix prefer_const_constructors lib/ --overwrite
$ dartfix --fix prefer_const_declarations lib/ --overwrite
$ dartfix --fix prefer_final_locals lib/ --overwrite
# Or apply multiple fixes at once:
$ dartfix --fix prefer_const_declarations,avoid_redundant_argument_values,prefer_collection_literals,curly_braces_in_flow_control_structures,prefer_if_elements_to_conditional_expressions,annotate_overrides,prefer_const_constructors_in_immutables,unnecessary_const,prefer_is_empty,prefer_final_fields \
lib/ --overwrite