суббота, 9 апреля 2011 г.

[prog] И еще раз на тему MxxRu и Ruby 1.9.2

Разработчики Ruby сделали странную штуку при выпуске версии 1.9.2 – изъяли текущий каталог из путей поиска подгружаемых через require rb-файлов (грубо говоря, в $: текущего каталога уже нет). За каким хером им это вообще понадобилось я понять не могу. С какого бодуна можно было решиться на нарушение совместимости с предыдущими версиями Ruby – тем более. И ладно бы они это сделали при выходе версии 1.9.0. Тогда еще было бы понятно. Все таки совсем новый релиз почти совсем новой версии (переход от 1.8 к 1.9 был более революционным, чем от 1.6 к 1.8). Но такой хитрый финт ушами при смене версии с 1.9.1 на 1.9.2 – это, мать их, сильно.

Что обидно: портировать сами исходники MxxRu и тесты на Ruby 1.9.2 оказалось совсем не сложно. Достаточно было в нескольких местах в require передавать не простое имя файла, а результат работы File.expand_path над этим именем. Так что MxxRu 1.5.4 уже в репозитории и под Ruby 1.9.2 работает. Но новая проблема вскрылась в проектах, которые MxxRu используют. Например, есть проектный файл:

require 'mxx_ru/cpp'

require 'oess_1/util_cpp_serializer/gen'

require 'aag_3/defs/version'

MxxRu::Cpp::dll_target {

   required_prj "oess_1/defs/prj.rb"
   required_prj "oess_1/stdsn/prj.rb"
   required_prj "so_4/prj.rb"
   required_prj "mbsms_2/prj.rb"

   target "aag.defs" + Aag_3::VERSION
   implib_path "lib"

В нем первый require загружает файл из самого MxxRu, поэтому отрабатывает нормально – MxxRu лежит в специальных путях поиска, контролируемых RubyGems. А вот в двух следующих обращениях к require задаются имена файлов относительно текущего каталога – т.е. относительно корневого каталога проекта. И вот тут-то наступает приплыздец: Ruby 1.9.2 не желает их находить.

При этом заставлять пользователей MxxRu править свои успешно работающие проектные файлы – не вариант. Так же, как и заставлять их делать какие-то специальные настройки для Ruby (вроде указания –I. в RUBYOPT). Нужно, видимо, докручивать что-то в самом MxxRu – вплоть до перехвата и собственной реализации require :)

На эту тему вспоминается совсем свежая история с проектом ACE – при выпуске версии 6.0.0 разработчики ACE удалили заголовочный файл OS.h, который был всего лишь скопищем #include-ов для файлов OS_NS_*.h. Да вот только разумность такого удаления для пользователей ACE оказалась далеко не очевидной. Настолько далеко, что своими вопросами “Какого хера?!!!” они вынудили вернуть OS.h при первом же обновлении ACE 6.0 – ace/OS.h is Back!

PS. Чем больше программирую, тем больше убеждаюсь, что совместимость – это очень и очень важная штука. Может быть одна из самых важных. Если не самая.

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