вторник, 30 августа 2011 г.

Замена файлов при установке пакета расширения

Вы уже знаете, что функционал C1 можно расширить с помощью пакетов (модулей). Я уже писал про Package Creator и то, как с его помощью можно создавать свои собственные пакеты расширения.

Если вы уже пробовали их создавать, то возможно сталкивались с тем, что при установке пакета, который копирует файлы на сайт, установка может не состоятся из-за того, что один или несколько копируемых файлов уже существуют на сайте по указанному пути.


Дело в том, что установка файлов из пакета, созданного в Package Creator, по умолчанию не допускает перезапись уже существующих файлов. Однако это легко можно исправить. Для этого нам нужно изменить одно значение в одном файле внутри пакета.

Но сначала немного теории.

Структура пакета расширения

Пакет расширения - это обычный ZIP архив. Минимальное требование к такому архиву - чтобы он мог считаться именно "пакетом расширения C1" - наличие в корне файла install.xml.

Этот файл:
  • описывает сам пакет
  • предписывает что куда ставить
В остальном, в архив можно добавлять папки, подпапки и файлы как угодно.

Самой установкой пакетов в C1 занимаются плагины, т.н. "фрагментные инсталляторы" (fragment installers), которые различаются по типу в зависимости от того, что именно они устанавливают. Например, файлы и папки устанавливает один фрагментарный инсталлятор, типы данных и сами данные этих типов - другой, и т.д.

Когда вы создаете пакет при помощи Package Creator'а, то он формирует правильный install.xml и указывает нужные фрагментные инсталляторы. Вот именно XML-элементы, представляющие фрагментные инсталляторы в install.xml, нас и интересуют.

Они находятся в разделе /mi:PackageInstaller/mi:PackageFragmentInstallers/ файла install.xml. Нам же нужен фрагментный инсталлятор файлов и папок.

Разрешение перезаписи файлов

Итак, чтобы разрешить перезапись файлов:
  1. Извлеките и откройте файл install.xml из пакета (или редактируйте его прямо там, если архиватор позволяет.)
  2. В разделе /mi:PackageInstaller/mi:PackageFragmentInstallers/ найдите элемент mi:Add со значением "Composite.Core.PackageSystem.PackageFragmentInstallers.FilePackageFragmentInstaller, Composite" для атрибута installerType. Это нужный нам фрагментный инсталлятор файлов и папок. 
  3. Под его дочерним элементом Files находится список копируемых файлов, представленных элементом File. Найдите тот файл, который вы хотите перезаписывать при установке.
  4. Замените значение атрибута allowOverwrite с false на true.
  5. Сохраните install.xml и добавьте его обратно в пакет (с заменой старого файла).
<?xml version="1.0" standalone="yes"?>
<mi:PackageInstaller xmlns:mi="http://www.composite.net/ns/management/packageinstaller/1.0">
  <!-- остальной XML -->
  <mi:PackageFragmentInstallers>
    <mi:Add installerType="Composite.Core.PackageSystem.PackageFragmentInstallers.FilePackageFragmentInstaller, Composite" uninstallerType="Composite.Core.PackageSystem.PackageFragmentInstallers.FilePackageFragmentUninstaller, Composite">
      <Files>
        <File sourceFilename="~\MyFile.xml" targetFilename="~\MyFile.xml" allowOverwrite="true" />
      </Files>
    </mi:Add>
    <!-- остальной XML -->
  </mi:PackageFragmentInstallers>
</mi:PackageInstaller>

В отличие от файлов, папки (дочерний элемент Directories и ниже) добавляются Package Creator'ом с разрешением на перезапись.

Комментариев нет:

Отправить комментарий