Статьи

Упрощение процесса p2, часть 3: Ассоциированные сайты

В первой части этой серии статей я рассмотрел использование составных репозиториев, чтобы обеспечить способ объединения сайтов обновлений в один URL-адрес для простоты использования и единой точки входа, с которой можно выполнять обновления.

Во второй части я рассказал о том, почему мы перешли от использования набора SDK, для создания которого — используя устаревший метод «просто распаковать в корневую папку затмений» или «dropin» — на единый сайт обновления целевой платформы, чтобы упростить обслуживание и предоставить многократно используемый артефакт для обеспечения как сборки, так и рабочего пространства.


Теперь давайте посмотрим на легкую задачу, которая говорит, что «чем меньше, тем лучше», когда речь идет о том, чтобы указать p2, откуда получать обновления, и что меньше усилий для вашего пользователя при установке всегда выигрывает.

Если это звучит знакомо, я кратко писал об этом в блоге еще в августе . С тех пор мы также добавили быстрый XSLT-скрипт для удаления категории «Без категории», которую Tycho автоматически добавляет для функций, которые перечислены в вашем site.xml, но не связаны с категорией. Хотя это не связано строго с ассоциированными сайтами, речь идет об удобстве использования; в то время как я приветствую желание, чтобы все принадлежало корзине категорий (возможно, потому, что этого требует модель, используемая Tycho), причина, по которой мы предпочли бы скрыть это, состоит в том, чтобы обезопасить представление установки и не вводить людей в заблуждение, предлагая функции, которые не будут работать на их ОС (например, для которых нет порта XulRunner).

Но я отвлекся …

Ассоциированные сайты

В былые времена вы могли расположить
файл
associateSites.xml рядом с вашим site.xml на вашем «классическом» сайте обновлений, и Eclipse Update Manager с радостью прочитал бы этот файл и добавил эти дополнительные сайты в список доступных сайтов обновлений.

Затем появился p2 , и хотя старый способ все еще работал, он больше не был идеальным. Таким образом, новый подход состоял в том, чтобы вставить эти связанные сайты непосредственно в метаданные p2 для сайта, content.xml и artifacts.xml (или content.jar и artifacts.jar).

Этого можно добиться с помощью довольно хакерской аппроксимации — распаковки существующих метаданных (content.jar) и подстановки в информацию в нижней части файла content.xml с использованием сценария ant (см. Цель «add.associate.sites» ниже). ) и список сайтов, которые будут добавлены :

<target name="add.associate.sites" if="associate.sites">
<if>
<and>
<!-- Defined in aggregateSite.properties -->
<isset property="associate.sites" />
<not>
<equals arg1="${associate.sites}" arg2="" />
</not>
</and>
<then>
<if>
<available file="${update.site.source.dir}/content.jar" type="file" />
<then>
<unzip src="${update.site.source.dir}/content.jar" dest="${update.site.source.dir}" />
<delete file="${update.site.source.dir}/content.jar" />
</then>
</if>
<!-- counter variable -->
<var name="associate.sites.0" value="" />
<for param="associate.site" list="${associate.sites}" delimiter=",
">
<sequential>
<var name="associate.sites.0" value="${associate.sites.0}00" />
</sequential>
</for>
<length property="associate.sites.length" string="${associate.sites.0}" />

<loadfile srcfile="${update.site.source.dir}/content.xml" property="content.xml">
<filterchain>
<tailfilter lines="-1" skip="1" />
</filterchain>
</loadfile>
<echo file="${update.site.source.dir}/content.xml" message="${content.xml}" />
<echo file="${update.site.source.dir}/content.xml" append="true"> <references size='${associate.sites.length}'>
</echo>
<for param="associate.site" list="${associate.sites}" delimiter=",
">
<sequential>
<!-- insert into content.xml -->
<echo file="${update.site.source.dir}/content.xml" append="true"> <repository uri='@{associate.site}' url='@{associate.site}' type='0' options='1'/>
<repository uri='@{associate.site}' url='@{associate.site}' type='1' options='1'/>
</echo>
</sequential>
</for>
<echo file="${update.site.source.dir}/content.xml" append="true"> </references>
</repository>
</echo>
<!--
workaround for Tycho bug: uncategorized features in site.xml are put into
"Uncategorized" category, rather than just being uncategorized (hidden)
-->
<copy file="${update.site.source.dir}/content.xml" tofile="${update.site.source.dir}/content.old.xml" overwrite="true" />
<xslt style="remove-uncategorized.xsl" in="${update.site.source.dir}/content.old.xml" out="${update.site.source.dir}/content.xml" />
<zip destfile="${update.site.source.dir}/content.jar" basedir="${update.site.source.dir}" includes="content.xml" />
<delete file="${update.site.source.dir}/content.xml" />
<delete file="${update.site.source.dir}/content.old.xml" />
</then>
</if>
</target>

Таким образом, теперь вместо того, чтобы предлагать пользователям добавлять несколько сайтов обновлений для устранения отсутствующих потенциально зависимостей при установке, мы можем автоматически добавлять эти дополнительные сайты одновременно с добавлением единого URL-адреса для JBoss Tools. Теперь дополнительные сайты должны быть перечислены только для справки , но никаких дополнительных усилий со стороны пользователя не требуется.

BONUS HACK : чтобы снова добавить сайт, который уже может быть в списке (но отключен), и на этот раз он обязательно будет включен, вы можете добавить дополнительную косую черту в URL. Таким образом, http://download.eclipse.org/birt/update-site/2.6 становится http://download.eclipse.org//birt/update-site/2.6/ , и когда p2 видит новый сайт, он добавляет новый сайт (вместо того, чтобы игнорировать его, потому что он уже присутствует, но отключен. Опять победа.

В качестве альтернативы, вы можете разыграть тайное заклинание, используя файл p2.inf в корневой папке вашей функции или папку META-INF / плагина, чтобы добавить эти дополнительные обязательные сайты … или выполнить любую необходимую вам обработку . Я не уверен, поддерживает ли Tycho это, или насколько полно PDE поддерживает чтение этой информации. Есть образец кода? Отправьте это мне как комментарий ниже или через твиттер на @nickboldt . Благодаря!


В четвертой части я немного расскажу о том, как предотвратить сборку вашего продукта из неофициальных источников, и предварительно загрузлю ваш продукт официальными сайтами, с которых можно получать обновления. Потому что важно сбалансировать простоту использования с предотвращением неподдерживаемых функций. SPOILER ALERT : может содержать p2.inf инструкции.

 

От http://divby0.blogspot.com/2011/02/simplifying-p2-process-part-3-associate.html