пятница, 15 марта 2013 г.

Assemblies hell in mono

Столкнулся с такой проблемой: monodevelop, при раскрытии ссылки References проекта не находил некоторые системные сборки, хотя они были установлены. Когда я их начинал добавлять через add reference, то в packages их почему-то не было, хотя в /usr/lib/pkgconfig соответсвующие *.pc файлы присутствовали. Стало это происходить, когда я пытался скомпилировать системные библиотеки из исходников (gtk-sharp, gnome-sharp и прочие).

Сначала я думал, что просто что-то сломал в системе и решил полностью переустановить mono. Сделал aptitude purge mono-runtime, удалил все файлы /usr/lib/mono, /usr/local/lib/mono, а также некоторые *.pc файлы, относящиеся к gtk, которые я нашел в /usr/lib/pkgconfig и потом установил все заново (sudo aptitude install monodevelop mono-gmcs), но после переинсталляции все стало еще хуже: некоторые сборки, ссылающиеся на gtk-sharp почему-то вообще перестали загружаться, сообщая что mono заресолвило пакадж gtk-sharp как gtk-sharp-3-0.pc (хотя такого файла не должно было быть в системе!) и ищет библиотеки по путям, которые я давно удалил.

Я все перерыл, пытаясь найти этот файл, но так и не нашел. Так как в чудеса я не верю, то возникло предположение, что где-то существует кэш, в который mono скинуло ссылки на старые assemblies и теперь подтягивает их из кэша.

Залез в исходники mono и после просмотра обнаружил, что при распознавании сборок действительно сначала данные тянутся из файлика ~/.config/xbuild/pkgconfig-cache-2.xml и только если там данных нет, то тогда уже смотрятся директории /usr/lib/pkgconfig и другие

Я грохнул этот файл и все мои проблемы разрешились.

Соответсвенно, получается такое правило: если вы собираете mono или библиотеки mono из исходников, после каждого make install грохайте файлик ~/.config/xbuild/pkgconfig-cache*.xml, иначе можете получить проблемы с подгрузкой новых сгенереных сборок