Для ускорения компиляции... меньше черт?

РЕДАКТИРОВАТЬ
Сложно, кажется, что есть проблема (которая решается в моментальном снимке Play 2.1), когда изменение файла маршрутов также может вызвать эффект стека штамповки, то есть перекомпиляцию контроллеров и зависимостей. Как только это будет решено, и интеграция улучшений производительности Scala 2.10 + SBT 0.12.1 станет более понятной, насколько я стреляю себе в ногу с помощью репозитория DAO на основе черт...

ОРИГИНАЛ
Я по-английски говорю на многих, многие способны, не волнуйтесь, просто втягивают вас... в ужасную медленную зону компиляции $$

trait DaoProviderContract {
  def team:   TeamContract
  def player: PlayerContract
}
object DaoRepo extends DaoProviderContract {
  import com.company.utils.{Connection, Driver}
  implicit lazy val db = Connection.getHandle(Driver.DEFAULT)

  val team    = new TeamDAO
  val player  = new PlayerDAO
}
trait DaoProvider[Contract <: com.company.dao.DAOContract[_]] {
  val daoRepo = DaoRepo
  val dao: Contract
}
trait TeamData extends DaoProvider[TeamContract] {
  val dao: TeamContract = daoRepo.team
}
trait PlayerData extends DaoProvider[PlayerContract] {
  val dao: PlayerContract = daoRepo.player
}

а затем в контроллере смешайте компонент DAO:

object Player extends Controller with PlayerData {
  ....
}

внесение изменений в вышеупомянутый контроллер, по-видимому, вызывает перекомпиляцию всех источников, которые зависят от поставщика DAO, который в моем случае представляет собой набор контроллеров. Чистый эффект заключается в том, что часто я вижу, что почти 3/4 моего приложения перекомпилировано, раздражает.

Теперь SBT 0.12.1 улучшился с точки зрения скорости компиляции, но с точки зрения того, что он перекомпилирует, моя реализация репозитория DAO явно не помогает.

Итак, мой вопрос, в этом случае я должен просто отказаться от черт и выставить объект DaoRepo непосредственно контроллерам? Контроллер проигрывателя будет выглядеть примерно так:

import model.{DaoRepo => repo}
object Player extends Controller { // with PlayerData mixin gone
  def player(id: Int) = repo.player.get(id)
}

Правильно ли я считаю, что внесение изменений в модифицированный контроллер проигрывателя НЕ приведет к перекомпиляции 3/4 моего приложения? Я знаю, что невозможно напрямую протестировать использование объекта DaoRepo, но и ожидание тоже не очень продуктивно.

Спасибо за отзыв, если он у вас есть: помогая SBT перекомпилировать необходимое...

1 ответ

Решение

Вы можете сделать добавочный процесс SBT более интеллектуальным, избегая заполнения одного файла несколькими определениями признаков / классов / объектов. Если у вас есть файл с:

trait A { }
trait B extends Base { }

Изменение определения Base вызовет перекомпиляцию файла, что, в свою очередь, вызовет перекомпиляцию каждого файла, где A или же B передаются...

Попробуйте разделить DAO и PlayerData Класс в нескольких файлах.

Другие вопросы по тегам