Назад | Перейти на главную страницу

установка gem не перестраивает все экземпляры gem

user@sv1 [/home/user/]# env|grep GEM
GEM_HOME=/home/user/.gems/2.1
GEM_PATH=/home/user/.gems/2.1

user@sv1 [/home/user/]# gem install mysql2
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.18
1 gem installed

that installs mysql2.so in multiple locations:
user@sv1 [/home/user/]# find /home/user/.gems -name mysql2.so
/home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so
/home/user/.gems/2.1/gems/mysql2-0.3.18/ext/mysql2/mysql2.so
/home/user/.gems/2.1/gems/mysql2-0.3.18/lib/mysql2/mysql2.so

user@sv1 [/home/user/]# ls -l /home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so
-rwxr-xr-x 1 user user 64842 mar 18 16:13 /home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so
user@sv1 [/home/user/]# ls -l /home/user/.gems/2.1/gems/mysql2-0.3.18/ext/mysql2/mysql2.so
-rwxr-xr-x 1 user user 64842 mar 18 16:13 /home/user/.gems/2.1/gems/mysql2-0.3.18/ext/mysql2/mysql2.so

now I want to rebuild this extension so I do:
user@sv1 [/home/user/]# gem install mysql2
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.18
1 gem installed

user@sv1 [/home/user/]# ls -l /home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so
-rwxr-xr-x 1 user user 64842 mar 18 16:13 /home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so
user@sv1 [/home/user/]# ls -l /home/user/.gems/2.1/gems/mysql2-0.3.18/ext/mysql2/mysql2.so
-rwxr-xr-x 1 user user 87485 mar 18 16:16 /home/user/.gems/2.1/gems/mysql2-0.3.18/ext/mysql2/mysql2.so

как вы можете видеть, /home/user/.gems/2.1/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.18/mysql2/mysql2.so не был перестроен. что еще хуже, этот файл на самом деле используется, когда "требуется 'mysql2'" в рубиновом коде. Это блокирует перестройку / обновление драгоценного камня. Конечно, я могу решить эту проблему, удалив этот старый файл и затем «установив драгоценный камень», но это приводит к тому, что нужно запоминать много новых переменных и много трудностей для диагностики проблем. Как мне восстановить все файлы драгоценного камня (здесь mysql2.so) с помощью команды gem? А может, это ошибка в "жемчужной" программе?

Эта проблема не является специфической для гема mysql2, поскольку другие гемы ведут себя таким же образом.

Можно сказать, что нет необходимости перестраивать гем, когда его версия не изменилась - но это когда библиотеки, с которыми он связан, были обновлены / изменены (например, libmysqlclient для гем mysql2)

Вы можете искать pristine вариант:

gem pristine mysql -v 0.3.18

или без -v Я считаю, что он будет работать только с самой последней версией, но есть также --all вариант.

Видеть gem help pristine для документации:

Restores installed gems to pristine condition from files located in the gem
cache

С помощью pristine также включает перестройку любых расширений gem, которые повторно связывают двоичные файлы с текущими библиотеками.