Не прилагайте автоматично актуализации на пакети към стари пакети

Възможно ли е в OSGi да се запазят връзките на пакета дори при рестартиране на системата, където дори ако сега има налична нова, по-висока версия, оставаме със старата? Въпросът е, че ако нещо работи, не искаме да го рискуваме, като свързваме старите пакети към новата зависимост. С други думи, ние се опитваме да изолираме актуализациите, доколкото е възможно, така че актуализацията в даден компонент да не засяга ВСИЧКИ други компоненти (тъй като старите пакети все още ще се използват за задоволяване на вече свързани зависимости)

Като пример, да кажем, че A зависи от B с диапазон [1.0.0, 2.0.0). Разполагаме версия 1.0.0 на B, така че сега A е свързан към B_1.0.0
Сега създаваме пакет C, който зависи от логическа промяна, така че зависи от B с диапазон [1.0.1, 2.0.0). Така че внедряваме B_1.0.1. Сега, ако рестартираме системата, C и A ще бъдат свързани към 1.0.1, тъй като е в обхвата на зависимост и на двете и на теория е "по-добро" съвпадение за A от 1.0.0. Има ли някакъв начин да кажете на OSGi да не прави това и да запази кабелите възможно най-дълго (да речем, докато старият пакет не бъде действително премахнат, в който случай би било добре да отидете с най-високата версия в гамата)

Това, което правим в момента, е да забраняваме диапазони, така че зависимостите са като [1.0.0, 1.0.0]. Това ни дава изолацията на актуализацията, която искаме, но на цената, че основно губим модулността; за да актуализираме зависимост, трябва да актуализираме зависимите, дори ако кодът в зависимите не се е променил. Мисля, че е огромен анти-модел за забрана на обхвати, така че се опитвам да предложа по-добра алтернатива с обхвати, но това ще даде изолацията на актуализацията, от която се нуждаем, и първата ми идея е да забраня повторното окабеляване дори в сесии

Ако има значение, ние не използваме OSGi услуги. Всички те са обикновени пакети


person Hilikus    schedule 12.08.2013    source източник


Отговори (1)


Отговорът на въпроса в първия параграф е просто: да, това е поведението по подразбиране на OSGi. Ако спрете и рестартирате рамката, без да извършвате актуализации на пакети или операции за опресняване на пакети, тогава състоянието на окабеляване ще бъде същото при следващото стартиране.

Въпреки това променяте нещата във втория параграф. Вече имате 2 експортирания на B с различни версии и A и C зависят от него, с неидентични но припокриващи се диапазони. Припокриването е ключът тук. OSGi винаги се опитва да минимизира броя на независимите експорти на един и същ пакет, така че ако имате два пакета, импортиращи с припокриващи се диапазони, тогава рамката ще се опита да ги свърже към една и съща версия, а не към две отделни версии. Версията, която попада в припокриването тук, е 1.0.1, така че и A, и C ще се свържат към 1.0.0.

Не трябва да се опитвате да промените това. Ако пакетът A действително е съвместим с обхвата [1.0.0, 2.0.0), тогава защо се противопоставяте на свързването му към версия 1.0.1?? От друга страна, ако A наистина е съвместим само с версия 1.0.0, а не 1.0.1, тогава трябва да посочите много тесен диапазон, т.е. [1.0.0, 1.0.1).

И накрая... последният ти параграф ме натъжава. Обикновените пакети използват услуги!

person Neil Bartlett    schedule 12.08.2013
comment
Нийл, тогава забрави за факта, че те са неидентични диапазони. Кажете, че и A, и C зависят от B с диапазон [1.0.0, 2.0.0). Въпреки това, когато A беше пуснат, съществуваше само B_1.0.0, така че A се свързва към B_1.0.0. След това C се освобождава заедно с B_1.0.1. Искам окабеляването A-›B_1.0.0 да се запази, както и C-›B_1.0.1. Не искам сега системата да свързва A-›B_1.0.1. Има ли някакъв начин да заключите това, без да забранявате диапазони? съгласен съм, че въз основа на семантичното управление на версиите не би трябвало да е проблем да се използва 1.0.1, но трябва да признаем, че има риск › 0 от промяна на нещо, което работи, с нещо ново - person Hilikus; 12.08.2013
comment
о, това ме прави още по-тъжно, трябва да работя с него всеки ден! - person Hilikus; 12.08.2013
comment
Ако C се добави по-късно, с диапазон от [1.0.0, 2.0), тогава той трябва да вземе версия 1.0.0, тъй като тя вече е свързана към A. Прилага се същата евристика: OSGi иска да минимизира броя на експортиранията на същия пакет. Той също така няма да пренасочи A, докато не бъде принуден да го направи от операция за опресняване на пакета. Следователно C ще използва същото окабеляване като A, което е 1.0.0. - person Neil Bartlett; 13.08.2013