В Равноденствии возможно для маркировки пакета OSGi, как запущено с его содержания p2.inf функции?

У меня есть функция Eclipse, которая включает несколько пакетов. Я хочу сказать p2 отмечать один из тех пакетов, как запущено, когда функция установлена. Это - возможное использование пакетов собственный META-INF/p2.inf как так,

instructions.configure = markStarted(started: true)

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

Некоторое исследование привело меня к этому документу, который предлагает, чтобы было возможно переместить настраивать инструкции в содержание p2.inf функции. Я попробовал все очевидные вещи как,

units.0.id = 
units.0.instructions.configure = \
  org.eclipse.equinox.p2.touchpoint.eclipse.markStarted(started: true)

но до сих пор ни одна из перестановок, которые я попробовал, не имеет эффекта: как ни в чем происходит, пакет не отмечен, как запущено, и ни о каких ошибках не сообщают).

Любые указатели очень приветствовались бы. С Равноденствием Eclipse Galileo (3.5.2)... ответы, касающиеся Helios, также был бы очень полезен.

8
задан Miles Sabin 19 June 2010 в 21:21
поделиться

1 ответ

Записи "units.#." p2.inf создают новый Installable Unit, они не изменяют другие существующие IU.

По сути, вам нужно создать целый фрагмент Устанавливаемого блока. Этот фрагмент содержит соответствующие инструкции и прикрепляется к IU вашего пакета. Затем вам нужно добавить требование из вашей функции в этот новый IU.

PDE/Build делает это автоматически при создании продуктов. Вы можете увидеть сгенерированный p2.inf, создав небольшую сборку продукта rcp, которая имеет начальный уровень для вашей связки.
Сгенерированный p2.inf в сборке продукта будет buildDirectory/features/org.eclipse.pde.build.container.feature/product/p2.inf

Вот пример, который я изменил из сборки, устанавливающей начальный уровень для org.eclipse.equinox.common. $version$ будет заменена на версию из функции, к которой принадлежит p2.inf. Обратите внимание на "hostRequirements", который указывает на пучок, фрагментом которого мы являемся.

#create a requirement on the IU fragment we are creating
requires.2.namespace=org.eclipse.equinox.p2.iu
requires.2.name=configure.org.eclipse.equinox.common
requires.2.range=[$version$,$version$]
requires.2.greedy=true

#create a IU frament named configure.org.eclipse.equinox.common
units.0.id=configure.org.eclipse.equinox.common
units.0.version=$version$
units.0.provides.1.namespace=org.eclipse.equinox.p2.iu
units.0.provides.1.name=configure.org.eclipse.equinox.common
units.0.provides.1.version=$version$
units.0.instructions.install=installBundle(bundle:${artifact});
units.0.instructions.uninstall=uninstallBundle(bundle:${artifact});
units.0.instructions.unconfigure=setStartLevel(startLevel:-1);markStarted(started:false);
units.0.instructions.configure=setStartLevel(startLevel:2);markStarted(started:true);
units.0.hostRequirements.1.namespace=osgi.bundle
units.0.hostRequirements.1.name=org.eclipse.equinox.common
units.0.hostRequirements.1.range=[3.6.0.v20100503,3.6.0.v20100503]
units.0.hostRequirements.1.greedy=false
units.0.hostRequirements.2.namespace=org.eclipse.equinox.p2.eclipse.type
units.0.hostRequirements.2.name=bundle
units.0.hostRequirements.2.range=[1.0.0,2.0.0)
units.0.hostRequirements.2.greedy=false
units.0.requires.1.namespace=osgi.bundle
units.0.requires.1.name=org.eclipse.equinox.common
units.0.requires.1.range=[3.6.0.v20100503,3.6.0.v20100503]
units.0.requires.1.greedy=false

Ответы на вопросы:

  1. 0's, 1's, 2's

    Эти числа несколько произвольны, они служат только для отделения одного набора свойств (requires или units или любого другого) от другого. В requires здесь используется '2' просто потому, что я скопировал его из большого p2.inf, который был сгенерирован pde.build, и забыл изменить его, как я сделал это с units.0.

  2. Нужно ли все это?

    Да. Второй hostRequirements в type=bundle необходим. В Helios, за исключением фрагментов трансляции, только один фрагмент может быть присоединен к IU. Обычно имеется IU по умолчанию, который устанавливает уровень запуска по умолчанию для всех osgi bundles. Для того чтобы наш пользовательский фрагмент был выбран вместо фрагмента по умолчанию, он должен иметь более высокую "специфичность", которая представляет собой количество удовлетворенных требований хоста.

    Для "install"

    units.0.instructions.install=installBundle(bundle:${artifact}); units.0.instructions.uninstall=uninstallBundle(bundle:${artifact});

    Команды instructions.install и instructions.uninstall относятся к фазам процесса p2. installBundle и uninstallBundle относятся к установке/удалению в смысле OSGi. Ваш пакет должен быть установлен в систему OSGi, прежде чем вы сможете сделать что-либо еще. В основном это подразумевает добавление его в файлы config.ini или org.eclipse.equinox.simpleconfigurator/bundles.info.

    Большинство инсталляций p2 уже содержат IU конфигурации по умолчанию, который устанавливает и задает уровень запуска по умолчанию (4) для пакетов. Однако в настоящее время только один фрагмент конфигурации может быть применен к каждой связке, поэтому, когда вы добавляете свой собственный фрагмент, то он больше не будет применяться к вашей связке.

  3. hostRequirements. На странице фрагментов устанавливаемых модулей только описывается, что такое фрагмент, и нет ссылки на то, как его создать. Это лишь слегка упоминается на странице Настройка метаданных, но не объясняется.

    Документация, в вики есть куча материала в категории p2. страница touchpoint instructions может быть интересна. Есть некоторая помощь на help.eclipse.org, но в целом, я думаю, что это немного более продвинутое решение, чем то, для которого есть документация.

9
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: