Установка драйвера PostgreSQL на Ruby. Под Windows. Облом-с
Устанавливаю драйвер (адаптер, интерфейс) для доступа из Ruby к PostgreSQL из под Windows.
Версии:
Ruby 1.9.2
PostgreSQL 8.4
pg 10.0.1
Делаю:
"gem install pg"
Находит и скачивает сам.
Ругается на то что хочет скомпилировать, а не может.
Оказывается он собирается скомпилировать библиотеку, для подключения к PostgreSQL. Значит, нужен DevKit.
Качаю DevKit c http://rubyinstaller.org/downloads/
Распаковываю.
Запускаю dk.rb
Смотрю параметры, запускаю с параметрами по очереди
Прописываю DevKit\bin и DevKit\mingw\bin в переменную среды окружения PATH
Запускаю еще раз.
Ругается. Рекомендует запускать с ключикам with-pg-config
Говорит, что не может найти файлы.
"checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
--with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header"
Замечаю, что "libpq-fe.h" есть в подкаталоге "include" каталога "C:\Program Files\PostgreSQL\8.4", где установлен сервер PostgreSQL
Мапирую каталог с PostgreSQL на короткий путь без проблелов:
subst X:\ C:\Program Files\PostgreSQL\8.4
Запускаю с ключиками:
gem install pg -- --with-pg="X:\"
Так же ерунда.
А вот если изменить наклон в пути и написать как принято в Unix
gem install pg -- --with-pg="X:/"
то все компилируется.
В программе Ruby пишу require 'pg'
Ругается, что хочет '1.9/pg_ext.so'
"C:/Ruby192/lib/ruby/gems/1.9.1/gems/pg-0.10.1/lib/pg.rb:10:in `require': no such file to load -- 1.9/pg_ext (LoadError)"
Копирую 'pg_ext.so'
Из "C:\Ruby192\lib\ruby\gems\1.9.1\gems\pg-0.10.1\lib\"
в "C:\Ruby192\lib\ruby\gems\1.9.1\gems\pg-0.10.1\lib\1.9\"
Наблюдаю:
"C:/Ruby192/lib/ruby/gems/1.9.1/gems/pg-0.10.1/lib/pg.rb:10:in `require': 126: �� ������ ��������� ������. - C:/Ruby192/lib/ruby/gems/1.9.1/gems/pg-0.10.1/lib/1.9/pg_ext.so (LoadError)"
Видимо, хочет DLL от PostgreSQL или от MinGW или от Ruby DevKit...
Скопировал их все в каталог куда положил "pg_ext.so". Не получается подключить модуль pg из Ruby....
С помощью Visual Studio 2010 Express C++ быстренько создаю приложение для Windows (не консольную, а оконную, это важно).
В WndProc в ветку, выводящую диалог "About" ("О программе") вставляю:
"h = LoadLibrary(TEXT("pg_ext.so"));
if (h != 0)
DialogBox..."
Таким образом, диалог "О программе я увижу только в том случае, если DLL нормально загрузится.
Копирую полученный в Visual Studio тестовый файл в каталог с pg_ext.so
Убираю оттуда все ранее скопированные DLL.
Для чистоты эксперимента делаю командный файл:
set PATH=C:\
test.exe
То есть убираю из путей все и запускаю его.
Ткнувшись в меню "О программе" фактически пытаюсь загрузить DLL pg_ext.so. Поочередно выясняю, что для этой DLL нужны:
"libpq.dll", копирую ее из "C:\Program Files\PostgreSQL\bin", еще раз проверяю через меню "О программе".
Выясняю, что еще нужно: msvcrt-ruby191.dll от Ruby и много файлов от PostgreSQL:
comerr32.dll, k5sprt32.dll, libeay32.dll, libintl-8.dll, ssleay32.dll, gssapi32.dll, krb5_32.dll, libiconv-2.dll.
После того, как я их скопировал в каталог с "pg_ext.so" моя тестовая программа на С++ написанная смогла загрузить DLL "pg_ext.so". Ruby же как ругался так и ругается.