вторник, 2 августа 2011 г.

Re: Как отлаживать gem'ы?

On Aug 2, 2011, at 10:02 AM, Max Lapshin wrote:

> 2011/8/2 Iliy Manin <bkmzvf@gmail.com>:
>> Самый удобный способ "девелопить" gem - использовать Rspec :)
>>
>
> RSpec помогает, когда стоит вопрос _как_ писать. Но никак не помогает,
> когда надо решить для себя _что_ писать.
> REPL -- одна из самых замечательных вещей в программировании, а в
> gem-ах зачем-то взяли и
> унитожили эту вещь, которая в руби делается по идее естественно и без проблем.

В руби она делается не естественно и с проблемами. Тот авторелоад, что мы видим в рельсе это магия эктивсаппорта. Собственно ничто не мешает применять ее и в гемах. Гемы это ведь просто и не намертво впиленная в руби штука. Давайте попробуем вместе!

Итак, пишем элементарную гемку.

/lib/autoreload_gem.rb

class AutoreloadGem
def self.go!
puts "Hello!"
end
end

Теперь скрипт, использующий ее:

/test.rb

require 'bundler'
Bundler.setup :default

require 'active_support/dependencies'
ActiveSupport::Dependencies.autoload_paths.unshift *Bundler.environment.specs.map { |s| s.load_paths }.flatten

loop do
ActiveSupport::Dependencies.clear
ActiveSupport::DescendantsTracker.clear

AutoreloadGem.go!
sleep 1
end

Все! Мы можем править гемку и изменения будут тут же загружаться в наш скрипт. (полный работающий пример в приложении)

Вот только применять эту практику с абсолютным большинством гемов не получится (тупо не должно быть require в коде гемки). Кроме того все это накладывает определенные требования и к самому коду. Методика строится на удалении констант (классов / модулей). Но если у вас в коде не константа, а сохранена ссылка на сам объект класса / модуля, то она так и будет вести на неперезагруженный класс (и GC его, естественно, не уберет). Это легко проверить, попробуйте, например, по такой же методике написать рэк-приложение и в config.ru указать ваш класс. Веб-сервер ничего не знает о ваших манипуляциях с классами, так что один раз загрузив класс там он и останется. Что, конечно, не означает фейла ) Ваша Rack-аппа указаная в config.ru может быть просто простым врапперов, который вам никогда не захочется править, а основной код определен к модулях / классах, которые вызываеются внутри враппера (и резолвятся каждый раз при вызове .call, например).

А вот, кажется годная, статейка по теме: http://www.finn.de/blog/2011/05/05/reloading-ruby-code/

Я, вроде, ответил чуть более полностью, чем требовалось. А простой ответ на ваш конкретный вопрос: сейчас гемы отлаживать так не получится.

;)

Комментариев нет:

Отправить комментарий