1.Scalastyleを利用してコードフォーマットチェックする
Scalastyle
http://www.scalastyle.org/
コードフォーマットルールに関しては以下のリンクを参考にxmlを作成する感じです。
http://www.scalastyle.org/rules-0.6.0.html
ちなみに1ファイルの最大の行数が800行にしろというコードフォーマットルールはこんな感じ。
<check enabled="true" class="org.scalastyle.file.FileLengthChecker" level="warning">
<parameters>
<parameter name="maxFileLength">800</parameter>
</parameters>
</check>
今回はコマンドラインでチェックしました。
ダウンロードは以下から
http://www.scalastyle.org/command-line.html
実際こんな感じにエラーが出力されます
$ java -jar scalastyle-batch_2.10.jar --config scalastyle_config.xml
src/main/test.scala
warning file=src/main/test.scala message=File length exceeds 800 lines
Processed 1 file(s)
Found 0 errors
Found 1 warnings
Finished in 463 ms
(´∀`)ポッ> so good!
( ´・ω・`)> あ、これ結局手動でコード修正しなきゃいけないじゃん。。
(メリット)
・実コードに影響しない
・設定が簡単
(課題)
・チェックはできるが、コードを手動で修正する作業が発生する
・git pre-commit hockを利用してチェックしようとしたが、設定コストがかかる
・コマンドラインに依存
→ 結局自動化してねーじゃん。。
2.scalariformを利用してコードフォーマット変換をする
今回はsbtを利用してcompile時にコードフォーマットしよう。
sbt-scalariform
https://github.com/sbt/sbt-scalariform
addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0")
build.sbtと同じ階層にscalariform.sbtを作成してやる
import scalariform.formatter.preferences._
import ScalariformKeys._
scalariformSettings
preferences := preferences.value
.setPreference(AlignParameters, true)
.setPreference(AlignSingleLineCaseStatements, true)
.setPreference(AlignSingleLineCaseStatements.MaxArrowIndent, 40)
.setPreference(CompactControlReadability, false)
.setPreference(CompactStringConcatenation, false)
.setPreference(DoubleIndentClassDeclaration, true)
.setPreference(FormatXml, true)
.setPreference(IndentLocalDefs, false)
.setPreference(IndentPackageBlocks, true)
.setPreference(IndentSpaces, 2)
.setPreference(IndentWithTabs, false)
.setPreference(MultilineScaladocCommentsStartOnFirstLine, false)
.setPreference(PreserveDanglingCloseParenthesis, true)
.setPreference(PlaceScaladocAsterisksBeneathSecondAsterisk, false)
.setPreference(PreserveSpaceBeforeArguments, false)
.setPreference(RewriteArrowSymbols, false)
.setPreference(SpaceBeforeColon, false)
.setPreference(SpaceInsideBrackets, false)
.setPreference(SpaceInsideParentheses, false)
.setPreference(SpacesWithinPatternBinders, true)
setPreferenceに書いてる設定は↓を参考にって感じ
https://github.com/mdr/scalariform
$ sbt compile
これでscalariform.sbtで設定したコードフォーマットに変換してくれる。
(多分、activator ~runの時に自動フォーマットかける設定も頑張ればできるはず。。)
(´∀`)ポッ> so good!
( ´・ω・`)> あ、でもこれ設定できるコードフォーマットもう少し欲しいな。。
(長所)
・stb、activatorに依存するためどのエディタでどの環境行ってもコードフォーマットは
統一される。
・他のアプリケーション開発に干渉しない
(課題)
・コマンドラインに依存する
・git pre-commit hookなどのサービスを利用しなくてはならず、設定コストがかかる
・設定できるフォーマットが若干少ない
・自動で一気にコードが修正されるので怖い
3.IntelliJで保存する際にコードフォーマットする
おっとここに来てscala云々関係ないじゃんw
参考にしたのがこちら、
『IntelliJ IDEAでファイル保存時にcode formatする』
http://qiita.com/sisidovski/items/bde2d844c3c73457923c
(´∀`)ポッ> very good! これでひとまず解決かな。。
(長所)
・ファイル保存の際に自動フォーマットがかかるので、視覚的に何が変わったかが分かりやすい。
・scalaだけでなく、他の言語のコードスタイルを登録することができる
・IntelliJが用意しているコードスタイルの種類が多い。(コードスタイルは.idea/codeStyleSettings.xmlに吐き出されるのでプロジェクト内共有も可能)
(課題)
・他のアプリケーションに干渉する可能性がある
→ keymap,codestyleの設定を各アプリケーションで独立されることができる
・例えばvimやeclipseのような他のエディタで編集されるとコードフォーマットが崩れる
→ プロジェクトチームメンバーはIntelliJで開発しているからほぼ問題にはならない
まとめ
あれこれ試して見た結果、私のプロジェクトでは「3.IntelliJで保存する際にコードフォーマットする」ことにしました。
課題と書いているのは私のプロジェクトであがった課題であって、ツールやライブラリの課題を言っているわけではありません。(一応誤解がないよう・・)
次回エントリーではIntelliJのCodeStyleの共有方法なんかを丁寧に説明できればと思います。