Я пытаюсь написать грабли, которые могут выполнять управляемый поиск в системе пользователя для определенных системных библиотек. Основная идея достаточно проста (в полупсевдокоде):
def find_lib names, paths
foreach name, path do
return { :name => name, :path => path } if File.exists? File.join(path, name)
end
return false
end
find_lib ['mylib1.2', 'mylib12'], ['/usr/lib', '/usr/local/lib']
Моя фактическая реализация немного более элегантна, но это показывает основную идею. Тем не менее, я хотел бы сделать эту ОС независимой, которая бросает несколько больших гаечных ключей в механизмы. Каждая операционная система имеет потенциально разные префиксы и расширения для библиотеки. Например, разделяемая библиотека может быть «.dll», «.so» или «.dylib» в зависимости от текущей системы. До сих пор я придумал решение, которое включает в себя создание карты префиксов / расширений на основе в текущей операционной системе:
settings = {}
settings[:dylib_ext] = OS.windows? && ".dll" ||
OS.mac? && ".dylib" ||
".so"
Это работает в некоторой степени, хотя оно охватывает только случай динамической библиотеки, а также опирается на внешний гем «ОС», которого я пытался избежать.
Кто-нибудь знает лучший способ выполнения такой задачи, или это решаемая проблема (возможно, с помощью другого драгоценного камня)? Главное, что меня беспокоит, это карта, которая может стать очень громоздкой (не говоря уже о том, что определение правильной операционной системы в лучшем случае довольно утомительно, особенно если вы добавляете cygwin или mingw).
После некоторых размышлений кажется, что я был слишком конкретен в отношении текущей операционной системы пользователя, в то время как я действительно хотел определить, какие функциональные возможности поддерживает система пользователя … Подход, который я в итоге использовал, заключался в определении список возможных комбинаций префикса / суффикса, и проверить каждую из них.
Других решений пока нет …