Pracuję nad klejnotem, który jest obecnie czystym Ruby, ale opracowałem też szybszy wariant C dla jednej z funkcji. Funkcja jest użyteczna, ale czasami powolna, w czystej Ruby. Powolność będzie miała wpływ tylko na niektórych potencjalnych użytkowników (zależy od tego, jakich funkcji potrzebują i w jaki sposób ich używają), więc warto mieć klejnot z pełnym wdziękiem powrotem do funkcji tylko w języku Ruby, jeśli nie może on skompilować się w systemie docelowym.Powrót do oryginalnych rozszerzeń natywnych do Ruby, jeśli nie jest obsługiwany w instalacji gem
Chciałbym zachować warianty Ruby i C obiektu w jednym klejnocie i zapewnić najlepsze (to znaczy najszybsze) doświadczenie z klejnotu podczas instalacji. To pozwoliłoby mi wspierać najszerszy zestaw potencjalnych użytkowników z jednego mojego projektu. Pozwoliłoby to również, aby klejnoty i projekty zależne od innych osób używały najlepszej dostępnej zależności w systemie docelowym, w przeciwieństwie do wersji o najniższym wspólnym mianowniku dla zgodności.
chciałbym oczekiwać require
awaryjnej przy starcie pojawiają się w głównym lib/foo.rb
pliku po prostu jak ten:
begin
require 'foo/foo_extended'
rescue LoadError
require 'foo/ext_bits_as_pure_ruby'
end
Jednak nie wiem jak dostać się instalacja gem sprawdzić (lub spróbować fail) w przypadku obsługi natywnego rozszerzenia, aby klejnot był instalowany poprawnie, niezależnie od tego, czy może on zbudować 'foo_extended'. Kiedy badałem, jak to zrobić, znalazłem głównie dyskusje sprzed kilku lat, np. http://permalink.gmane.org/gmane.comp.lang.ruby.gems.devel/1479 i http://rubyforge.org/pipermail/rubygems-developers/2007-November/003220.html co sugeruje, że klejnoty Ruby nie obsługują tej funkcji. Nic nowego, więc mam nadzieję, że ktoś z SO ma trochę więcej aktualnej wiedzy?
Moje idealne rozwiązanie byłoby sposobem na wykrycie, przed rozpoczęciem kompilacji rozszerzenia, że docelowa Ruby nie obsługuje (lub po prostu nie chce, na poziomie projektu) C natywnych rozszerzeń. Ale także mechanizm try/catch byłby OK, gdyby nie był zbyt brudny.
Czy to możliwe, jeśli tak, w jaki sposób? Czy też zaleca się opublikowanie dwóch wariantów klejnotów (np. foo
i foo_ruby
), które znajduję, kiedy szukam, wciąż aktualną najlepszą praktykę?
Dwa klejnoty są w porządku, np. Klejnot json występuje w dwóch wariantach: ['json'] (https://rubygems.org/gems/json) (z rozszerzeniem C) i [' json_pure'] (https://rubygems.org/gems/json_pure) (czysty Rubin). – Stefan
@Stefan: W rozmowie, którą połączyłem, autor/maintaner 'json' i' json_pure' najwyraźniej wolałby inaczej. Oprócz dodatkowej pracy, która publikuje dwa warianty klejnotu, zależne projekty, które same mogą być zależne od czegoś innego, w końcu muszą używać najniższego wspólnego mianownika lub muszą również zapewnić dwa warianty tylko po to, aby zarządzać zależnościami, które nie kodują. . Nie nazwałbym tego "w porządku", ale jeśli jest to najlepsze z możliwych, to wszystko, co mogę zrobić. –
@Stefan: Zdecydowanie zamiar Neila związany z projektem jest właściwy. Jego pytanie jest wspaniałe i bardzo ważne, sam jestem zainteresowany odpowiedzią, proszę, upomnij się o to. –