Для ускорения компиляции... меньше черт?
РЕДАКТИРОВАТЬ
Сложно, кажется, что есть проблема (которая решается в моментальном снимке 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
Класс в нескольких файлах.