Поделиться через


Индексаторы для конкретных форматов MakePri.exe

В этом разделе описываются индексаторы, относящиеся к формату, используемые средством MakePri.exe для создания индекса ресурсов.

Примечание.

MakePri.exe устанавливается при проверке параметра windows SDK для управляемых приложений UWP при установке пакета средств разработки программного обеспечения Windows. Он устанавливается в путь %WindowsSdkDir%bin\<WindowsTargetPlatformVersion>\x64\makepri.exe (а также в папках с именем для других архитектур). Например, C:\Program Files (x86)\Windows Kits\10\bin\10.0.17713.0\x64\makepri.exe.

MakePri.exe обычно используется с newversionedкомандами или resourcepack командами. См . MakePri.exe параметры командной строки. В этих случаях он индексирует исходные файлы для создания индекса ресурсов. MakePri.exe использует различные отдельные индексаторы для чтения различных исходных файлов ресурсов или контейнеров для ресурсов. Самый простой индексатор — индексатор папок, который индексирует содержимое папки, например .jpg .png или изображения.

Индексаторы для конкретного формата определяются <indexer-config> путем указания элементов в <index> элементе файла конфигурации MakePri.exe. Атрибут type определяет используемый индексатор формата.

Контейнеры ресурсов, встречающиеся во время индексирования, обычно получают индексированные их содержимое, а не добавляются в сам индекс. Например, файлы, которые находит индексатор папок, .resjson могут быть индексированы индексатором .resjson , в этом случае .resjson сам файл не отображается в индексе. Обратите внимание на <indexer-config> элемент индексатора, связанного с этим контейнером, должен быть включен в файл конфигурации, чтобы это произошло.

Как правило, квалификаторы, найденные в сущности, содержащей сущность, например папку или .resw файл, применяются ко всем ресурсам в нем, таким как файлы в папке или строки в .resw файле.

Папка

Индексатор папок определяется атрибутом type FOLDER. Он индексирует содержимое папки и определяет квалификаторы ресурсов из папки и имен файлов. Его элемент конфигурации соответствует следующей схеме.

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="ExclusionTypeList">
        <xs:restriction base="xs:string">
            <xs:enumeration value="path"/>
            <xs:enumeration value="extension"/>
            <xs:enumeration value="name"/>
            <xs:enumeration value="tree"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="FolderExclusionType">
        <xs:attribute name="type" type="ExclusionTypeList" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
        <xs:attribute name="doNotTraverse" type="xs:boolean" use="required"/>
        <xs:attribute name="doNotIndex" type="xs:boolean" use="required"/>
    </xs:complexType>
    <xs:simpleType name="IndexerConfigFolderType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((f|F)(o|O)(l|L)(d|D)(e|E)(r|R))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="exclude" type="FolderExclusionType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="type" type="IndexerConfigFolderType" use="required"/>
            <xs:attribute name="foldernameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="filenameAsQualifier" type="xs:boolean" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Атрибут qualifierDelimiter задает символ, после которого квалификаторы указываются в имени файла, игнорируя расширение. Значение по умолчанию — ".".

PRI

Индексатор PRI определяется атрибутом type PRI. Он индексирует содержимое файла PRI. Обычно он используется при индексировании ресурса, содержащегося в другой сборке, библиотеке DLL, пакете SDK или библиотеке классов в PRI приложения.

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

<xs:schema id="prifile" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigPriType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((p|P)(r|R)(i|I))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigPriType" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

PriInfo

Индексатор PriInfo определяется атрибутом type PRIINFO. Он индексирует содержимое подробного файла дампа. Вы создаете подробный файл дампа, выполнив makepri dump этот /dt detailed параметр. Элемент конфигурации индексатора соответствует следующей схеме.

<xs:schema id="priinfo" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:simpleType name="IndexerConfigPriInfoType">
    <xs:restriction base="xs:string">
      <xs:pattern value="((p|P)(r|R)(i|I)(i|I)(n|N)(f|F)(o|O))"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="indexer-config">
    <xs:complexType>
      <xs:attribute name="type" type="IndexerConfigPriInfoType" use="required"/>
      <xs:attribute name="emitStrings" type="xs:boolean" use="optional"/>
      <xs:attribute name="emitPaths" type="xs:boolean" use="optional"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Этот элемент конфигурации позволяет необязательным атрибутам настроить поведение индексатора PriInfo. Значение emitStrings по умолчанию и emitPaths равно true. Если emitStrings затем кандидаты ресурсов с атрибутомtype, заданным значением String, будут включены в индекс, в противном случае они исключеныtrue. Если "emitPaths" является true то кандидаты ресурсов с атрибутом type , заданным как Path, включаются в индекс, в противном случае они исключены.

Ниже приведен пример конфигурации, которая включает типы ресурсов String, но пропускает типы ресурсов Path.

<indexer-config type="priinfo" emitStrings="true" emitPaths="false" />

