Пример разработки одного пакета
Пример PUASample.msi — это пример пакета установщика Windows с двойной целью 5.0, который может быть установлен в контексте установки на пользователя или на компьютер в Windows Server 2008 R2 и Windows 7. Этот пример пакета следует рекомендациям по разработке, описанным в статье "Разработка отдельных пакетов".
Получение копии примера
Копия этого примера и редактор таблицы базы данных установщика Windows, Orca.exe, находятся в компонентах пакета SDK для Windows для разработчиков установщика Windows. Пример и редактор таблиц предоставляются в комплекте средств разработки программного обеспечения Windows для Windows Server 2008 R2 и Windows 7 в качестве файлов установки установщика Windows PUASample1.msi и Orca.msi.
Требования к системе
Редактор базы данных Orca.exe требует Windows Server 2008 R2 и более ранних версий и Windows 7 и более ранних версий. Пакет двойного назначения PUASample1.msi можно установить в контексте установки на компьютер или на пользователя в Windows Server 2008 R2 и Windows 7. PUASample1.msi можно установить только в контексте на компьютере в Windows Server 2008 и более ранних версиях и Windows Vista и более ранних версиях. Редактор базы данных можно установить для проверки содержимого PUASample1.msi без установки примера. Чтобы установить пример или пакеты редактора, убедитесь, что политика DisableMSI не задана для значения, которое блокирует установку приложений.
Определение пакета двойного назначения
Пакеты двойного назначения должны инициализировать значение свойства MSIINSTALLPERUSERER ДО 1. Это определяет пакет как способный устанавливаться в контексте для каждого компьютера или пользователя в Windows Server 2008 R2 и Windows 7. Задайте свойство MSIINSTALLPERUSER в пакете только в том случае, если оно было написано в соответствии с рекомендациями по разработке отдельных пакетов, и если вы планируете предоставить пользователям возможность установить пакет в контексте каждого пользователя или на компьютер. Пакет двойного назначения также должен инициализировать значение свойства ALLUSERS до 2. Это указывает на пользователя в качестве контекста установки по умолчанию для приложения. Если значение свойства ALLUSERS имеет значение, отличное от 2, установщик Windows игнорирует свойство MSIINSTALLPERUSERERER.
Используйте редактор базы данных установщика Windows, например Orca.exe, для изучения содержимого PUASample1.msi. Таблица свойств в примере пакета содержит следующие две записи.
Таблица свойств (частично)
Свойство | Значение |
---|---|
ALLUSERS | 2 |
MSIINSTALLPERUSERER | 1 |
Настраиваемое диалоговое окно для контекста установки
Пользовательский интерфейс примера пакета содержит пример настраиваемого диалогового окна VerifyReadyDialog, который позволяет пользователям выбирать контекст установки для каждого пользователя или на компьютер во время установки. Таблица диалогового окна содержит запись, описывающую диалоговое окно VerifyReadyDialog. Значение, введенное в поле "Атрибуты", равно 39, так как в этом диалоговом окне используется msidbDialogAttributesVisible (1), msidbDialogAttributesModal (2), msidbDialogAttributesMinimize (4) и msidbDialogAttributesTrackDiskSpace (32). В строке заголовка диалогового окна отображается название, заданное значением свойства ProductName .
Таблица диалоговых окон (частичное)
Диалоговое окно | HCentering | VCentering | Ширина | Высота | Атрибуты | Заголовок | Control_First | Control_Default | Control_Cancel |
---|---|---|---|---|---|---|---|---|---|
ПроверкаReadyDialog | 50 | 50 | 480 | 280 | 39 | [ProductName] | InstallPerUser | Следующий | Отменить |
Таблица control содержит записи для элементов управления , отображаемых в диалоговом окне VerifyReadyDialog. В диалоговом окне отображаются элементы управления PushButton и элемент управления Text . Все элементы управления используют атрибуты элемента управления msidbControlAttributesEnabled (2) и msidbControlAttributesVisible (1). Элемент управления InstallPerMachine также использует атрибут элемента управления ElevationShield, msidbControlAttributesElevationShield (8388608.) Этот атрибут элемента управления добавляет в элемент управления InstallPerMachine значок повышения прав пользователей (UAC) и сообщает пользователю, что учетные данные UAC необходимы для установки приложения в контексте каждого компьютера. Значение в текстовом поле таблицы Control — это текстовый стиль и текст, отображаемый элементом управления. Дополнительные сведения о добавлении текста в элемент управления с помощью предопределенных стилей см. в описании поля "Текст" в разделе "Элемент управления".
Таблица управления (частично)
Диалог_ | Элемент управления | Тип | Атрибут | Text | Control_Next |
---|---|---|---|---|---|
ПроверкаReadyDialog | Отменить | Кнопка | 3 | {\Tahoma10}&Cancel | Следующий |
ПроверкаReadyDialog | Предыдущий | Кнопка | 3 | {\Tahoma10}<<&Назад | Отменить |
ПроверкаReadyDialog | Следующий | Кнопка | 3 | {\Tahoma10}&next >> | InstallPerUser |
ПроверкаReadyDialog | Text2 | Text | 3 | Готовы ли вы завершить приостановленную установку? | |
ПроверкаReadyDialog | InstallPerUser | Кнопка | 3 | {\Tahoma10} Установка только для &me | InstallPerMachine |
ПроверкаReadyDialog | InstallPerMachine | Кнопка | 8388611 | {\Tahoma10} Установка для &все | Предыдущий |
ПроверкаReadyDialog | Отменить | Кнопка | 3 | {\Tahoma10}&Cancel | Следующий |
Таблица ControlEvent указывает controlEvents или действия, установщик выполняется при взаимодействии пользователя с элементом управления. Когда пользователь активирует push-кнопку InstallPerUser, пользовательский интерфейс отображает диалоговое окно OutOfDisk, если свойство OutOfDiskSpace равно 1, задает значение свойства MSIINSTALLPERUSERERER значение 1, задает значение свойства ALLUSERS равным 2, задает для свойства MSIFASTINSTALL значение 1 и возвращает . Так как свойство MSIFASTINSTALL задано, точка восстановления системы не создается для установки. Когда пользователь активирует pushbutton InstallPerMachine, пользовательский интерфейс отображает диалоговое окно OutOfDisk, если свойство OutOfDiskSpace равно 1, задает значение свойства ALLUSERS значение 1 и возвращает значение.
Таблица ControlEvent (частично)
Диалог_ | Управления_ | Мероприятие | Аргумент | Condition | Порядок |
---|---|---|---|---|---|
ПроверкаReadyDialog | InstallPerUser | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
ПроверкаReadyDialog | InstallPerUser | EndDialog | Возврат | OutOfDiskSpace <> 1 | 5 |
ПроверкаReadyDialog | InstallPerUser | [MSIINSTALLPERUSER] | 1 | 1 | 2 |
ПроверкаReadyDialog | InstallPerUser | [ALLUSERS] | 2 | 1 | 3 |
ПроверкаReadyDialog | InstallPerMachine | SpawnDialog | OutOfDisk | OutOfDiskSpace = 1 | 1 |
ПроверкаReadyDialog | InstallPerMachine | EndDialog | Возврат | OutOfDiskSpace <> 1 | 3 |
ПроверкаReadyDialog | InstallPerMachine | [ALLUSERS] | 1 | 1 | 2 |
ПроверкаReadyDialog | InstallPerUser | [MSIFASTINSTALL] | 1 | 1 | 4 |
Элемент управления InstallPerUser должен быть удален из пользовательского интерфейса любой установки с помощью версии установщика Windows до установщика Windows установщика Windows 5.0. Таблица ControlCondition в примере пакета содержит четыре записи, которые отключают и скрывают элемент управления InstallPerUser, если текущая версия меньше установщика Windows 5.0. В таблице используется значение свойства VersionMsi и синтаксис условной инструкции для определения этого условия. Действие, указанное в поле Action, выполняется только в том случае, если оператор в поле "Условие" имеет значение true.
Таблица ControlCondition (частично)
Диалог_ | Управления_ | Действие | Condition |
---|---|---|---|
ПроверкаReadyDialog | InstallPerUser | Enable | VersionMsi >= "5.00" |
ПроверкаReadyDialog | InstallPerUser | Disable | VersionMsi < "5.00" |
ПроверкаReadyDialog | InstallPerUser | Показать | VersionMsi >= "5.00" |
ПроверкаReadyDialog | InstallPerUser | Скрыть | VersionMsi < "5.00" |
Указание структуры каталогов
Используйте редактор базы данных для проверки таблицы каталогов PUASample1.msi. Запись таблицы каталогов с пустой строкой в поле Directory_Parent представляет корневой каталог деревьев исходного и целевого каталогов. Если свойство TARGETDIR не определено, установщик задает значение во время установки значение свойства ROOTDRIVE. Если свойство SourceDir не определено, установщик устанавливает его значение в расположение каталога, содержащего пакет установщика Windows (MSI-файл).) Имена каталогов указываются с помощью короткого|длинного формата.
Таблица каталогов (частичная)
Directory | Directory_Parent | DefaultDir |
---|---|---|
TARGETDIR | SourceDir | |
ProgramFilesFolder | TARGETDIR | . |
ProgramMenuFolder | TARGETDIR | . |
INSTALLLOCATION | MyVendor | Пример1|MSDN-PUASample1 |
MyVendor | ProgramFilesFolder | Msft|Microsoft |
В источнике эта таблица каталогов разрешает следующие пути к каталогу.
- \[SourceDir\]\\Msft\\Sample1 \[SourceDir\]
В целевой папке таблица каталогов разрешает пути в следующей таблице. Установщик задает значения свойств ProgramFilesFolder и ProgramMenuFolder в расположения, которые зависят от контекста установки и являются ли система 32-разрядными или 64-разрядными версиями Windows Server 2008 R2 и Windows 7. Пути к целевым папкам зависят от того, выбирает ли пользователь установку на отдельный пользователь или на компьютер.
Контекст установки | Системные | Примеры путей |
---|---|---|
На компьютер | Windows Server 2008 R2 и Windows 7 32-разрядная версия |
%ProgramFiles%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Program |
На компьютер | Windows Server 2008 R2 и Windows 7 64-разрядная версия |
%ProgramFiles(x86)%\Msft\Sample1 %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Program |
Для каждого пользователя | Windows Server 2008 R2 и Windows 7 32-разрядная или 64-разрядная версия |
%USERPROFILE%\AppData\Local\Program\Msft\Sample1 %APPDATA%\Microsoft\Windows\Пуск меню\Программы |
Приложения для каждого пользователя должны храниться в вложенных папках в папке "Программы", указанной значением свойства ProgramFilesFolder . Как правило, путь к приложению принимает следующую форму.
%LOCALAPPDATA%\Program\ISV name\AppName.
Данные конфигурации для каждого пользователя должны храниться в папке "Программы", указанной значением свойства ProgramMenuFolder . Как правило, эта папка расположена по следующему пути.
%APPDATA%\Microsoft\Windows\Пуск меню\Программы
При установке 32-разрядных компонентов пакета установщика Windows используйте свойство ProgramFilesFolder и CommonFilesFolder в таблице каталогов. При установке 64-разрядных компонентов пакета установщика Windows используйте свойства ProgramFiles64Folder и CommonFiles64Folder. Если приложение содержит 32-разрядные и 64-разрядные версии одного компонента с одинаковым именем, убедитесь, что эти версии сохраняются в разных каталогах или присваивают им разные имена.
В следующей таблице каталогов представлен пример макета каталога, совместимого с пакетом, который включает 32-разрядные и 64-разрядные компоненты и включает некоторые компоненты, которые совместно используются в приложениях.
Directory | Directory_Parent | DefaultDir |
---|---|---|
TARGETDIR | SourceDir | |
ProgramFilesFolder | TARGETDIR | .:P rog32 |
ProgramFiles64Folder | TARGETDIR | .:P rog64 |
CommonFilesFolder | TARGETDIR | .:Share32 |
CommonFiles64Folder | TARGETDIR | .:Share64 |
ProgramMenuFolder | TARGETDIR | .:Sample1|MSDN-PUASample1 |
INSTALLLOCATION | MyVendor | Пример1|MSDN-PUASample1 |
INSTALLLOCATIONX64 | Поставщикx64 | Пример1|MSDN-PUASample1 |
SHAREDLOCATION | ShVendor | Пример1|MSDN-PUASample1 |
SHAREDLOCATIONX64 | ShVendorx64 | Пример1|MSDN-PUASample1 |
MyVendor | ProgramFilesFolder | Msft|Microsoft |
Поставщикx64 | ProgramFiles64Folder | Msft|Microsoft |
ShVendor | CommonFilesFolder | Msft|Microsoft |
ShVendorx64 | CommonFiles64Folder | Msft|Microsoft |
Shrx86 | SHAREDLOCATION | Компоненты x32|32-разрядные |
Shrx64 | SHAREDLOCATIONX64 | Компоненты x64|64-разрядные |
Binx86 | INSTALLLOCATION | Компоненты x32|32-разрядные |
Binx64 | INSTALLLOCATIONX64 | Компоненты x64|64-разрядные |
App32 | Binx86 | myapp|unshared 32-разрядные компоненты |
App64 | Binx64 | myapp|unshared 64-разрядные компоненты |
Share32 | Shrx86 | общие|общие 32-разрядные компоненты |
Share64 | Shrx64 | общие|общие 64-разрядные компоненты |
В источнике эта таблица каталогов разрешает следующие пути к каталогу.
- \[SourceDir\]Prog32\\Msft\\Sample1\\x32\\myapp \[SourceDir\]Share32\\Common Files\\Msft\\Sample1\\x32\\shared \[SourceDir\]Prog64\\Msft\\Sample1\\x64\\myapp \[SourceDir\]Share64\\Common Files\\Msft\\Sample1\\x64\\shared \[SourceDir\]Sample1
В целевой папке эта таблица каталогов разрешает следующие пути к каталогу. Целевые пути зависят от контекста установки и системы.
Контекст установки | Системные | Примеры путей |
---|---|---|
На компьютер | Windows Server 2008 R2 и Windows 7 32-разрядная версия |
%ProgramFiles%\Msft\Sample1\x32\myapp %ProgramFiles%\Common Files\Msft\Sample1\x32\shared %ProgramFiles(x86)%\Msft\Sample1\x64\myapp %ProgramFiles(x86)%\Common Files\Msft\Sample1\x64\shared %ProgramData%\Microsoft\Windows\Start Menu\Program\Sample1 |
На компьютер | Windows Server 2008 R2 и Windows 7 64-разрядная версия |
%ProgramFiles(x86)%\Msft\Sample1\x32\myapp %ProgramFiles(x86)%\Common Files\Msft\Sample1\x32\shared %ProgramFiles%\Msft\Sample1\x64\myapp %ProgramFiles%\Common Files\Msft\Sample1\x64\shared %ProgramData%\Microsoft\Windows\Start Menu\Program\Sample1 |
Для каждого пользователя | Windows Server 2008 R2 и Windows 7 32-разрядная или 64-разрядная версия |
%LOCALAPPDATA%\Program\Msft\Sample1\x32\myapp %LOCALAPPDATA%\Program\Common\Msft\Sample1\x32\shared %LOCALAPPDATA%\Program\Msft\Sample1\x64\myapp %LOCALAPPDATA%\Program\Common\Msft\Sample1\x64\shared %APPDATA%\Microsoft\Windows\Start Menu\Program\Sample1 |
Регистрация приложения
PuASample.msi добавляет подраздел в раздел реестра путей приложений для приложения и выполняет регистрации, которые позволяют сохранять сведения о приложении в реестре под этим разделом. Дополнительные сведения о путях приложений и регистрации приложений см. в разделе "Путь к приложениям" и "Регистрация приложений" в разделе "Расширяемость оболочки" руководства разработчика оболочки. Во время установки пользователь принимает решение установить приложение в контексте установки каждого пользователя или на компьютер. Во время разработки пакета двойного назначения разработчик пакета не может знать, следует ли выполнять регистрацию в HKEY_LOCAL_MACHINE или HKEY_CURRENT_USER ключах.
Разработчик пакета определяет идентификатор файла исполняемого файла приложения в поле "Файл" таблицы файлов .
Таблица файлов (частичная)
Файл | Компонент_ | FileName | FileSize | Версия | Язык | Атрибуты | Sequence |
---|---|---|---|---|---|---|---|
MyAppFile | ProductComponent | PUASAMP1.EXE|PUASample1.exe | 81920 | 0 | 1 |
Значения, сохраненные в реестре, можно указать в поле "Значение" таблицы реестра в виде строки форматирования . Используйте идентификатор файла, определенный в поле "Файл" таблицы "Файл " и соглашение [#filekey] типа Formatted, чтобы указать значение по умолчанию для раздела реестра путей приложений. Действие INSTALL верхнего уровня выполняет действия в таблице InstallExecuteSequence. После завершения действий CostInitialize FileCost и InstallFinalize в этой таблице установщик Windows заменяет отформатированную подстроку [#MyAppFile] в таблице реестра полным путем к файлу приложения.
В примере определяется настраиваемое свойство RegRoot, которое содержит расположение корневого ключа и использует настраиваемое действие для сброса значения свойства, если пользователь выбирает установку на компьютер. Используйте настраиваемое свойство RegRoot в любых отформатированных строковых значениях, ссылающихся на корневое расположение. В таблице свойств пакет PUASample.msi определяет настраиваемое свойство и задает значение RegRoot для HKCU. Это инициализирует значение свойства для контекста установки для каждого пользователя, рекомендуемого контекста по умолчанию для пакетов двойного назначения.
Таблица свойств (частично)
Свойство | Значение |
---|---|
RegRoot | HKCU |
В таблице CustomAction пакет определяет настраиваемое действие с именем Set_RegRoot_HKLM. Значение в поле Type определяет это как стандартное пользовательское действие типа 51 . Значение полей Source и Target в таблице CustomAction зависит от типа пользовательского действия. Дополнительные сведения о стандартных типах пользовательских действий см. в разделе "Типы настраиваемых действий". Поле Source для пользовательского действия Set_RegRoot_HKLM указывает, что значение свойства RegRoot. Если установщик выполняет Set_RegRoot_HKLM пользовательское действие, это сбрасывает значение свойства RegRoot в HKLM.
Таблица CustomAction (частично)
Действие | Тип | Оригинал | Target |
---|---|---|---|
Set_RegRoot_HKLM | 51 | [RegRoot] | HKLM |
Действие INSTALL верхнего уровня выполняет действия в таблице InstallExecuteSequence в последовательности, указанной в поле последовательности этой таблицы. Значение, созданное в поле "Последовательность" для пользовательского действия Set_RegRoot_HKLM (1501), указывает, что это настраиваемое действие выполняется после действия InstallInitialize (1500) и перед действием ProcessComponents (1600.) Эта последовательность гарантирует, что запись для Set_RegRoot_HKLM настраиваемого действия вычисляется во время установки. Дополнительные сведения о рекомендуемой последовательности действий в таблице InstallExecuteSequence см. в разделе " Рекомендуемая установкаExecuteSequence ". Синтаксис условной инструкции, созданный в поле "Условие", указывает, что действие Set_RegRoot_HKLM выполняется только в том случае, если значение свойства ALLUSERS равно 1 во время установки. Значение свойства ALLUSERS со значением 1 указывает установку на компьютер.
Таблица InstallExecuteSequence (частично)
Действие | Condition | Sequence |
---|---|---|
Set_RegRoot_HKLM | ALLUSERS=1 | 1501 |
Следующие записи в таблице реестра выполняют регистрацию, если установлен компонент ProductComponent. Значение -1 в корневом поле требуется для регистрации в HKEY_LOCAL_MACHINE для установки на пользователя и в HKEY_CURRENT_USER для установки каждого пользователя. Запись с пустой строкой в поле реестра добавляет вложенный ключ для приложения в разделе реестра AppPaths и задает для значения "(Default)" полный путь исполняемого файла приложения. Регистрация MyAppPathAlias сопоставляет исполняемый файл с псевдонимом приложения и позволяет запускать приложение, если пользователь вводит псевдоним puapct в командной строке. Регистрация MyAppPathRegistration сопоставляет имя исполняемого файла с полным путем к файлу.
Реестр | Корневой | Ключ. | Имя. | Значение | Компонент |
---|---|---|---|---|---|
-1 | Software\Microsoft\MyAppPathRegistrationLocation | [RegRoot]\Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe | ProductComponent | ||
MyAppPathAlias | -1 | Software\Microsoft\Windows\CurrentVersion\App Paths\PUAPCT.exe | [#MyAppFile] | ProductComponent | |
MyAppPathRegistration | -1 | Software\Microsoft\Windows\CurrentVersion\App Paths\PUASample1.exe | [#MyAppFile] | ProductComponent |
Автоматическая регистрация отмены воспроизведения
PUASample.msi выполняет регистрацию, которая позволяет пользователю приложения запретить запуск аппаратного автозапуска для выбранных устройств. Сведения о регистрации обработчика для отмены автоматического воспроизведения в ответ на событие см. в разделе "Подготовка оборудования и программного обеспечения для использования с автозапуском" в разделе расширяемости оболочки руководства разработчика оболочки. Следующая запись регистрирует обработчик, указанный в поле Name при установке компонента ProductComponent. Значение -1 в корневом поле необходимо указать установщику Windows, что регистрация должна быть перенаправлена в расположение, которое зависит от контекста установки.
Реестр | Корневой | Ключ. | Имя. | Значение | Компонент |
---|---|---|---|---|---|
MyAutoplayCancelRegistration | -1 | SOFTWARE\Microsoft\Windows\CurrentVersion\Обозреватель\AutoplayHandlers\CancelAutoplay\CLSID | 66A32FE6-229D-427b-A608-D273F40C034C | ProductComponent |
Регистрация обработчика предварительной версии
PUASample.msi выполняет регистрации, необходимые для установки обработчика предварительной версии, который позволяет просматривать файлы pua только для чтения без запуска приложения. Сведения о регистрации обработчиков предварительной версии см. в разделе "Регистрация предварительных обработчиков предварительного просмотра" в разделе расширения оболочки руководства разработчика оболочки. Следующие записи в таблице реестра регистрируют обработчик при установке компонента ProductComponent. Значение -1 в корневом поле необходимо указать установщику Windows, что регистрация должна быть перенаправлена в расположение, которое зависит от контекста установки.
Реестр | Корневой | Ключ. | Имя. | Значение | Компонент |
---|---|---|---|---|---|
MyPreviewHandlerRegistration1 | -1 | Software\Classes\.pua | puafile | ProductComponent | |
MyPreviewHandlerRegistration2 | -1 | Software\Microsoft\Windows\CurrentVersion\PreviewHandlers | {1531d583-8375-4d3f-b5fb-d23bbd169f22} | Обработчик предварительной версии MICROSOFT Windows PUA TEST | ProductComponent |
MyPreviewHandlerRegistration3 | -1 | Software\Classes\puafile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f} | {1531d583-8375-4d3f-b5fb-d23bbd169f22} | ProductComponent | |
MyPreviewHandlerRegistration4 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | Пример 1 предварительного просмотра для каждого пользователя Applicationaton | ProductComponent | |
MyPreviewHandlerRegistration5 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | AppID | {6d2b5079-2f0b-48ddd-ab7f-97cec514d30b} | ProductComponent |
MyPreviewHandlerRegistration6 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | DisplayName | @shell32,-38242 | ProductComponent |
MyPreviewHandlerRegistration7 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22} | Icon | notepad.exe,2 | ProductComponent |
MyPreviewHandlerRegistration8 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | ThreadingModel | Квартира | ProductComponent |
MyPreviewHandlerRegistration9 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | #%%SystemRoot%\system32\shell32.dll | ProductComponent | |
MyPreviewHandlerRegistration10 | -1 | Software\Classes\CLSID\{1531d583-8375-4d3f-b5fb-d23bbd169f22}\InProcServer32 | ProgID | puafile | ProductComponent |