sbtの起動時にプロジェクトの設定を読むとこ + shellコマンド
- bootの話(reload + shell)
compile
とかrun
が入ったJvmPlugin
を読み込む所とかある
sbt.xMain
ではboot
コマンドが初めに実行されるっての前の前に見た。
ここでは、sbt shellが立ち上がる前にbootによりreload
コマンドが実行されている。
reload
の話shell
の話
プロジェクトの設定の読み込み: reload
ここでは、load失敗時のコマンドload-failed
、失敗時のコマンドの仕切りを表すresumeFromFailure
コマンドが追加されている。そしてプロジェクトの設定を読み込むloadp
コマンドが読み込まれる。
loadp
は引数無し、plugins
、return
の3通りで動作し、LoadAction.ValueのenumとしてそれぞれCurrent
、Plugins
、Return
となる(以下、Current
のみの処理を見る)Current
: (Re)loads the project in the current directory.Plugins
: (Re)loads the plugins project (under project directory).Return
: (Re)loads the root project (and leaves the plugins project).
sbt.BuildinCommands.doLoadProject
: loadpの実装- loadActionでは、
ProjectReturn
という属性(Attribute)に対し、LoadAction.Valueに応じて現在のStateに対し、値が設定される- 引数無しの
Current
の場合、現在のStateのProjectReturn
属性の値が設定されていればそのまま、設定されてなければbaseDirectoryのプロジェクトのみがProjectReturn
属性の値として設定される
- 引数無しの
- baseDirectoryとなるディレクトリが存在していなければ、ここでディレクトリが作成される
- build.sbtに簡単な設定を書いてsbtを起動すると勝手にディレクトリが作られるのはここ
- stateにcompileのためのキャッシュが定義されてない時は、設定する
compiler-cache
というAttributeを用いる- 新たに作成する際は、
CompilerCache.fresh: GlobalsCache
を用いる - GlobalCacheはOutput, xLogger, Reporterなどの引数を用いてCacheCompilerを作るinterface
sbt.Load.defaultLoad
<- なるほど : なんかめっちゃ設定するdefaultPreGlobal
: clasloader, クラスパス, compilerとか探したりして、LoadBuildConfiguration
作るdefaultWithGlobal
- グローバルなプラグイン探して
GlobalPlugin.load
(TODO 後で見る) - グローバルなsbtの設定探して
loadGlobalSettings
(TODO 後で見る)
- グローバルなプラグイン探して
Load.apply
<- なるほど〜 : やってること下の方にコメントそのまま載せてるcompile
とかrun
の入ったJvmPlugin
はここから以下のように参照されてる(長い)sbt.Load.apply
->Load.load
->Loag.buildinLoader
->Load.loadUnit
->Load.plugins
->Load.buildPlugins/noPlugins
->Load.loadPluginDefinition
->Load.loadPlugins
->PluginDiscovery.discoverAll(data, loader))
->defaultAutoPlugins
sbt.Load.initialSession
Project.setProject
: 得られたsessionやloadした結果から得られるstructureからプロジェクトをセットするonLoad
とonUnload
のhookを取得し、onUnloadを設定onLoad
はここで実行- ここで最後に
updateCurrent
ってのが呼ばれてる:Project.updateCurrent(s: State): State
- プロジェクトの設定(BuildStructure)を読み込む
- プロジェクト自体を読み込んだら、
onLoadMessage
を表示する - プロジェクトのGlobalコンフィギュレーションのコマンドとか、現在のセッションで定義されたコマンドなどをまとめて
s.definedCommands
に入れる
- loadActionでは、
Load.apply
でしてること、コメントには以下のように書いてる
// build, load, and evaluate all units.
// 1) Compile all plugin definitions
// 2) Evaluate plugin definitions to obtain and compile plugins and get the resulting classpath for the build definition
// 3) Instantiate Plugins on that classpath
// 4) Compile all build definitions using plugin classpath
// 5) Load build definitions.
// 6) Load all configurations using build definitions and plugins (their classpaths and loaded instances).
// 7) Combine settings from projects, plugins, and configurations
// 8) Evaluate settings
ちなみに、デフォルトで読み込まれるpluginは以下の通り
val defaultAutoPlugins = Seq( "sbt.plugins.IvyPlugin" -> sbt.plugins.IvyPlugin, "sbt.plugins.JvmPlugin" -> sbt.plugins.JvmPlugin, "sbt.plugins.CorePlugin" -> sbt.plugins.CorePlugin, "sbt.plugins.JUnitXmlReportPlugin" -> sbt.plugins.JUnitXmlReportPlugin )
sbt shell: shell
プロジェクトの設定が読み込まれた後に、shell
コマンドにより、sbt shellが立ち上がる。shell
の定義は、sbt.BasicCommands.shell
。
当然だがshell
もコマンドの1つなので、Stateを取って実行後にStateを返すブロックを持つ。
ここでは、1行line: String
を読み取って、以下のように前のStateから新しいStateを作る。
val newState = s.copy(onFailure = Some(Shell), remainingCommands = line +: Shell +: s.remainingCommands).setInteractive(true)
remainincCommands
の先頭に読み込んだline
を入れて、その後に再度shell
コマンドを入れる。コマンドを打つ毎に異なるshell
が呼び出されてる事が分かる。
他のコマンドの実装例: alias
他のコマンドの実装例も軽く見る。
alias
はalias c=compile
みたいにするとc
でcompile
が呼ばれるもの。~/.sbtrc
に色々書いたりしとくと便利なやつ。
Stateから、既存のaliasがあるかとか確認しつつ、最終的にs.copy(definedCommands = newAlias(name, value) +: s.definedCommands)
により新しいStateを返す。
c
って名前のコマンドをdefinedCommands
に追加してくれる。c
の中身(Parsr[() => State]
)はc
ってした時のState
のremainingCommands
の前に、compile
を入れてくれるってもの。
Commandは大体終わり
次
InputKey, TaskKey, SettingKeyとかそのへん見たいんだけど、そもそもReferenceちゃんと読んでないの思い出したから先に読もう...
当たり前な事になるほど、とか言ってる気しかしない