Для индексирования файл дампа должен заканчиваться расширением .pri.xmlи должен соответствовать следующей схеме.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >
  <xs:simpleType name="candidateType">
    <xs:restriction base="xs:string">
      <xs:pattern value="Path|String"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="scopeType">
    <xs:sequence>
      <xs:element name="ResourceMapSubtree" type="scopeType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="NamedResource" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Decision" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:anyAttribute processContents="skip" />
              </xs:complexType>
            </xs:element>
            <xs:element name="Candidate" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="QualifierSet" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="Qualifier" minOccurs="0" maxOccurs="unbounded">
                          <xs:complexType>
                            <xs:attribute name="name" type="xs:string" use="required" />
                            <xs:attribute name="value" type="xs:string" use="required" />
                            <xs:attribute name="priority" type="xs:integer" use="required" />
                            <xs:attribute name="scoreAsDefault" type="xs:decimal" use="required" />
                            <xs:attribute name="index" type="xs:integer" use="required" />
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                      <xs:anyAttribute processContents="skip" />
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="Value" type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:attribute name="type" type="candidateType" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="name" use="required" type="xs:string" />
          <xs:anyAttribute processContents="skip" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" use="required" type="xs:string" />
    <xs:anyAttribute processContents="skip" />
  </xs:complexType>
  <xs:element name="PriInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="PriHeader" >
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs ="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
        <xs:element name="QualifierInfo">
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="ResourceMap">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="VersionInfo">
                <xs:complexType>
                  <xs:anyAttribute processContents="skip" />
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="ResourceMapSubtree" type="scopeType" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:anyAttribute processContents="skip" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

MakePri.exe поддерживает типы дампов "Базовый", "Подробный", "Схема" и "Сводка". Чтобы настроить MakePri.exe для отправки типа дампа, считываемого индексатором PriInfo, при использовании dump команды включите параметр /DumpType Detailed.

Несколько элементов .pri.xml файла пропускаются MakePri.exe. Эти элементы вычисляются во время индексирования или указываются в файле конфигурации MakePri.exe. Имена ресурсов, квалификаторы и значения, содержащиеся в файле дампа, хранятся непосредственно в новом файле PRI. Однако карта ресурсов верхнего уровня не поддерживается в окончательном PRI. Карты ресурсов объединяются в рамках индексирования.

Это пример допустимого ресурса типа строки из файла дампа.

<NamedResource name="SampleString " index="96" uri="ms-resource://SampleApp/resources/SampleString ">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
  </Decision>
  <Candidate type="String">
    <QualifierSet index="1">
      <Qualifier name="Language" value="EN-US" priority="900" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>A Sample String Value</Value>
  </Candidate>
</NamedResource>

Это пример допустимого ресурса типа пути с двумя кандидатами из файла дампа.

<NamedResource name="Sample.png" index="77" uri="ms-resource://SampleApp/Files/Images/Sample.png">
  <Decision index="2">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="0.7" index="2"/>
    </QualifierSet>
  </Decision>
  <Candidate type="Path">
    <QualifierSet index="1">
      <Qualifier name="Scale" value="180" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-180.png</Value>
  </Candidate>
  <Candidate type="Path">
    <QualifierSet index="2">
      <Qualifier name="Scale" value="140" priority="500" scoreAsDefault="1.0" index="1"/>
    </QualifierSet>
    <Value>Images\Sample.scale-140.png</Value>
  </Candidate>
</NamedResource>

ResFiles

Индексатор ResFiles определяется атрибутом type RESFILES. Он индексирует содержимое .resfiles файла. Его элемент конфигурации соответствует следующей схеме.

<xs:schema id="resx" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResFilesType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(f|F)(i|I)(l|L)(e|E)(s|S))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResFilesType" use="required"/>
            <xs:attribute name="qualifierDelimiter" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

.resfiles Файл — это текстовый файл, содержащий неструктурированный список путей к файлам. Файл .resfiles может содержать примечания "/". Рассмотрим пример.

Strings\component1\fr\elements.resjson
Images\logo.scale-100.png
Images\logo.scale-140.png
Images\logo.scale-180.png

ResJSON

Индексатор ResJSON определяется атрибутом type RESJSON. Он индексирует содержимое .resjson файла, который является строковым файлом ресурсов. Его элемент конфигурации соответствует следующей схеме.

<xs:schema id="resjson" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResJsonType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(j|J)(s|S)(o|O)(n|N))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResJsonType" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Файл .resjson содержит текст JSON (см . тип носителя application/json для нотации объектов JavaScript (JSON)). Файл должен содержать один объект JSON с иерархическими свойствами. Каждое свойство должно быть другим объектом JSON или строковым значением.

Свойства JSON с именами, начинающимися с подчеркивания ("_"), не компилируются в окончательный файл PRI, но сохраняются в файле журнала.

Файл также может содержать комментарии "/", которые игнорируются во время синтаксического анализа.

Атрибут initialPath помещает все ресурсы в этот начальный путь путем присвоить ему имя ресурса. Обычно это используется при индексировании ресурсов библиотеки классов. Значение по умолчанию — пусто.

ResW

Индексатор ResW определяется атрибутом type RESW. Он индексирует содержимое .resw файла, который является строковым файлом ресурсов. Его элемент конфигурации соответствует следующей схеме.

<xs:schema id="resw" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="IndexerConfigResxType">
        <xs:restriction base="xs:string">
            <xs:pattern value="((r|R)(e|E)(s|S)(w|W))"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="indexer-config">
        <xs:complexType>
            <xs:attribute name="type" type="IndexerConfigResxType" use="required"/>
            <xs:attribute name="convertDotsToSlashes" type="xs:boolean" use="required"/>
            <xs:attribute name="initialPath" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

Файл .resw — это XML-файл, соответствующий следующей схеме.

  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>

Атрибут convertDotsToSlashes преобразует все символы точки (".") в именах ресурсов (атрибуты имени элемента данных) в косую черту "/", за исключением случаев, когда символы точки находятся между "[" и "]".

Атрибут initialPath помещает все ресурсы в этот начальный путь путем присвоить ему имя ресурса. Обычно это используется при индексировании ресурсов библиотеки классов. Значение по умолчанию — пусто.