Вы уже знаете, что функционал 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. Нам же нужен фрагментный инсталлятор файлов и папок.
Разрешение перезаписи файлов
Итак, чтобы разрешить перезапись файлов:
В отличие от файлов, папки (дочерний элемент Directories и ниже) добавляются Package Creator'ом с разрешением на перезапись.
Если вы уже пробовали их создавать, то возможно сталкивались с тем, что при установке пакета, который копирует файлы на сайт, установка может не состоятся из-за того, что один или несколько копируемых файлов уже существуют на сайте по указанному пути.
Дело в том, что установка файлов из пакета, созданного в Package Creator, по умолчанию не допускает перезапись уже существующих файлов. Однако это легко можно исправить. Для этого нам нужно изменить одно значение в одном файле внутри пакета.
Но сначала немного теории.
Структура пакета расширения
Пакет расширения - это обычный ZIP архив. Минимальное требование к такому архиву - чтобы он мог считаться именно "пакетом расширения C1" - наличие в корне файла install.xml.
Этот файл:
- описывает сам пакет
- предписывает что куда ставить
Самой установкой пакетов в C1 занимаются плагины, т.н. "фрагментные инсталляторы" (fragment installers), которые различаются по типу в зависимости от того, что именно они устанавливают. Например, файлы и папки устанавливает один фрагментарный инсталлятор, типы данных и сами данные этих типов - другой, и т.д.
Когда вы создаете пакет при помощи Package Creator'а, то он формирует правильный install.xml и указывает нужные фрагментные инсталляторы. Вот именно XML-элементы, представляющие фрагментные инсталляторы в install.xml, нас и интересуют.
Они находятся в разделе /mi:PackageInstaller/mi:PackageFragmentInstallers/ файла install.xml. Нам же нужен фрагментный инсталлятор файлов и папок.
Разрешение перезаписи файлов
Итак, чтобы разрешить перезапись файлов:
- Извлеките и откройте файл install.xml из пакета (или редактируйте его прямо там, если архиватор позволяет.)
- В разделе /mi:PackageInstaller/mi:PackageFragmentInstallers/ найдите элемент mi:Add со значением "Composite.Core.PackageSystem.PackageFragmentInstallers.FilePackageFragmentInstaller, Composite" для атрибута installerType. Это нужный нам фрагментный инсталлятор файлов и папок.
- Под его дочерним элементом Files находится список копируемых файлов, представленных элементом File. Найдите тот файл, который вы хотите перезаписывать при установке.
- Замените значение атрибута allowOverwrite с false на true.
- Сохраните install.xml и добавьте его обратно в пакет (с заменой старого файла).
<?xml version="1.0" standalone="yes"?>
<mi:PackageInstaller xmlns:mi="http://www.composite.net/ns/management/packageinstaller/1.0">
<!-- остальной XML -->
<!-- остальной 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'ом с разрешением на перезапись.
Комментариев нет:
Отправить комментарий